空間ハッシュよりも四分木が望ましいのはいつですか?


12

同時に多くのオブジェクトを含む2Dプラットフォーマーを作成しています。これらはすべて、AABB衝突が検出されたものです。チェックするオブジェクトの数を減らすために最初に四分木を試し、いくつかの異なる構成を試しましたが、必要なほど効果的ではありませんでした。私は空間ハッシュを実装しましたが、それはより効率的です。各衝突をチェックするオブジェクトの数は劇的に減少しました。

空間ハッシングよりもクワッドツリーを使用して2D衝突検出を行うことが望ましい場合はありますか?私のテストによると、空間ハッシュは常に衝突のテスト対象となるオブジェクトが少なくなるように思われますか?

私はアルゴリズムでタイミングをとっていませんが、たとえばCでコーディングしている場合、ハッシュは非常に高価であるか、実装するのが難しいですか?注目に値するのは、私がゲームをJavaScriptで書いていることです。この場合、ハッシュは「無料」です。

ここに比較があります、何か見落としましたか?http://zufallsgenerator.github.io/2014/01/26/visually-comparing-algorithms/

回答:


12

クワッドツリーの主な利点は、バケットのグループ全体を検討から迅速に破棄できることです。

たとえば、6つのレベルを持つ四分木があるとします。最低レベルでは、32x32ボックスです。その最下部の最も詳細なレベルを構成する1024個のボックス。比較のために、「空間ハッシュ」も考慮します。これは、32x32ボックス、合計1024ボックスも含むフラットグリッドです。(クワッドツリーには、その上位レベルに大きなボックスも含まれているため、合計で1024を超えるボックスがあります)

システムに衝突可能なオブジェクトがないと仮定しましょう-クワッドツリーのすべてのボックスとフラットグリッドは完全に空です。

バウンディングボックスがそれらのすべてのボックスと交差するのに十分な大きさの衝突をテストしていて、フラットグリッドを使用している場合は、1024個のボックスを1つずつチェックして、そこに何かがあるかどうかを確認する必要があります。それら。

しかし、ネストされた四角形ツリーを使用している場合、最上位レベルでは、システムに他のオブジェクトがないことがわかります。そのため、その単一のボックスを見るだけで、衝突を見つけることがないことを知ることができます。ツリーのさらに深いところ-すぐにテストを停止できます。

同様に、オブジェクトがクワッドツリーの特定の領域にのみ存在する場合、クワッドツリーは関連する可能性のあるボックスのみを検索しますが、グリッドでは、交差するすべてのボックスをチェックする必要があります。事前に知る方法がないためです。どのグリッドにオブジェクトが含まれるか。クワッドツリーの多くが空で、大きくて複雑なクエリ(たとえば、小さくて単純な長方形ではなく巨大なカメラ錐台)を実行している場合、次の操作を行うと、合計ではるかに少ないボックスを反復していることがわかります。フラットグリッドではなく、ツリー構造を使用して何かに対してテストします。そして、それは大きな違いを生むことができます。

もちろん、これらすべてがツリー構造が常に正しい選択であることを意味するものではありません。フラットグリッドは、例にある状況に理想的です。オブジェクトの密集した雲は、世界のいたるところにほぼ均等に広がっており、簡単で安価な衝突テストを行っています。その場合は、グリッドが最適なアプローチとなる可能性があります。


5
非常に怠惰なための簡潔な要約:Quadtreeは、異なるサイズのオブジェクトをより速く処理します。
Anko

ありがとう、これは素晴らしい答えです!オブジェクトの均一なサイズは私が疑ったものでした。
クリス

実際、通常、レベルはそのレベルの境界内に完全に収まり、下位レベルには収まらないオブジェクトに関する情報のみを保持するため、通常、クワッドツリーのすべてのレベルを検索してオブジェクトがないかどうかを確認する必要があります。
マルチ

1
@maltheこの種類のクエリでは早期に実行できない四分木実装の使用を主張する場合は、代わりに空間ハッシュを絶対に使用してください。メモリコストの33%を節約できますし、それでも何のメリットもありません。または、アイデアの純粋さをほんの少し緩め、各ノードに子のエンティティの数を追跡させるか、空のノードが存在するようなスパースクワッドツリーを使用して、早期にクワッドツリーを使用することもできます必要になるまで、ツリーからリンク解除されます。実は。5年以上後。
Trevor Powell、

@TrevorPowellもちろんです。私はただあなたが単一の箱を見さえすればよいというあなたの保証を失った。あなたはそれらの数を追求しなければならないので、これは真実ではありません。私の知る限り、ツリーの上位と下位で衝突を見つけることができます。
マルチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.