Я просто провести некоторое время озадачивает вне Wikipedia описания алгоритма сам, и придумал следующую реализацию Python, которая может помочь: https://gist.github.com/863301
Первая фаза closest_point
- это простой поиск по глубине, чтобы найти наилучший совпадающий листовой узел.
Вместо того, чтобы просто вернув лучший узел, найденный обратно стек вызовов, на втором этапе проверки, чтобы убедиться, что не может быть ближе узел на «расстоянии» побочной: (диаграмма ASCII искусства)
n current node
b | best match so far
| p | point we're looking for
|< >| | error
|< >| distance to "away" side
|< | >| error "sphere" extends to "away" side
| x possible better match on the "away" side
Текущий узел n
разделяет пространство вдоль линии, поэтому нам нужно только взглянуть на «прочь», если «ошибка» между точкой p
и наилучшим соответствием b
больше, чем расстояние от точки p
и линия, хотя n
, Если это так, то мы проверяем, есть ли какие-либо точки на стороне «прочь», которые ближе.
Поскольку наш лучший совпадающий узел передан в этот второй тест, ему не нужно делать полный обход ветки и будет довольно быстро останавливаться, если он находится на неправильном пути (только заголовок вниз «рядом» с дочерними узлами пока он не ударит по листу.)
Чтобы вычислить расстояние между точкой p
и линией, разделяющей пространство через узел n
, мы можем просто «проецировать» точку вниз на ось, скопировав соответствующую координату в качестве осей все ортогональные (горизонтальные или вертикальные).
Вы нажимали на анимацию справа от алгоритма поиска ближайшего соседа? Наблюдение за этим может сделать письменное описание более ясным. – unutbu