Пусть положение точки будет (x0,y0,z0)
, а прямоугольник имеет углы (x1,y1,z1)
и (x2,y2,z2)
с x1
(u,v,w) = (cos ψ sin θ, sin ψ, cos ψ cos θ)
Линия (x0,y0,z0) + t (u,v,w)
Нахождение пересечения с одной из плоскостей, содержащих гранькоробка тривиальна.Скажем, чтобы найти пересечение с плоскостью x = x1, просто требуется решить x0 + u t = x1
, поэтому t = (x1-x0)/u
.Однажды оказалось, что легко проверить, содержится ли пересечение в грани.
Сложная ситуация возникает, если линия не пересекает грани.Здесь у нас есть пара косых линий , и мы хотим найти ближайшую пару точек по одной на каждой линии.
Рассмотрим ближайшую точку к ребру от (x1, y1, z1) до (x2, y1, z1).
Мы хотим найти параметр s, t такой, чтобы точки
(x0,y0,z0)+s(u,v,w)
(x1,y1,z1)+t(1,0,0)
были самыми близкими.Отрезок, соединяющий эти точки, должен быть перпендикулярен обеим линиям.Вектор вдоль этой линии является перекрестным произведением
N = (u,v,w) X (1,0,0) = (0,w,-v)
Теперь рассмотрим плоскость, проходящую через (x1, y1, z1), натянутую на (1,0,0) и N, это нормально
N2 = (1,0,0) X N
= (1,0,0) X (0,w,-v)
= (0,v,w)
и плоскость определяется как
P . N2 = (x1,y1,z1) . N2
Возьмите точку на нашем луче
( (x0,y0,z0)+s(u,v,w) ) . N2 = (x1,y1,z1) . N2
(x0,y0,z0) . N2 + s (u,v,w) . N2 = (x1,y1,z1) . N2
s (u,v,w) . N2 = ((x1,y1,z1)-(x0,y0,z0)) . N2
s (v^2+w^2) = (y1-y0) v + (z1-z0) w
так что
s = [ (y1-y0) v + (z1-z0) w ] / (v^2+w^2)
Мы можем повторить вышеописанное дляКаждый край на поле, найдите самые близкие точки и выберите самые маленькие.