IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> Дан вектор в R3. Найти 2 перпендикулярных ему, тоже длины.
сообщение
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Собсна задача такая. Есть трёхмерный вектор v. Найти векторы v1 и v2, которые перпендикулярны v и друг другу, и имеют ту же длину, что и v. На плоскости аналогичная задача элементарна - вектору (x, y) сопоставляется (-y, x), сопоставление корректно и для нулевой длины. В трёхмерном пространстве такой красивой формулы нету - в топологии есть известная "теорема о причёсывании ежа", говорящая о том, что на поверхности чётномерной сферы не существует ненулевого непрерывного векторного поля. По сути v/abs(v) - точка на двухмерной сфере, v1 и v2 - касательные векторы в точке v. Нам как раз нужно ненулевое векторное поле. Непрерывной зависимости тут не построить, ну и ладно. Вопрос в том, чтобы найти v1 и v2 наиболее оптимальным способом. Вот моё решение "в лоб", мне оно не нравится:

l := sqrt(sqr(v[0]) + sqr(v[1]) + sqr(v[2]));
if l < 1E-7 then begin
v1[0] := 0;
v1[1] := 0;
v1[2] := 0;
v2[0] := 0;
v2[1] := 0;
v2[2] := 0;
end else begin
if (v[0] >= v[1]) and (v[0] >= v[2]) then begin //ищем первый перпендикуляр
v1[0] := -v[1];
v1[1] := v[0];
v1[2] := 0;
end else begin
v1[0] := 0;
v1[1] := -v[2];
v1[2] := v[1];
end;
v2[0] := v[1]*v1[2]-v[2]*v1[1]; // векторный произведением ищем второй
v2[1] := v[2]*v1[0]-v[0]*v1[2];
v2[2] := v[0]*v1[1]-v[1]*v1[0];
l1 := sqrt(sqr(v1[0]) + sqr(v1[1]) + sqr(v1[2])); // нормируем
l2 := sqrt(sqr(v2[0]) + sqr(v2[1]) + sqr(v2[2]));
v1[0] := v1[0]/l1*l;
v1[1] := v1[1]/l1*l;
v1[2] := v1[2]/l1*l;
v2[0] := v2[0]/l2*l;
v2[1] := v2[1]/l2*l;
v2[2] := v2[2]/l2*l;
end;



--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(TarasBer @ 8.11.2009 15:43) *
Вот моё решение "в лоб", мне оно не нравится
А чем конкретно оно тебе не нравится?
Я, думаю, делал бы так..
Ищем такое преобразование координат (включающее перенос, поворот и масштаб - то есть, не меняющее углы и соотношения длин) которое, скажем, орт Х перводит в наш вектор V. Далее берем орты Y и Z и выпоняем над ними это самое преобразование. Вроде, все..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Цитата(Lapp @ 15.11.2009 14:27) *

А чем конкретно оно тебе не нравится?

Слишком прямолинейно и уродливо. Учитывая, что мне важна скорость.
К счастью, в большинстве случаев V = (*, 0, 0), этот случай прост, он разбирается в первую очередь.
Цитата

Я, думаю, делал бы так..
Ищем такое преобразование координат (включающее перенос, поворот и масштаб - то есть, не меняющее углы и соотношения длин) которое, скажем, орт Х перводит в наш вектор V. Далее берем орты Y и Z и выпоняем над ними это самое преобразование. Вроде, все..


Ищем такую ортогональную матрицу M, такую, что MX=V. То есть первой строчкой этой матрицы будет V. А второй и третьей - V1 и V2. Таким образом задача свелась к самой себе. Думал я об этом, думал...


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


мозгоклюй
***

Группа: Пользователи
Сообщений: 204
Пол: Мужской
Реальное имя: Юра

Репутация: -  5  +


Не думал как оно будет сложно в программном коде и насколько подойдет .. но суть следующая

1. Приводим начало координат в исходную точку вектора
2. Проецируем вектор на любую плоскость - например XY
3. В плоскости XY строим перпендикуляр к проекции он и будет первым вектором


Прикрепленное изображение


PS/ честно говоря программер я не очень и расшифровать приведенный код не смог (в смысле не понял как оно работает), так-что извините если повторился

Сообщение отредактировано: AruNimotsi -


--------------------
Иногда ответ ближе чем то место где мы его ищем..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Цитата(AruNimotsi @ 20.11.2009 12:15) *

Не думал как оно будет сложно в программном коде и насколько подойдет .. но суть следующая

1. Приводим начало координат в исходную точку вектора

Все векторы и так считаются от нуля.
Цитата

2. Проецируем вектор на любую плоскость - например XY

А если это вектор (0, 0, 1)? Что делать? Опять разбирать эти случаи? А ещё вектор может быть (0.000000001, 0, 10000000), такой тоже не рекомендуется проецировать на XY.
Цитата

3. В плоскости XY строим перпендикуляр к проекции он и будет первым вектором

Собсна, именно так у меня первый вектор и ищется, с разбором случаев и с нормированием. Слишком прямолинейно и некрасиво.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 25.04.2024 7:55
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name