Определить, перекрывают ли два прямоугольника друг друга? - PullRequest
310 голосов
/ 20 ноября 2008

Я пытаюсь написать программу на C ++, которая использует следующие входные данные от пользователя для построения прямоугольников (между 2 и 5): высота, ширина, x-pos, y-pos. Все эти прямоугольники будут существовать параллельно осям x и y, то есть все их ребра будут иметь наклоны 0 или бесконечности.

Я пытался реализовать то, что упомянуто в этом вопросе, но мне не очень повезло.

Моя текущая реализация делает следующее:

// Gets all the vertices for Rectangle 1 and stores them in an array -> arrRect1
// point 1 x: arrRect1[0], point 1 y: arrRect1[1] and so on...
// Gets all the vertices for Rectangle 2 and stores them in an array -> arrRect2

// rotated edge of point a, rect 1
int rot_x, rot_y;
rot_x = -arrRect1[3];
rot_y = arrRect1[2];
// point on rotated edge
int pnt_x, pnt_y;
pnt_x = arrRect1[2]; 
pnt_y = arrRect1[3];
// test point, a from rect 2
int tst_x, tst_y;
tst_x = arrRect2[0];
tst_y = arrRect2[1];

int value;
value = (rot_x * (tst_x - pnt_x)) + (rot_y * (tst_y - pnt_y));
cout << "Value: " << value;  

Однако я не совсем уверен, (а) реализовал ли я алгоритм, с которым я правильно связался, или я точно понял, как это интерпретировать?

Есть предложения?

Ответы [ 22 ]

0 голосов
/ 12 мая 2013

У меня очень простое решение

пусть x1, y1 x2, y2, l1, b1, l2, будут кординаты и их длины и ширины соответственно

рассмотреть условие ((x2

теперь единственный способ перекрытия этих прямоугольников - это если точка, диагональная x1, y1, будет лежать внутри другого прямоугольника или аналогично точке, диагональной x2, y2, будет лежать внутри другого прямоугольника. что в точности соответствует вышеприведенному условию.

0 голосов
/ 23 апреля 2010

Этот ответ должен быть лучшим ответом:

Если прямоугольники перекрываются, тогда область перекрытия будет больше нуля. Теперь давайте найдем область перекрытия:

Если они перекрываются, то левый край прямоугольника перекрытия будет max(r1.x1, r2.x1), а правый - min(r1.x2, r2.x2). Таким образом, длина перекрытия будет min(r1.x2, r2.x2) - max(r1.x1, r2.x1)

Таким образом, площадь будет:

area = (max(r1.x1, r2.x1) - min(r1.x2, r2.x2)) * (max(r1.y1, r2.y1) - min(r1.y2, r2.y2))

Если area = 0, то они не перекрываются.

Просто не так ли?

...