クワッドツリーはゲームにとって理想的なデータ構造であると言われましたが、クワッドツリー内でシェイプがどのように機能するかを正確に理解できません。
私はこれをJavaScriptで行っていますが、これらの質問はどの言語の四分木にも当てはまると思います。
基本的な(x、y)ポイントとポイント挿入が四分木でどのように機能するか、そして紙の上でそれを実行できることはほぼ理解していると思います。
ここにあるJSfiddle私はポイントを試してのは。
1つのケースを除いて、ポイントを使用した私のテストは期待どおりに機能しています。
しかし、私の混乱は、長方形のような形状が関係しているときに始まります。形状のある四角形ツリーから取得する場合、形状の各ポイントと、それらがどのノードに分類されるかをチェックしますか?また、各図形の(x、y、width、height)パラメーターを受け入れる場合、図形の挿入はどのように機能しますか?開始点からの幅/高さを使用して他のコーナーポイントを計算してから、適切なノードに分配しますか?挿入された形状が4つのノードにまたがる場合、その形状のデータは4つのノードすべてに保存されますか?
そして、検索メソッドが形状をパラメーター(x、y、width、height)として受け入れる場合、実際には何が行われているのでしょうか。挿入する場合、シェイプがどのノードにまたがるかを最初に確認してから、それらのノードのすべてのオブジェクトを取得しますか?
私はJSfiddleで形状を処理していますが、テストの結果に完全に混乱しています。重複したオブジェクトが返されます!
たとえば、赤い四角は、私の検索メソッドに入力しているパラメーターに相当する描画です。この赤い四角は4つのノードすべてにまたがるので、四角ツリーのすべてのオブジェクトを返すはずだと思います。しかし、そうではなく、私はそれが何を返すかを合理化するのに苦労しています。現在コメントアウトされている他のテストがいくつかありますが、コメントを外して実行すると、さらに混乱する結果を確認できます。
とはいえ、四分木のすべてのポイントを返す場合、どうすればよいですか?境界全体のサイズの形状を使用する取得メソッド?たとえば、retrieve(0、0、canvas.width、canvas.height)?
JavaScriptの四分木ライブラリ私が使用していますので、私は実際の実装が正しいと評判であると仮定し、様々な他のソースによって参照されています。
私の混乱の多くは、四分木の用語の誤解から生じていると思います。同様に、「ポイント」にも幅/高さのパラメーターがある場合、なぜ彼らは寸法ではなく境界と言うのですか?それは慣習/速記の問題ですか、それとも完全に異なる概念ですか?
御時間ありがとうございます!
_stuckChildren
コード内のフィールド。これは、「境界付きのアイテムを取得する」サンプルでも確認できます。クリックしたノードの境界にまたがるノードがルートノードに至るまで、常に赤で強調表示されます。