2013-04-21 2 views
0

Я пытаюсь написать метод, который вернет индекс точки, ближайшей к другой точке в трехмерном пространстве. Точки хранятся в KD-дереве, и я сравниваю их с точкой p, которая является параметром моего метода. Вот метод:Поиск первого элемента с определенным расстоянием

public int NearestPointWithDistance(KDnnTreeNode node, Point p, Double distance){ 
    int index = -1; 
    if(node == null){ 
    return -1; 
    }else{ 
     double[] point_coordinates = data[node.eltIndex]; 
     Point q = new Point(point_coordinates[0],point_coordinates[1], point_coordinates[2]); 
     if(KDnnTree.distance(p, q) == distance){ 
      return index; 
     } 

     if(node.left != null){ 
      final int left_child = NearestPointWithDistance(node.left, p, distance); 
     } 
     if(node.right != null){ 
      final int right_child = NearestPointWithDistance(node.right, p, distance); 
     } 
    } 
    return index; 

}

Проблема заключается в том, не может быть несколько точек с одинаковым расстоянием. В результате я получаю список индексов точек (см. Ниже), но я хочу только первый элемент списка (в приведенном ниже примере это будет номер 54510).

54510 
54511 
54512 
54514 
54518 
54526 
54543 
54577 
65355 
76175 
54482 
54416 
54278 
21929 
54001 
74323 

Я знаю, что это не способ поиска два закрывает пункты в KD дерево, но я хотел бы попробовать этот путь первым.

+0

Вы должны сравнить результат с левой и правой и принимать только один. – BobTheBuilder

ответ

0

Не используйте java.lang.Double в качестве аргумента. Используйте double.

Причина в том, что если ваш KDNTree.distance() также вернется Double, вы закончите сравнение ссылок объектов, а не их значений.

У вас довольно неудобный API. Во всяком случае, сделать вспомогательную функцию:

public Point getNodePoint(Node node) 
{ 
    double[] point_coordinates = data[node.eltIndex]; 
    return new Point(point_coordinates[0],point_coordinates[1], point_coordinates[2]); 
} 

Используйте лучшие выборы расстояние availabale:

double result = KDnnTree.distance(p, q); 
if (result == distance) 
{ 
    return node.eltIndex; 
} 
index = node.eltIndex; // assume given node is best 
if (node.left != null) 
{ 
    final int left_child = NearestPointWithDistance(node.left, p, distance); 
    double left_distance = KDnnTree.distance(p, getNodePoint(left_child); 

    if (Math.abs(distance - result) > Math.abs(distance - left_distance)) 
    { 
     // result given is closer to wanted point 
     result = left_distance; 
     index = left_child; 
    } 
} 
if (node.right != null) 
{ 
    final int right_child = NearestPointWithDistance(node.right, p, distance); 
    double right_distance = KDnnTree.distance(p, getNodePoint(right_child); 

    if (Math.abs(distance - result) > Math.abs(distance - right_distance)) 
    { 
     // result given is closer to wanted point 
     result = right_distance; 
     index = right_child; 
    } 
} 
return index; 
Смежные вопросы