web-dev-qa-db-ja.com

2つの長方形の間の重複領域を計算する

enter image description here

赤と青の四角形の重なり面積「THE GRAY REGION」を計算したい。

各長方形は、その4つのコーナー座標によって定義されます。結果の重複領域の単位は、単位正方形です。

どうすればできるのか想像もつきませんでした。

どんな創造的なコメントもいただければ幸いです。

22
Eric Bal

このタイプの交差は、「最大値の最小値」と「最小値の最大値」というアイデアによって簡単に実現できます。それを書き出すには、長方形の特定の概念が必要です。そして、物事を明確にするために、名前付きタプルを使用します。

from collections import namedtuple
Rectangle = namedtuple('Rectangle', 'xmin ymin xmax ymax')

ra = Rectangle(3., 3., 5., 5.)
rb = Rectangle(1., 1., 4., 3.5)
# intersection here is (3, 3, 4, 3.5), or an area of 1*.5=.5

def area(a, b):  # returns None if rectangles don't intersect
    dx = min(a.xmax, b.xmax) - max(a.xmin, b.xmin)
    dy = min(a.ymax, b.ymax) - max(a.ymin, b.ymin)
    if (dx>=0) and (dy>=0):
        return dx*dy

print area(ra, rb)
#  0.5 

名前付きタプル表記が気に入らない場合は、次のように使用できます。

dx = max(a[0], b[0]) - min(a[2], b[2])

など、または任意の表記法。

44
tom10

この質問には shapely タグがあるため、これを使用した解決策を次に示します。 tom10回答 と同じ長方形を使用します。

_from shapely.geometry import Polygon

polygon = Polygon([(3, 3), (5, 3), (5, 5), (3, 5)])
other_polygon = Polygon([(1, 1), (4, 1), (4, 3.5), (1, 3.5)])
intersection = polygon.intersection(other_polygon)
print(intersection.area)
# 0.5
_

これは、承認された回答のバージョンよりもはるかに簡潔です。 Shapelyはすでに 準備が整ったもの を提供しているため、独自のRectangleクラスを構築する必要はありません。エラーが発生しにくくなります(そのarea関数のロジックを理解してください)。そして、コード自体は自明です。


参照:
object.intersection(other)メソッドのドキュメント

11
Georgy