私は単純なGUIライブラリを作成しており、マウスイベント中にどのオブジェクトが相互作用するかを決定するためにクォードツリーを使用しています。私はgithub上のいくつかのquadtreeライブラリを調べていましたが、それらはすべてquadtreeに長方形のオブジェクトを追加する方法を含んでいました。 方法は、すべてのケースでは、単に矩形が与えられた四分木と交差かどうかチェック:Quadtrees:単純なケースを処理できない共通の交差メソッド
return quadtree.x2 >= rect.x1
and quadtree.x1 <= rect.x2
and quadtree.y2 >= rect.y1
and quadtree.y1 <= rect.y2
しかし、これは最も単純な例の一つで、不要な結果を与える:100x100の正方形の領域を想像してみてください。座標(0,0)、(0,50)、(50,0)、(50,50)の領域に4つの50x50四角いオブジェクトを配置します。これらのオブジェクトが1つのオブジェクトの最大容量を持つ100×100クォッド・ツリーに配置されていれば、四分木の最初のレイヤーが分割され、4つの結果ツリーがそれぞれ正方形の1つを正確に含むことが視覚的に予想されます。
私は正方形の中に配置されたツリーを決定するために上記の方法を使用する場合は、しかし、私は、各オブジェクトは、すべての4本の木と交差することを見つけます。これにより、各樹木は最大深度に達するまで迅速に分割される。
私はこれを回避するために見る唯一の方法は、2つのチェックを使用することです:。
return (quadtree.x2 > rect.x1
and quadtree.x1 < rect.x2
and quadtree.y2 > rect.y1
and quadtree.y1 < rect.y2)
or (quadtree.x2 == rect.x1
and quadtree.x1 == rect.x2
and quadtree.y2 == rect.y1
and quadtree.y1 == rect.y2)
を(最も簡単な場合には大規模なオブジェクトがために、以来、バウンディングボックス内に表示しなければならないであろうたとえば、座標(0,0)、w = 100、h = 100のオブジェクトも左上のクォッドツリーに属します)。
また、四角形と四角形の重なりを計算してそれは非ゼロです。
何か不足していますか?これはquadtreeのための理想的な状況であるはずですが、ほとんどの実装では、それは大きな混乱です。