1 つの座標を取得できない場合: 座標の x、y ペアのハッシュを提案できます。Post は、 と同様に、衝突の少ないハッシュを提案しhash = ( y << 16 ) ^ x;
ます。
しかし、x または y のデータ wrt 値にアクセスしたいとします。ポイントを格納し、効率的に操作を実行するための構造は、ポイント QTree または Quad Tree です。ここ を参照してください。
ポイント四分木は、2 次元のポイント データを表すために使用されるバイナリ ツリーを適応させたものです。すべての四分木の機能を共有しますが、サブディビジョンの中心が常に点にあるため、真のツリーです。
点四分木のノードは二分木のノードに似ていますが、主な違いは、通常の二分木のように 2 つ (「左」と「右」) ではなく、4 つのポインター (各象限に 1 つ) を持つことです。 . また、キーは通常、x 座標と y 座標を参照して 2 つの部分に分解されます。したがって、ノードには次の情報が含まれます。 4 つのポインター: quad['NW']、quad['NE']、quad['SW']、および quad['SE'] ポイント。これには次のものが含まれます。通常、x、y 座標値として表されます。たとえば、名前
次に、AABB 範囲内のすべての点を照会するための再帰関数を使用できます。この実装を適応させることができますQueryRange()
class QuadTree
{
function queryRange(AABB range)
{
Array of XY pointsInRange; // Prepare an array of results
// Check objects at this quad level
for (int p := 0; p < points.size; p++)
{
if (range.containsPoint(points[p]))
pointsInRange.append(points[p]);
}
pointsInRange.appendArray(northWest->queryRange(range));
pointsInRange.appendArray(northEast->queryRange(range));
pointsInRange.appendArray(southWest->queryRange(range));
pointsInRange.appendArray(southEast->queryRange(range));
return pointsInRange;
}
}