アルゴリズムのウィキペディアの説明を自分で理解するのに少し時間を費やし、役立つかもしれない次の Python 実装を思いつきました: https://gist.github.com/863301
の最初のフェーズはclosest_point
、最も一致する葉ノードを見つける単純な深さ優先検索です。
見つかった最良のノードをコール スタックに戻すだけでなく、第 2 フェーズで「離れた」側に近いノードがあるかどうかを確認します: (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
最も一致するノードがこの 2 番目のテストに渡されるため、分岐を完全にトラバーサルする必要はなく、間違った軌道に乗っている場合はすぐに停止します (「近い」子ノードに到達するまで、「近い」子ノードを下っていくだけです)。葉。)
p
点とノードを介して空間を分割する線との間の距離を計算するにはn
、軸がすべて直交 (水平または垂直) であるため、適切な座標をコピーすることにより、点を軸に単純に「投影」できます。