私は、マルチスケール グリッド アプローチを使用します (何らかの形で四分木に相当します)。
整数座標 (つまりピクセル) を使用していて、すべてのピクセルを保持する十分なスペースがあると仮定しています。
各ピクセルに 1 つずつ、長方形のリストの配列があります。次に、2 つずつビンに入れ、もう一度実行します。すべてをカバーする 1 つのピクセルができるまで、何度も何度も何度も繰り返します。
ここで重要なのは、四角形のサイズにぴったりのレベルで四角形を挿入することです。これは (ピクセル サイズ) ~= min(高さ,幅)/2 のようなものになります。これで、各長方形に対して、リストに挿入する必要があるのはほんの一握りです (たとえば、4 から 16 ピクセルの間のものを選択するなど、定数で上にバインドできます)。
x、y ですべての長方形を探したい場合は、最小のピクセルのリストを調べてから、それを含む 2x2 ビニングされたピクセルのリストを調べ、次に 4x4 などを調べます。調べるには log2(ピクセル数) のステップが必要です。(ピクセルが大きい場合は、(x,y) が実際に四角形内にあるかどうかを確認する必要があります。それらの約半分が境界線で成功し、すべてが四角形内で成功すると予想されるため、ピクセルを直接調べた場合よりも 2 倍以上の作業になります。)
では、インサートはどうでしょうか。それは非常に安価です--リストの先頭に自分を固執するのにO(1)。
削除はどうですか?それはより高価です。入力したピクセルごとに各リストを調べて修復する必要があります。これは、空間内のその位置で重なり合う長方形の数が約 O(n) であり、ほぼ同じサイズです。非常に多数の長方形がある場合は、他のデータ構造を使用してそれらを保持する必要があります (ハッシュ セット、RB ツリーなど)。
(最小の四角形がピクセルよりも大きくなければならない場合、実際にマルチスケール構造をピクセル レベルまで完全に形成する必要はないことに注意してください。最小の四角形がビニングされたピクセル内で絶望的に失われないようになるまで、下に移動してください。 .)