24

原点(x、y)、サイズ(高さ、幅)、回転角度(0〜360°)として定義された2つの2D長方形があります。両方の長方形が同じサイズであることを保証できます。

これら 2 つの長方形の交点のおおよその面積を計算する必要があります。 長方形の交差点

計算は正確である必要はありませんが、可能です。結果を他の交差領域と比較して、一連の長方形の最大交差領域を決定するため、同じアルゴリズムの他の計算と比較して正確である必要があるだけです。

交差領域のバウンディング ボックスの領域を使用することを考えましたが、さまざまなケースが考えられるため、交差領域の頂点を取得するのに問題があります。 非常に多くの可能な交差点形状

私はこのプログラムを Cocoa フレームワークの Objective-C で書いています。その価値があるので、誰かが使用するショートカットNSBezierPathや何かを知っている場合は、それも提案してください。

4

6 に答える 6

7

おおよその答えを与える単純なアルゴリズムはサンプリングです。

長方形の 1 つを小さな正方形のグリッドに分割します。各交点について、その点が他の長方形の内側にあるかどうかを確認します。他の長方形の内側にある点の数は、重なり合う領域の面積のかなり良い近似になります。ポイントの密度を上げると、計算の精度が上がりますが、パフォーマンスが低下します。

于 2012-07-26T13:14:26.647 に答える
4

いずれにせよ、2 つの多角形の正確な交差多角形を計算するのは簡単な作業です。凸多角形は半平面の交差と見なすことができるからです。「シーケンシャルカット」が仕事をします。

切り取る長方形として 1 つの長方形 (任意) を選択します。切り取る長方形の辺を 1 つずつ繰り返します。切断長方形の現在の辺を含む線で 2 番目の長方形を切断し、「外側」の半平面にあるすべてのものを破棄します。

すべての切断面の反復が完了すると、残りの長方形が結果になります。

于 2012-07-26T14:52:01.667 に答える
3

実際に正確な面積を計算できます。

  1. 2 つの長方形から 1 つの多角形を作成します。この質問(特にこの回答)を参照するか、 gpcライブラリを使用してください。
  2. この多角形の面積を求めます。ここを参照してください。
  3. 共用エリアは

    area of rectangle 1 + area of rectangle 2 - area of aggregated polygon
    
于 2012-07-26T13:29:45.880 に答える
1

各長方形の各線分を取り、それらが交差するかどうかを確認します。いくつかの可能性があります:

  1. 交差するものがない場合 - 共有領域はゼロです - 一方のすべての点が他方の内側にある場合を除きます。その場合、共有領域は小さい方の領域です。

  2. a 1 つの長方形の 2 つの連続するエッジが別の長方形の 1 つのエッジと交差する場合、これは三角形を形成します。その面積を計算します。

    b. エッジが連続していない場合、これは四角形を形成します。四角形の向かい合う 2 つの角から線を計算すると、2 つの三角形ができます。それぞれの面積を計算して合計します。

  3. 1 つの 2 つのエッジが別の 2 つのエッジと交差する場合、四角形になります。2b のように計算します。

  4. 一方の各エッジが他方の各エッジと交差する場合、八角形になります。三角形に分割します (たとえば、1 つの頂点から他の頂点に光線を引き、4 つの三角形を作成します)。

@編集:より一般的な解決策があります。

1の特殊なケースを確認してください。

次に、交差する頂点から開始し、最初の交差する頂点に戻るまで、そこから他の交点までエッジをたどります。これにより、凸多角形が形成されます。最初の頂点から反対側の各頂点に光線を描画します (たとえば、頂点を左右にスキップします)。これにより、三角形の束に分割されます。それぞれの面積を計算して合計します。

于 2012-07-26T14:08:04.863 に答える
1

総当たり的な方法:

  • [長方形の角] + [辺の交点] のセットからすべての点を取得します
  • 両方の長方形の内側または端にないポイントを削除します。
  • これで交差点の角ができました。交差が凸であることに注意してください。
  • セットからの任意の点、任意の他の点、および指定された点の間の角度で残りの点を並べ替えます。
  • これで交点が整いました。
  • 通常の方法で面積を計算します(外積による)

.

于 2012-07-26T14:34:18.843 に答える