Помогите пожалуйста разобраться с лучом. Мне говорили что-то про "время луча" (P + Vt), но что такое t я так и не понял. Само задание, чтоб ориентироваться: Есть точка (в 3D), из нее торчит вектор. Нужно найти уравнение луча для него - это раз. Дальше дана вторая точка. Нужно найти ближайшую к ней точку на луче. задан 29 Окт '13 14:31 Влас |
Если дана точка $%(x_0,y_0,z_0)$% и из неё исходит ненулевой вектор $%(a,b,c)$%, то этим задаётся луч, параметрическое уравнение которого имеет вид $%(x_0,y_0,z_0)+t(a,b,c)$%, где $%t\ge0$%. Его можно записать в координатном виде как систему их трёх условий: $%x=x_0+at$%, $%y=y_0+bt$%, $%z=z_0+ct$%. Предположим теперь, что нам дана какая-то ещё точка с координатами $%(x_1,y_1,z_1)$%, и надо найти ближайшую к ней точку на луче. Найдём для начала ближайшую к ней точку не на луче, а на прямой. Параметрическое уравнение прямой будет такое же, но без ограничения $%t\ge0$%, то есть $%t$% может быть и отрицательным. Рассмотрим квадрат расстояния от точки $%(x_1,y_1,z_1)$% до точки прямой с координатами $%x_0+at,y_0+bt,z_0+ct)$%. Эта величина представляет собой функцию от $%t$%, равную $%f(t)=(at+x_0-x_1)^2+(bt+y_0-y_1)^2+(ct+z_0-z_1)^2$%. Минимальное значение эта функция принимает в такой точке $%t$%, для которой производная функции по $%t$% равна нулю. Поскольку при дифференцировании везде будет появляться множитель $%2$%, мы сразу на него разделим, получая $%\frac12f'(t)=a(at+x_0-x_1)+b(bt+y_0-y_1)+c(ct+z_0-z_1)=0$%. Получилось линейное уравнение относительно $%t$% с положительным коэффициентом $%a^2+b^2+c^2$% при $%t$%. Из него значение $%t$% однозначно выражается. Далее, если оказалось, что $%t\ge0$%, то ближайшая точка прямой лежит на луче, и просто подставляем это значение $%t$% в параметрическое уравнение. Это даёт ближайшую точку на луче (к точке $%(x_1,y_1,z_1)$%). Но может так оказаться, что $%t < 0$%. Тогда из геометрических соображений легко видеть, что ближайшей точкой на луче будет его начало,то есть $%(x_0,y_0,z_0)$%. отвечен 30 Окт '13 0:39 falcao И все-же почему-то не получается.. То ли я туплю, то ли что.. Вот нашел t после того как приравнял производную к нулю: t = a(x1 - x0) + b(y1 - y0) + c(z1 - z0) / (aa + bb + cc) Но при том что я указываю по стандарту точку вне луча где-то возле него, но далеко от начальной точки, t чаще всего или равно нулю, либо принимает какие-то явно бредовые значения...
(4 Ноя '13 1:03)
Влас
Вы можете привести здесь свои конкретные вычисления (например, в добавлении к тексту вопроса), и тогда можно будет сказать, есть ли в них какая-либо ошибка. Число $%t$% Вы находите правильно -- разве что выражение в числителе надо окружить скобками. Как я уже говорил, если $%t$% отрицательно, то ближайшей будет начало луча.
(4 Ноя '13 1:17)
falcao
Введите координаты начальной точки x0 = 1; y0 = 1; z0 = 1; (1; 1; 1) Введите координаты вектора a = 4; b = 4; c = 4; (4; 4; 4) Введите координаты точки вне луча x1 = 2; y1 = 4; z1 = 2; (2; 4; 2) t = 0 Но ведь (2;4;2) ближе не к начальной точке?
(4 Ноя '13 4:07)
Влас
Извиняюсь за абракадабру: все в одну строчку попереводило
(4 Ноя '13 4:08)
Влас
А как у Вас получилось $%t=0$%? Согласно формуле, $$t=\frac{4(2-1)+4(4-1)+4(2-1)}{4^2+4^2+4^2}=\frac5{12}.$$ Тогда ближайшей точкой на луче будет $%(1,1,1)+t(4,4,4)=(8/3,8/3,8/3)$%.
(4 Ноя '13 6:59)
falcao
Да, спасибо за замечание: затупил с самим типом данных для точек и вектора. То-есть t и l задал как double, но значения (x0, y0, z0), (a, b, c) и (x1, y1, z1) задал как int, думая что это никак не повлияет на дабловские t и l. Вот сейчас изменил, и теперь при тех же значениях t = 0.416667; l = 1.63299. Расстояние же правильное вышло, вроде как?
(4 Ноя '13 23:28)
Влас
Вот оно, оказывается, в чём дело! Проблема была с программой, а не с математикой. А то я удивился, потому что формулы у Вас были верные. Численные значения теперь указаны правильно как для $%t$%, так и для расстояния.
(4 Ноя '13 23:43)
falcao
показано 5 из 7
показать еще 2
|
Ну это же параметрическое задание прямой. Уравнением луча в параметрическом виде будет для каждой координаты. $$x = O.x + P.x * t;$$ $$y = O.y + P.y * t;$$ $$z = O.z + P.z * t;$$ $$для t >= 0;$$(как раз из прямой делаем луч) O - заданая точка. P - вектор Если нужно не в параметрическом виде, то нужно повыражать t и подставлять везде, короче алгебра :] Ближайшую точку нужно ручками? Если можно на компе то лучше тернарным поиском по расстоянию. Если руками, то нужно пустить перпендикуляр(в 3D не приходилось этого делать, лучше погуглить)
t - это просто число(параметр). Если взять t = 1, то получим наш вектор отложенный от точки. Если t = -1, то вектор направленный в другую сторону :]. Возьмем наобум t = 1.1234 получим какую-то точку на луче.
http://mathprofi.ru/uravnenija_pryamoi_v_prostranstve.html
Вот что я нагуглил.