ближайшая точка на поле к линии - PullRequest
0 голосов
/ 23 декабря 2018

enter image description here

Я нарисовал двумерное представление проблемы, но в конечном итоге мне придется решить ее в трех измерениях.

Проведена линияот начальной точки до бесконечности, в направлении, заданном тангажом и рысканием.Окно с выравниванием по оси "перед" точкой.

Я хочу получить координаты точки в блоке, который находится ближе всего к линии, или, если он пересекается, ближе всего к исходной точке.

Т.е., если бы линия была «повернута» в сторону прямоугольника, какая точка прямоугольника сначала пересекалась бы с линией?

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Пусть положение точки будет (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) 

Мы можем повторить вышеописанное дляКаждый край на поле, найдите самые близкие точки и выберите самые маленькие.

0 голосов
/ 24 декабря 2018

Создание параметрического представления луча с базовой точкой P0, вектором направления D и параметром t

P = P0 + t * D

Получите t для пересечений луча с краями прямоугольника, как это (аналогично3d):

Rect.Right = X0 + t * D.X

Найдите, какое пересечение происходит первым (меньше t), проверьте координаты пересечения.Если внутри ребра - точка найдена.Если нет, проанализируйте параметры пересечения с продолжениями edgr, чтобы определить, какой угол (возможно, ребро в 3d) является ближайшим

Обратите внимание, что в двумерном случае вам нужно проверить только два возможных ребра - в зависимости от направления луча.Например - слева и снизу для вашей правой картинки.Когда вы увидите, что пересечения выходят за границы, проверьте, какой из двух углов ближе.То же самое для 3d - но пересечение возможно для трех граней и ближе для большего количества ребер или углов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...