ja po prostu spędzić trochę czasu zagadkowe opis algorytmu Wikipedia siebie, i wprowadzono następującą implementację Pythona, która może pomóc: https://gist.github.com/863301
Pierwsza faza closest_point
to proste pierwsze wyszukiwanie głębi, aby znaleźć najlepiej pasujący węzeł liści.
Zamiast po prostu powrocie najlepszy węzeł powrot górę stosu wywołań, drugi sprawdza fazowe aby sprawdzić, czy nie może być bliżej węzła na „Away” z boku: (ASCII schemacie sztuki)
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
Bieżący węzeł n
dzieli przestrzeń wzdłuż linii, więc wystarczy spojrzeć na stronę "od hotelu", jeśli "błąd" między punktem p
a najlepszym dopasowaniem b
jest większy niż odległość od punktu p
i linia jest jednak równa n
. Jeśli tak, to sprawdzamy, czy są jakieś punkty na stronie "z dala", które są bliżej.
Ponieważ nasz najlepszy węzeł dopasowujący jest przekazywany do tego drugiego testu, nie musi wykonywać pełnego przejścia gałęzi i zatrzyma się dość szybko, jeśli znajduje się na niewłaściwym torze (tylko zmierza w stronę "pobliskich" węzłów potomnych dopóki nie uderzy w liść).
Aby obliczyć odległość między punktem p
a linią dzielącą przestrzeń przez węzeł n
, możemy po prostu "rzutować" punkt w dół na oś, kopiując odpowiednią współrzędną jako osie są wszystkie ortogonalne (poziome lub pionowe).
Czy kliknąłeś animację po prawej stronie algorytmu "najbliższego sąsiada"? Oglądanie tego może sprawić, że napisany opis będzie wyraźniejszy. – unutbu