Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.07;
Скачать: CL | DM;

Вниз

Есть два луча Как найти на них две ближайшие друг к другу точки?   Найти похожие ветки 

 
MainRay   (2007-02-08 05:26) [0]

Лучи заданы точкой и направлением.

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

Погуглистам сразу идти нах.


 
Rial ©   (2007-02-08 10:09) [1]

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 рааз повернут.
Выполняем обратный поворот  - и результат готов.

Алгортм рабочий и взят не с потолка.
Если тебе нужен котовый код - можешь идти туда
же, куда ты послал гуглистов :)


 
MainRay   (2007-02-09 01:57) [2]


> Rial ©   (08.02.07 10:09) [1]
> 1)
> Tmp:=A1;
> A1:=A1 - Tmp;

Если вычесть самого себя, то будет ноль. Неужели ты таких простых вещей не знаешь?


 
MainRay   (2007-02-09 02:00) [3]


> Rial ©   (08.02.07 10:09) [1]
> 2)
> рассматриваем A1.
> используется формула
> X :=X * Cs - Y * Sn;
> Y :=Y * Cs + X * Sn;

Осталось только выяснить что в них что обозначает.

А про синусы и косинусы рекомендую забыть. Здесь вам не школа.


 
Asteroid ©   (2007-02-09 04:44) [4]

http://www.realtimerendering.com/int/ ?


 
Rial ©   (2007-02-09 05:26) [5]

> [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;


 
MainRay   (2007-02-09 06:31) [6]


> 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)
> > Если вычесть самого себя, то будет ноль. Неужели ты таких
> > простых вещей не знаешь?
>
> Странный народ пошел, я в шоке просто...
> Мне твои колкости не нужны, ошибся адресом :)
> Я, в отлиции от тебя, знаю, как решить твою задачу.


Ты знаешь как получить ноль, а не задачу решить.
И это не колкость, а деликатность. Другой бы дураком обозвал, а я только вежливо указал на ошибку.


 
Думкин ©   (2007-02-09 08:39) [7]

Методика такая:
1. Задаем лучи параметрически с областью определения параметров - положительная полуось действительных чисел.
2. Строим функцию расстояния между произвольными точками лучей. Функция двух переменных. Ищем минмумум.
3. Если при минимуме оба параметра положительные - то нашли. Если хотя бы один отрицательный - то значит минимум реализуется на границе одного из лучей.
4. Ищем расстояния от концов лучей до соседа. Выбираем минимальное.

Кто не понял, может идти вслед за гуглистами. адьез.


 
Думкин ©   (2007-02-09 08:41) [8]

Строгого минимума может не быть. Если не ясно, что с этим делать - можно присоединиться к погуглистам.


 
Rial ©   (2007-02-09 09:01) [9]


> [6] MainRay   (09.02.07 06:31)
> Ты знаешь как получить ноль, а не задачу решить.
> И это не колкость, а деликатность. Другой бы дураком обозвал,
> а я только вежливо указал на ошибку.

Спасибо, что повеселил с утра, дружище.
Заряд положительной энергии мне не помешает :)

Обидно одно - в системе российского образования даже
такие господа как ты могут получить диплом, таким образом
еще более подстегнув взлутевшую самооценку.

P.S.
Ядом можешь больше не дышать, лично я в эту ветку
из прнципа не загляну %)


 
oldman ©   (2007-02-09 16:55) [10]

Есть два варианта (для плоскости):
1. Лучи пересекаются
2. Лучи не пересекаются

В обоих случаях задача лишена смысла...

Для 3D другая какафония...


 
Думкин ©   (2007-02-10 18:43) [11]

> oldman ©   (09.02.07 16:55) [10]
> Есть два варианта (для плоскости):
> 1. Лучи пересекаются
> 2. Лучи не пересекаются
>
> В обоих случаях задача лишена смысла...


Я столько не выпью... :(


 
Asteroid ©   (2007-02-10 23:40) [12]

> И что? [6]
А ссылка ведет в конец той же страницы, где четко расписан алгоритм.


 
MainRay   (2007-02-11 02:13) [13]


> Asteroid ©   (10.02.07 23:40) [12]
>
> > И что? [6]
> А ссылка ведет в конец той же страницы, где четко расписан
> алгоритм.


The solution is:
t1 = Determinant{(o2-o1),d2,d1 X d2} / ||d1 X d2||^2

Можешь запрограммировать эту функцию - запрограммируй.
А если не можешь, то и нечего тогда.


 
MainRay   (2007-02-14 04:41) [14]


> Asteroid ©   (10.02.07 23:40) [12]

Правильно ли я понял, что ты спасовал перед трудностью?


 
Asteroid ©   (2007-02-16 03:50) [15]

> MainRay   (14.02.07 04:41) [14]
Неправильно, просто я редко сюда заглядываю. А вот то, что ты за три дня так и не нашел, как считается определитель матрицы 3x3.... =)

OriginDiff = VectorSub( o2, o1 );
DirCross = VectorCross( d1, d2 );
Det = OriginDiff.x * ( d2.y * DirCross.z - d2.z * DirCross.y ) - OriginDiff.y * ( d2.x * DirCross.z - d2.z * DirCross.x ) + OriginDiff.z * ( d2.x * DirCross.y - d2.y * DirCross.x );
SqLen = VectorDot( DirCross, DirCross );
if SqLen < eps then  // nearly parallel or intersect behind
else t1 = Det / SqLen;

Надо расписывать функции вычитания и скалярного и векторного произведения векторов или сам напишешь?


 
MainRay   (2007-02-16 04:00) [16]


> Asteroid ©   (16.02.07 03:50) [15]
> Det = OriginDiff.x * ( d2.y * DirCross.z - d2.z * DirCross.
> y ) - OriginDiff.y * ( d2.x * DirCross.z - d2.z * DirCross.
> x ) + OriginDiff.z * ( d2.x * DirCross.y - d2.y * DirCross.
> x );
> if SqLen < eps then  // nearly parallel or intersect behind


Вопрос был о том, чтоб написать словами.
А ты чем пишешь?
Просто передрал с какого то учебника, судя по английским написям, не понимая.
Вот и всё.


 
MainRay   (2007-02-16 04:04) [17]


> Asteroid ©   (16.02.07 03:50) [15]
> Det = OriginDiff.x * ( d2.y * DirCross.z - d2.z * DirCross.
> y ) - OriginDiff.y * ( d2.x * DirCross.z - d2.z * DirCross.
> x ) + OriginDiff.z * ( d2.x * DirCross.y - d2.y * DirCross.
> x );
> if SqLen < eps then  // nearly parallel or intersect behind


Вопрос был о том, чтоб написать словами.
А ты чем пишешь?
Просто передрал с какого то учебника, судя по английским написям, не понимая.
Вот и всё.


 
Думкин ©   (2007-02-16 05:55) [18]

> Asteroid ©   (16.02.07 03:50) [15]

Ответ ему дали. Не трать свое время. Пусть следует за погуглистами.


 
Ketmar ©   (2007-02-17 12:11) [19]

оставьте придурка-тролля в покое. давайте лучше пофлудим просто так. например, о достоинствах портвейна "777" перед заграницным мочепивом.


 
dimon999   (2007-02-17 15:36) [20]

bool GetLinesDistance( Vector p1, Vector p2, Vector p3, Vector p4, Vector * pa, Vector * pb )
{
   Vector p13,p43,p21;
   double d1343,d4321,d1321,d4343,d2121;
   double numer,denom;
   double mua, mub;

   p13.x = p1.x - p3.x;
   p13.y = p1.y - p3.y;
   p13.z = p1.z - p3.z;
   p43.x = p4.x - p3.x;
   p43.y = p4.y - p3.y;
   p43.z = p4.z - p3.z;
   if (fabs(p43.x)  < EPSILON && fabs(p43.y)  < EPSILON && fabs(p43.z)  < EPSILON) return 0;
   p21.x = p2.x - p1.x;
   p21.y = p2.y - p1.y;
   p21.z = p2.z - p1.z;
   if (fabs(p21.x)  < EPSILON && fabs(p21.y)  < EPSILON && fabs(p21.z)  < EPSILON) return 0;

   d1343 = p13.x * p43.x + p13.y * p43.y + p13.z * p43.z;
   d4321 = p43.x * p21.x + p43.y * p21.y + p43.z * p21.z;
   d1321 = p13.x * p21.x + p13.y * p21.y + p13.z * p21.z;
   d4343 = p43.x * p43.x + p43.y * p43.y + p43.z * p43.z;
   d2121 = p21.x * p21.x + p21.y * p21.y + p21.z * p21.z;

   denom = d2121 * d4343 - d4321 * d4321;
   if (fabs(denom) < EPSILON) return 0;
   numer = d1343 * d4321 - d1321 * d4343;

   mua = numer / denom;
   mub = (d1343 + d4321 * (mua)) / d4343;

   pa->x = float( p1.x + mua * p21.x );
   pa->y = float( p1.y + mua * p21.y );
   pa->z = float( p1.z + mua * p21.z );
   pb->x = float( p3.x + mub * p43.x );
   pb->y = float( p3.y + mub * p43.y );
   pb->z = float( p3.z + mub * p43.z );

   return 1;
}


 
homm ©   (2007-02-17 15:59) [21]

> bool GetLinesDistance
Интересный тип возвращаемых двнных для нахождения растояния


 
dimon999   (2007-02-17 17:05) [22]

> homm ©   (17.02.07 15:59) [21]
не придирайтесь,
вопрос был "Есть два луча Как найти на них две ближайшие друг к другу точки?"


 
MainRay   (2007-02-18 06:40) [23]

Нет. Вопрос был

"Если кто нибудь знает алгоритм, как чего перемещать, чтобы их найти - напишите словами."

К сожалению, можно констатировать, что всё, что присуствтующие могут - это утянуть откуда нибудь функцию. Но при этом они НЕ ПОНИМАЮТ, как они работают.


> dimon999   (17.02.07 17:05) [22]
>
> > homm ©   (17.02.07 15:59) [21]
> не придирайтесь,
> вопрос был "Есть два луча Как найти на них две ближайшие
> друг к другу точки?"

Так что же ты не для лучей, а для линий функцию пишешь?


 
dimon999   (2007-02-19 17:40) [24]

> К сожалению, можно констатировать, что всё, что присуствтующие могут - это > утянуть откуда нибудь функцию. Но при этом они НЕ ПОНИМАЮТ, как они > работают.

эта функция действительно выдрана из чужого кода и
я правда не знаю, как она работает.

> Так что же ты не для лучей, а для линий функцию пишешь?

line - это прямая, например в пространстве
segment - это отрезок


 
Asteroid ©   (2007-02-19 18:57) [25]

> Думкин ©   (16.02.07 05:55) [18]
Да будет так :)
Автору ветки, похоже, лень штудировать справочники по линейной алгебре так же, как мне переписывать "откуда-то" код (в котором, кстати, смешались два языка =) ).

P.S. Возможно, моя ошибка была в том, что я погуглил, так что самоустраняюсь, чего желаю и автору ветки :)


 
Аффтар   (2007-02-28 04:18) [26]


> Asteroid ©   (19.02.07 18:57) [25]
>
> > Думкин ©   (16.02.07 05:55) [18]
> Да будет так :)
> Автору ветки, похоже, лень

Короче ты облажался, и пошёл искать виновных вокруг себя.
Поздравлю тебя с приёмом в компанию Думкиных.


> P.S. Возможно, моя ошибка была в том, что я погуглил, так
> что самоустраняюсь, чего желаю и автору ветки :)

Пусть твои желания обратятся на тебя самого.


 
Gero ©   (2007-03-11 20:40) [27]

http://lleo.aha.ru/na/


 
Юрий Зотов ©   (2007-03-11 21:04) [28]

"Деликатному" предлагается возглавить погуглистов и быстрым шагом следовать по ссылке в [27].

А по дороге еще раз подумать о деликатности.



Страницы: 1 вся ветка

Текущий архив: 2008.09.07;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.015 c
2-1217144058
krem
2008-07-27 11:34
2008.09.07
динамический массив


2-1217309805
Оксана Вл.
2008-07-29 09:36
2008.09.07
Не срабатывает dbEditing


15-1216181257
dreamse
2008-07-16 08:07
2008.09.07
Написание спам фильтра


2-1217375683
гуд
2008-07-30 03:54
2008.09.07
Цвет строки в RichEdit


2-1217231257
Neon-w
2008-07-28 11:47
2008.09.07
Случайно удалил файл project1