Проверка точек пересечения двух прямоугольников?

StackOverflow https://stackoverflow.com/questions/1845908

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top