クワッドツリーに大きな幾何学的オブジェクトを保存するのにどの方法が適していますか?


15

幾何学的オブジェクトを四分木(または八分木)に配置する場合、いくつかの方法で単一ノードよりも大きなオブジェクトを配置できます。

  1. オブジェクトの参照を、それが含まれるすべての葉に配置する
  2. オブジェクトの参照を、それが完全に含まれる最も深いノードに配置する
  3. #1と#2の両方

例えば:

ここに画像の説明を入力してください

この画像では、4つのリーフノードすべてに(方法#1)、ルートノードのみに(方法#2)、または両方に(方法#3)円を配置できます。

クワッドツリーを照会するために、どの方法がより一般的で、なぜですか?


1
確かにそれは参考になるはずです。クワッドツリーを照会する目的で、リーフ、非リーフ、またはその両方に参照があるかどうかを尋ねるつもりです。
-nsantorello

PS質問の意図をより明確にするために編集されました。
-nsantorello

サポートしようとしているクエリは何ですか?
ジョー

@Joe私は特に衝突検出、空間インデックス、および領域/錐台カリングに興味があります。
nsantorello

1
@nsantorelloルールは、あなたがサポートしたいそれらのクエリのどのによって異なるかもしれないが、これは衝突検出のために非常に関連すると思われる:stackoverflow.com/questions/4434335/...
ジョー・

回答:


8

オブジェクト自体ではなく、参照を保存していると仮定すると、アプリケーションに応じて異なる方法で保存するのが理にかなっています。

たとえば、この(実線)円との衝突を計算していて、左下隅で衝突が発生している場合、その葉からその葉のすべてのジオメトリに直接アクセスできれば簡単です(方法#3) (ツリーを上方向にトラバースし、継承されたジオメトリを決定する必要はありません)。しかし、ジオメトリの描画にクワッドツリーを使用しているだけで、完全に含まれているノードに何かを描画するのが理にかなっているため、方法#1を使用したいとします(どの部分を見つけるのがより難しいでしょう)各葉ノードとどこに描画するか)。

より一般的なことについては、四分木での私の唯一の経験は、幾何学的オブジェクトが実際には面積のない点であるn体シミュレーションを書くことであるため、明確に答えることはできません。


Rafeに感謝します。アプリケーションに依存するのは正しいと思います。
nsantorello

6

Quadtreeの利点の1つは、すべての子ノードに同じ情報が含まれる場合、ノードを子ノードに分割する必要がないことです。これにより多くのメモリを節約でき、処理を高速化できます。

この原則に従って、ルートノードにのみ保存する方が理にかなっていると思います(方法#2)。それはあなたに多くのメモリを節約することができ、処理も簡単になると思います。たとえば、3つのリーフノードを通る線と円の交差点を見つけようとした場合、リーフノードごとに個別に交差点を計算するか、すでにこの円と交差していることを覚えておく必要があります。

一方、リーフノードにオブジェクトがある場合、誤検出(正しいノードにあるため交差するかどうかを確認する必要があるが、実際には交差しないオブジェクト)を排除するのに役立ちます。

したがって、どちらのアプローチにも用途があると思います。どちらを使用するかを選択する方法はわかりません。

私はおそらく、アプローチ3を使用しないでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.