Как проверить, пересекается ли отрезок прямой с выровненным по оси прямоугольником в 2D? - PullRequest
35 голосов
/ 19 сентября 2008

Как проверить, пересекается ли отрезок прямой с выровненным по оси прямоугольником в 2D? Сегмент определяется двумя концами: p1, p2. Прямоугольник определяется с верхними левым и нижним правым точками.

Ответы [ 12 ]

0 голосов
/ 26 июля 2012

Я смотрел на похожую проблему, и вот что я придумал. Я сначала сравнил края и кое-что понял. Если средняя точка ребра, попадающего в противоположную ось первого прямоугольника, находится в пределах половины длины этого ребра от внешних точек первого по той же оси, то где-то есть пересечение этой стороны. Но это было 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]
0 голосов
/ 19 сентября 2008

Я сделал немного раствора для салфеток ..

Затем найдите m и c и, следовательно, уравнение y = mx + c

y = (Point2.Y - Point1.Y) / (Point2.X - Point1.X)

Замените координаты P1, чтобы теперь найти c

Теперь для вершины прямоугольника поместите значение X в уравнение линии, получите значение Y и посмотрите, лежит ли значение Y в пределах прямоугольника, показанных ниже

(вы можете найти постоянные значения X1, X2, Y1, Y2 для прямоугольника такие, что)

X1 <= x <= X2 & 
Y1 <= y <= Y2

Если значение Y удовлетворяет вышеуказанному условию и лежит между (Point1.Y, Point2.Y) - у нас есть пересечение. Попробуйте каждую вершину, если эта не может сделать разрез.

...