![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Есть два луча Как найти на них две ближайшие друг к другу точки?
MainRay © (2007-02-08 05:26:00)Лучи заданы точкой и направлением.
Если кто нибудь знает алгоритм, как чего перемещать, чтобы их найти - напишите словами.
Погуглистам сразу идти нах.
Думкин (2007-02-09 08:41:00) [21]Строгого минимума может не быть. Если не ясно, что с этим делать - можно присоединиться к погуглистам.
Думкин (2007-02-09 08:39:00) [22]Методика такая:
1. Задаем лучи параметрически с областью определения параметров - положительная полуось действительных чисел.
2. Строим функцию расстояния между произвольными точками лучей. Функция двух переменных. Ищем минмумум.
3. Если при минимуме оба параметра положительные - то нашли. Если хотя бы один отрицательный - то значит минимум реализуется на границе одного из лучей.
4. Ищем расстояния от концов лучей до соседа. Выбираем минимальное.
Кто не понял, может идти вслед за гуглистами. адьез.
MainRay (2007-02-09 06:31:00) [23]
> Asteroid © (09.02.07 04:44) [4]
>
> http://www.realtimerendering.com/int/?
"Ray/ray: Ronald Goldman, Intersection of Two Lines in Three-Space, Graphics Gems, p. 304.".
И что?
> Rial © (09.02.07 05:26) [5]
>
> > [2] MainRay (09.02.07 01:57)
> > Если вычесть самого себя, то будет ноль. Неужели ты таких
> > простых вещей не знаешь?
>
> Странный народ пошел, я в шоке просто...
> Мне твои колкости не нужны, ошибся адресом :)
> Я, в отлиции от тебя, знаю, как решить твою задачу.
Ты знаешь как получить ноль, а не задачу решить.
И это не колкость, а деликатность. Другой бы дураком обозвал, а я только вежливо указал на ошибку.
Rial (2007-02-09 05:26:00) [24]> [2] MainRay (09.02.07 01:57)
> Если вычесть самого себя, то будет ноль. Неужели ты таких
> простых вещей не знаешь?
Странный народ пошел, я в шоке просто...
Мне твои колкости не нужны, ошибся адресом :)
Я, в отлиции от тебя, знаю, как решить твою задачу. Это объективный параметр.
От того, что ты нашел, к чему придраться, ты не стал ближе к цели.
Если что не понятно - так и спроси.
> [3] MainRay (09.02.07 02:00)
> Осталось только выяснить что в них что обозначает.
В данном случае это поворот вектора по оси Z.
Cs и Sn - это косинус и синус угла поворота.
X и Y - координаты вектора.
Чтобы повернуть в обратном направлении, нужно
посчитать координаты по формуле
X :=X * Cs + Y * Sn;
Y :=Y * Cs - X * Sn;
Asteroid (2007-02-09 04:44:00) [25]http://www.realtimerendering.com/int/?
MainRay (2007-02-09 02:00:00) [26]
> Rial © (08.02.07 10:09) [1]
> 2)
> рассматриваем A1.
> используется формула
> X :=X * Cs - Y * Sn;
> Y :=Y * Cs + X * Sn;
Осталось только выяснить что в них что обозначает.
А про синусы и косинусы рекомендую забыть. Здесь вам не школа.
MainRay (2007-02-09 01:57:00) [27]
> Rial © (08.02.07 10:09) [1]
> 1)
> Tmp:=A1;
> A1:=A1 - Tmp;
Если вычесть самого себя, то будет ноль. Неужели ты таких простых вещей не знаешь?
Rial (2007-02-08 10:09:00) [28]A1(x01, y01, z01) - точка, V1(x1, y1, z1) - направление.
Аналогично
A2, V2.
1)
Tmp:=A1;
A2:=A2 - Tmp;
A1:=A1 - Tmp;
2)
рассматриваем A1.
используется формула
X :=X * Cs - Y * Sn;
Y :=Y * Cs + X * Sn;
а) Ищем коэффициенты для уравнение такие, чтобы
после поворота V1 лежал в плоскости XY.
б) На полученный угол поворачиваем V2.
Итак, имеем V1 лежащий в XY и М2.
в) Операции а) и б) проделываем с целью,
чтобы V1 лежал на оси X.
3)Имеем уравнение луча L2 = A2 + V2''(x).
V2'' - дважды повернутый V2.
Теперь выражаем координаты Y и Z луча L2
через X.
Расстояние, очевидно, между лучами будет
Hypot(Y, Z);
Ищем точку X, в которой оно минимально.
Это уравнение от 1 переменной, решить которое
не составляет труда.
4)Точку получили.
Теперь вспоминаем, что вектор был 2 рааз повернут.
Выполняем обратный поворот - и результат готов.
Алгортм рабочий и взят не с потолка.
Если тебе нужен котовый код - можешь идти туда
же, куда ты послал гуглистов :)