Проверять точки пересечения между двумя прямоугольниками? - PullRequest
3 голосов
/ 04 декабря 2009

Если у меня есть два прямоугольника, положение которых определяется с помощью двух 2D векторов (то есть вверху слева, внизу справа), как я могу проверить точки, которые они пересекают?

Ответы [ 4 ]

4 голосов
/ 04 декабря 2009

Полагаю, вы действительно хотите получить результат пересечения, а не только тест, если оба прямоугольника пересекаются.

Пересечение rect1 = (l1, t1, r1, b1) и rect2 = (l2, t2, r2, b2) снова является прямоугольником:

rectIntersection = ( max(l1, l2), max(t1, t2), min(r1, r2), min(b1, b2) )

rectIntersection, конечно, пусто, если left >= right || top >= bottom при условии, что прямоугольник является лево / верхним включением и правым / нижним исключением.

Прямоугольники пересекаются, если

l1 < r2 && l2<r1 && t1<b2 && t2<t1
2 голосов
/ 04 декабря 2009

Предполагается, что источник находится на left-top экрана.

Если Проверить, если верхний левый угол одного прямоугольника (x3,y3) меньше нижнего правого угла другого прямоугольника (x2,y2), то оба они пересекаются.

Точки: (x2,|y2-y3|) и (|x2-x3|,y2).

Это для прямоугольника1 и реагирующего прямоугольника2 справа от прямоугольника1.

Применить обратный к левому переводу.

1 голос
/ 04 декабря 2009

Два прямоугольника перекрываются, если есть хотя бы одна внутренняя точка X, Y общая для обоих. Пусть первый прямоугольник будет {T1, L1, B1, R1}, а второй {T2, L2, B2, R2} (сверху, слева, снизу, справа). Теперь следует, что (X>L1) и (X<R1) и (Y>T1) и (Y<B1), и аналогично для прямоугольника 2. Из (X>L1) и (X<R2) следует что (L1<R2). Точно так же (L2<R1), (T1<B2) и (T2<B1).

Таким образом, эти 4 условия необходимы. Непосредственно не очевидно, что они также достаточны, но это также имеет место.

0 голосов
/ 04 декабря 2009

Если вас интересует больше функция для выполнения работы, чем реализация алгоритма,
проверить Функция IntersectRect в Windows.

...