幾何学的オブジェクトを四分木(または八分木)に配置する場合、いくつかの方法で単一ノードよりも大きなオブジェクトを配置できます。
- オブジェクトの参照を、それが含まれるすべての葉に配置する
- オブジェクトの参照を、それが完全に含まれる最も深いノードに配置する
- #1と#2の両方
例えば:
この画像では、4つのリーフノードすべてに(方法#1)、ルートノードのみに(方法#2)、または両方に(方法#3)円を配置できます。
クワッドツリーを照会するために、どの方法がより一般的で、なぜですか?
幾何学的オブジェクトを四分木(または八分木)に配置する場合、いくつかの方法で単一ノードよりも大きなオブジェクトを配置できます。
例えば:
この画像では、4つのリーフノードすべてに(方法#1)、ルートノードのみに(方法#2)、または両方に(方法#3)円を配置できます。
クワッドツリーを照会するために、どの方法がより一般的で、なぜですか?
回答:
オブジェクト自体ではなく、参照を保存していると仮定すると、アプリケーションに応じて異なる方法で保存するのが理にかなっています。
たとえば、この(実線)円との衝突を計算していて、左下隅で衝突が発生している場合、その葉からその葉のすべてのジオメトリに直接アクセスできれば簡単です(方法#3) (ツリーを上方向にトラバースし、継承されたジオメトリを決定する必要はありません)。しかし、ジオメトリの描画にクワッドツリーを使用しているだけで、完全に含まれているノードに何かを描画するのが理にかなっているため、方法#1を使用したいとします(どの部分を見つけるのがより難しいでしょう)各葉ノードとどこに描画するか)。
より一般的なことについては、四分木での私の唯一の経験は、幾何学的オブジェクトが実際には面積のない点であるn体シミュレーションを書くことであるため、明確に答えることはできません。
Quadtreeの利点の1つは、すべての子ノードに同じ情報が含まれる場合、ノードを子ノードに分割する必要がないことです。これにより多くのメモリを節約でき、処理を高速化できます。
この原則に従って、ルートノードにのみ保存する方が理にかなっていると思います(方法#2)。それはあなたに多くのメモリを節約することができ、処理も簡単になると思います。たとえば、3つのリーフノードを通る線と円の交差点を見つけようとした場合、リーフノードごとに個別に交差点を計算するか、すでにこの円と交差していることを覚えておく必要があります。
一方、リーフノードにオブジェクトがある場合、誤検出(正しいノードにあるため交差するかどうかを確認する必要があるが、実際には交差しないオブジェクト)を排除するのに役立ちます。
したがって、どちらのアプローチにも用途があると思います。どちらを使用するかを選択する方法はわかりません。
私はおそらく、アプローチ3を使用しないでしょう。