Вычислить перекрываемую область между двумя прямоугольниками
![enter image description here]()
Я хочу рассчитать перекрываемую область "СЕРЫЙ РЕГИОН" между красными и синими прямоугольниками.
Каждый прямоугольник определяется четырьмя угловыми координатами. Приведенная единица перекрываемой области является квадратной единицей.
Я не мог себе представить, как я могу это сделать?
Любые творческие комментарии будут оценены.
Ответы
Ответ 1
Этот тип пересечения легко выполняется с помощью идеи "min maxx" и "max of mins". Чтобы написать это, нужно определенное понятие для прямоугольника, и, чтобы просто понять, я буду использовать namedtuple:
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
Если вам не нравится нотация namedtuple, вы можете просто использовать:
dx = max(a[0], b[0]) - min(a[2], b[2])
и т.д., или любое другое обозначение, которое вы предпочитаете.
Ответ 2
Поскольку у этого вопроса есть тег 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
Это гораздо более кратко, чем версия в принятом ответе. Вам не нужно создавать собственный класс Rectangle
поскольку Shapely уже предоставляет готовые классы. Он менее подвержен ошибкам (поймите, логика в этой area
функции). И сам код не требует пояснений.
Рекомендации:
Документы для object.intersection(other)