四分木を実装しています。このデータ構造を知らない人のために、次の小さな説明を含めます。
クワッドツリーはデータ構造であり、3次元空間でのオクトリーと同じようにユークリッド平面にあります。クワッドツリーの一般的な用途は、空間インデックスです。
それらがどのように機能するかを要約すると、クワッドツリーは、最大容量と初期バウンディングボックスを持つコレクションです(ここでは長方形としましょう)。最大容量に達したクワッドツリーに要素を挿入しようとすると、クワッドツリーは4つのクワッドツリーに分割されます(その幾何学的表現は、挿入前のツリーの4分の1の面積になります)。各要素は、その位置に応じてサブツリーに再配布されます。長方形を操作するときの左上の境界。
したがって、クワッドツリーはリーフであり、その容量よりも要素が少ないか、4つのクワッドツリーを子として持つツリー(通常、北西、北東、南西、南東)です。
私の懸念は、重複を追加しようとした場合、同じ要素が数回または同じ位置にあるいくつかの異なる要素である場合、四分木はエッジの処理に根本的な問題があることです。
たとえば、容量が1の四分木と、境界ボックスとして単位長方形を使用する場合:
[(0,0),(0,1),(1,1),(1,0)]
そして、左上の境界が原点である長方形を2回挿入しようとします(または、N> 1の容量を持つ四分木にN + 1回挿入しようとした場合も同様です)。
quadtree->insert(0.0, 0.0, 0.1, 0.1)
quadtree->insert(0.0, 0.0, 0.1, 0.1)
最初の挿入は問題になりません:
ただし、最初の挿入でサブディビジョンがトリガーされます(容量が1であるため)。
したがって、両方の長方形は同じサブツリーに配置されます。
次に、2つの要素が同じ四分木に到着し、サブディビジョンをトリガーします…
以下同様に、サブディビジョンメソッドは無期限に実行されます。なぜなら、(0、0)は、作成された4つのうち常に同じサブツリーにあるため、無限再帰問題が発生するためです。
重複した四分木を持つことは可能ですか?(そうでない場合、それをとして実装できますSet
)
四分木のアーキテクチャを完全に壊すことなく、この問題をどのように解決できますか?