2011-10-13 2 views
1

Я ищу простой и эффективный способ решить следующую задачу:Построить ортонормированный базис дал только один вектор в 3d

У меня есть один вектор в 3d, и я хочу, чтобы получить ортонормированный базис (х, y, z) где один из базовых векторов (допустим, x) - данный вектор. Поэтому я ищу два вектора, перпендикулярные друг другу, которые также перпендикулярны данному вектору.

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

+0

Почему вы проверяете точку (x, u) ~ = 0? –

ответ

0

Позвоните нам по телефону x ваш вектор-единица. Позвоните по телефону u = (1,0,0). Если dot(u,x) ~= 0, тогда возьмите u = (0,1,0). Затем y = x^u и z = x^y.

+0

Спасибо, это работает. Я использовал ваше решение с небольшой модификацией: я положил 'u = (-x1, x0, x2)', чтобы избежать if. Он должен работать до тех пор, пока векторы '(x0, x1, x2)' и '(-x1, x0, x2)' линейно независимы, что, по-видимому, интуитивно (и тест на поддержку огромного набора случайных данных Это). – adam

+1

Я не согласен с вашим выбором 'u':' dot ((x0, x1, x2), (-x1, x0, x2)) = -x0.x1 + x0.x1 + x2.x2 = x2.x2'. Так что это работает только в том случае, если 'x2! = 0'. Я не думаю, что безопасно использовать этот вектор. – tibur

+0

Нет, я использую вектор ** u ** только для того, чтобы помочь мне рассчитать ** y ** и ** z ** следующим образом: 'u = (-x1, x0, x2); y = x^u; z = y^u', поэтому он не должен быть перпендикулярен к ** x **, только линейно независимым. – adam

0

Чтобы избавиться от Tibur-х, если вы можете получить некоторое улучшение, используя дешевые (ER) MUL + поплавок отливать

y = x^u 
y.z += float(y==0); // this changes a zero-vector into (0,0,1) 
z = x^y 

Doing вектор-сравнить после того, как перекрестное произведение дает более стабильное решение чем проверка if u == x, приведение float зависит от вашей архитектуры, но работает в большинстве компиляторов/платформ.

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

 Смежные вопросы

  • Нет связанных вопросов^_^