このタイプの問題を解決するには、賛否両論の異なるアプローチがあります。ここではそのうちのいくつかされています。長方形のすべてのペアで
長方形ペア交差点+エリア和
ルック - 2つの矩形が交差する場合、重複があります。矩形領域を追加し、合計がキャンバス領域と一致するかどうかを確認します。領域が一致しない場合は、ギャップがあります。
絵画これは、あなたが言及したアプローチがある:あなたのキャンバスの大きさを持つ2次元配列を作成します。次に、矩形を反復処理し、それらを配列にペイントします。
このアプローチの最適化の1つは、座標圧縮です。四角形[(10,20)、(15,25)]と[(7,3)、(15,25)]があるとしましょう。個別のx座標(7,10,15)を見て、それらを(0,1,2)と別個のy座標(3,20,25)に再マッピングし、それらを(0,1,2)に再マップすることができます。 2)。次に、四角形[(1,1)、(2,2)]と[(0,0)、(2,2)]が残っているので、26x26アレイ。
スイープラインアルゴリズム
「面白い」ポイントで停止し、領域が占有されているのを追跡し、左から右にラインをスイープ。
2D範囲木
効率的に矩形範囲にわたってクエリを行うことができるデータ構造。
どちらを選ぶか?
あなたが持っている長方形の数、それらの領域内の分布、アルゴリズムの速さ、複雑さの程度などによって異なります。私が言及した最初の2つのアルゴリズムは、後者の2つよりはるかに簡単なので、そこから始めておくことをお勧めします。
詳細
あなたはこれらのアルゴリズムの詳細についてはしたい場合は、オンラインの「矩形組合」を検索してみてください。最も効率的なソリューションはスイープラインアルゴリズムです。
- What is an Efficient algorithm to find Area of Overlapping Rectangles
- http://compgeom.cs.uiuc.edu/~jeffe/open/klee.html
- J. L.ベントレー、アルゴリズムクレーの長方形の問題のために:ここで はスイープオンラインアルゴリズムの参照のカップルです。未発表のノートは、コンピュータサイエンス学部、カーネギーメロン大学、1977
文献3は、通常、矩形組合のためのラインスイープアルゴリズムの元のソースとして与えられたが、私は実際に見つけることができませんでしたことを認めざるを得ませんさ紙はオンラインで、おそらくそれは "未公開"なので... ...
この宿題はありますか? –
できるだけ詳しく説明してください。あなたが問題を述べることができない場合、解決策は非常に見えにくいです。 –
は、x/y軸に平行な矩形の辺であるか、またはそれらは任意の方向にあり得るか? – PeskyGnat