Ho appena passare un po 'di tempo sconcertante out la descrizione Wikipedia dell'algoritmo me stesso, e ha trovato la seguente implementazione Python che può aiutare: https://gist.github.com/863301
La prima fase di closest_point
è una semplice prima ricerca di profondità per trovare il miglior nodo foglia corrispondente.
Invece di limitarsi a restituire il miglior nodo ritrovato lo stack di chiamate, un secondo controllo di fase per vedere se ci potrebbe essere un nodo più vicino sul lato "via": (diagramma ASCII art)
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
Il nodo corrente n
divide lo spazio lungo una linea, quindi dobbiamo solo cercare sul lato "lontano" se l'"errore" tra il punto p
e la corrispondenza migliore b
è maggiore della distanza dal punto p
e la linea è n
. Se lo è, quindi controlliamo se ci sono punti sul lato "lontano" che sono più vicini.
Poiché il nostro miglior nodo di corrispondenza è passato in questo secondo test, non deve fare un attraversamento completo del ramo e si fermerà abbastanza rapidamente se si trova sulla traccia sbagliata (solo dirigendosi verso il basso nei "vicini" nodi figli
Per calcolare la distanza tra il punto p
e la linea che divide lo spazio attraverso il nodo n
, possiamo semplicemente "proiettare" il punto verso il basso sull'asse copiando la coordinata appropriata come gli assi sono tutti ortogonali (orizzontali o verticali).
Hai fatto clic sull'animazione a destra dell'algoritmo "ricerca vicino più vicino"? Guardarlo potrebbe rendere più chiara la descrizione scritta. – unutbu