Я смотрел на похожую проблему, и вот что я придумал. Я сначала сравнил края и кое-что понял. Если средняя точка ребра, попадающего в противоположную ось первого прямоугольника, находится в пределах половины длины этого ребра от внешних точек первого по той же оси, то где-то есть пересечение этой стороны.
Но это было 1-е измерение, и нужно было посмотреть на каждую сторону второго поля, чтобы понять.
Внезапно мне пришло в голову, что если вы найдете «среднюю точку» второго блока и сравните координаты средней точки, чтобы увидеть, находятся ли они в пределах 1/2 длины стороны (от второго блока) внешних измерений первого, то где-то есть пересечение.
i.e. box 1 is bounded by x1,y1 to x2,y2
box 2 is bounded by a1,b1 to a2,b2
the width and height of box 2 is:
w2 = a2 - a1 (half of that is w2/2)
h2 = b2 - b1 (half of that is h2/2)
the midpoints of box 2 are:
am = a1 + w2/2
bm = b1 + h2/2
So now you just check if
(x1 - w2/2) < am < (x2 + w2/2) and (y1 - h2/2) < bm < (y2 + h2/2)
then the two overlap somewhere.
If you want to check also for edges intersecting to count as 'overlap' then
change the < to <=
Конечно, вы могли бы так же легко сравнивать другие данные (проверяя, чтобы середины прямоугольника 1 находились в пределах 1/2 длины внешних размеров прямоугольника 2)
И еще большее упрощение - сдвиньте среднюю точку на половину длины, и она будет идентична исходной точке этого прямоугольника. Это означает, что теперь вы можете проверить только эту точку на предмет попадания в ваш ограничивающий диапазон, и, сдвинув плоскость вверх и влево, нижний угол теперь является нижним углом первого поля. Гораздо меньше математики:
(x1 - w2) < a1 < x2
&&
(y1 - h2) < b1 < y2
[overlap exists]
или незамещенный:
( (x1-(a2-a1)) < a1 < x2 ) && ( (y1-(b2-b1)) < b1 < y2 ) [overlap exists]
( (x1-(a2-a1)) <= a1 <= x2 ) && ( (y1-(b2-b1)) <= b1 <= y2 ) [overlap or intersect exists]