Проверка точек пересечения двух прямоугольников?
-
12-09-2019 - |
Вопрос
Если у меня есть два прямоугольника, позиции которых определены с использованием двух 2D-векторов (т.е.вверху слева, внизу справа) как я могу проверить точки, в которых они пересекаются?
Решение
Я предполагаю, что вам действительно нужен результат пересечения, а не только проверка того, пересекаются ли оба прямоугольника.
Пересечение 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
Другие советы
Предполагая, что источник включен left-top
экрана.
Если проверить, находится ли верхний левый угол одного прямоугольника (x3,y3)
меньше правого нижнего угла другого прямоугольника (x2,y2)
тогда они пересекаются.
Очки (x2,|y2-y3|)
и (|x2-x3|,y2)
.
Это для прямоугольника1 и реактивного угла2 справа от прямоугольника1.
Примените инверсию к левому переводу.
Два прямоугольника перекрываются, если существует хотя бы одна внутренняя точка 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 условия необходимы.Не совсем очевидно, что их также достаточно, но это тоже так.
Если вас больше интересует функция, выполняющая работу, чем реализация алгоритма,
проверить Функция IntersectRect в Windows.