2014-11-26 3 views
7

enter image description hereВычислить перекрывающую область между двумя прямоугольниками

Я хочу, чтобы вычислить перекрывающую область «СЕРЫЙ РЕГИОН» между красными и синими прямоугольниками.

Каждый прямоугольник определяется четырьмя угловыми координатами. Приведенная единица перекрываемой области является квадратной.

Я не мог себе представить, как я могу это сделать?

Любые творческие комментарии будут оценены.

+2

Итак, в чем проблема? Если вы знаете все угловые точки, вы можете легко вычислить угол прямоугольника пересечения. Координаты углов и функции 'min' и' max' должны быть все, что вам нужно. – cel

+0

действительно ли может вычислить угол прямоугольника пересечения? –

+0

Я этого не знаю. Тем не менее, я уверен, что вы можете понять, как вы можете самостоятельно вычислить эти углы. Посмотрите на верхний левый угол. Чтобы быть на перекрестке, вы должны иметь x_coord, по крайней мере, такой же большой, как и красные и синие левые концы, и y_coord максимум минимум красных и синих верхних концов ... у вас есть аналогичные аргументы для каждой из четырех угловых точек. – cel

ответ

17

Этот тип пересечения легко осуществляется с помощью идеи «мин максимальных значений» и «максимума мин». Для того, чтобы написать это нужно определенное понятие для прямоугольника, и, просто чтобы сделать вещи ясно, что я буду использовать 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]) 

и т. Д. Или любые другие обозначения, которые вы предпочитаете.

+0

спасибо, но ваш код все еще работает, даже если синий многоугольник находится слева от красного многоугольника? –

+0

@just: Да, это работает в любом случае. Использование подхода max и min - это простой способ того, что в противном случае было бы сложным набором условных выражений для определения относительных положений. То есть, прочитайте 'max (a.xmin, b.xmin)' как «самый верхний левый угол» и т. Д. Кроме того, я изменил свой ответ, чтобы теперь включить случай, когда прямоугольники не пересекаются. – tom10

+0

спасибо, я понял. –

Смежные вопросы