Решение очень легко, когда вы определяете луч с точкой (= вектор) и вектором направления, а также прямоугольник с точкой (= вектор) и двумя векторами, представляющими стороны.
Предположим, чтоЛуч определяется как R0 + t * D
, где R0
является источником луча, D
является единичным вектором, представляющим его направление, а t
является его длиной.
Прямоугольник может быть представлен с помощьюугловая точка P0
и два вектора S1
и S2
, которые должны представлять стороны (их длина равна длине сторон).Вам понадобится еще один вектор N
, нормальный к его поверхности, который равен единичному вектору вдоль перекрестного произведения S1
и S2
.
Теперь предположим, что луч пересекает прямоугольник в P
.Тогда направление луча D
должно составлять ненулевой угол с нормалью N
.Это можно проверить, проверив D.N < 0
.
Чтобы найти точку пересечения, предположим, что P = R0 + a * D
(точка должна быть на луче).Вам нужно найти значение a
сейчас.Найдите вектор P0P
.Это должно быть перпендикулярно N
, что означает P0P.N = 0
, которое уменьшается до a = ((P0 - R0).N) / (D.N)
.
Теперь вам нужно проверить, находится ли точка внутри прямоугольника или нет.Для этого возьмите проекцию Q1
из P0P
вдоль S1
и Q2
из P0P
вдоль S2
.Тогда условие для находящейся внутри точки равно 0 <= length(Q1) <= length(S1)
и 0 <= length(Q2) <= length(S2)
.
. Этот метод подходит для любого типа параллелограммов, а не только для прямоугольников.