この種の問題を解決する方法は数多くあり、それぞれに長所と短所があります。それらのいくつかを次に示します。
四角形のペアの交点 + 面積の合計
四角形のすべてのペアを見てください。2 つの四角形が交差する場合は、重なりがあります。長方形の領域を合計し、合計がキャンバス領域と一致するかどうかを確認します。領域が一致しない場合は、ギャップがあります。
ペインティング
これはあなたが言及したアプローチです: キャンバスの寸法を持つ 2D 配列を作成します。次に、長方形を繰り返し処理し、それらを配列に「ペイント」します。
このアプローチの最適化の 1 つは座標圧縮です。長方形 [(10,20), (15,25)] と [(7,3), (15, 25)] があるとします。個別の x 座標 (7, 10, 15) を見て (0, 1, 2) に再マッピングし、個別の y 座標 (3, 20, 25) に再マッピングして (0, 1, 2)。次に、長方形 [(1, 1), (2, 2)] および [(0,0), (2,2)] が残るため、26x26 ではなく、3x3 配列のみが必要です。配列。
スイープ ライン アルゴリズム
左から右にラインをスイープし、「興味深い」ポイントで停止し、占有されているエリアを追跡します。
2D レンジ ツリー
長方形の範囲に対して効率的にクエリを実行できるデータ構造。
どちらを選ぶ?
それは、あなたが持っている四角形の数、それらが領域にどのように分布しているか、あなたのアルゴリズムがどれくらい速くなければならないか、あなたが引き受ける複雑さなどに依存します.私が言及した最初の2つのアルゴリズムは、後者よりもはるかに単純です. 2 つなので、そこから始めることをお勧めします。
より詳しい情報
これらのアルゴリズムについて詳しく知りたい場合は、オンラインで「rectangle union」を検索してみてください。最も効率的なソリューションは、スイープ ライン アルゴリズムです。
以下は、スイープ ライン アルゴリズムに関する参考資料です。
- 重なり合う長方形の領域を見つけるための効率的なアルゴリズムは何ですか
- http://compgeom.cs.uiuc.edu/~jeffe/open/klee.html
- JL Bentley、クレーの長方形問題のアルゴリズム。未発表のメモ、カーネギー メロン大学コンピューター サイエンス学部、1977 年
参考文献 3. は、通常、長方形和集合のライン スイープ アルゴリズムの元のソースとして提供されますが、おそらく「未公開」であるため、実際にオンラインで論文を見つけられなかったことを認めなければなりません...