2011-10-13 12 views
1

に一つだけのベクトル与えられた正規直交ベースを構築:(私は次のような問題を解決するための簡単かつ効率的な方法を探しています3D

私は3dに1つのベクトルを持っていると私は正規直交ベースを取得したいX,y,z)ここで、基底ベクトルの1つ(例えばxとする)が所与のベクトルである。だから私はお互いに垂直な、私の与えられたベクトルに垂直な2つのベクトルを探しています。

これには無限の解決策があることはわかっていますが、上記の要件を満たしていれば簡単で効率的です。

+0

なぜdot(x、u)〜= 0をテストするのですか? –

答えて

0

xあなたのユニットベクトルに電話しましょう。 u = (1,0,0)に電話してください。 dot(u,x) ~= 0の場合はu = (0,1,0)としてください。次に、y = x^uz = x^y

+0

ありがとう、これは動作します。私は小さな修正をしてあなたのソリューションを使いました。ifを避けるために 'u =(-x1、x0、x2)'を入れました。ベクトル '(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

あなたが安い(ER)を使用して、若干の改善を得ることができ、場合ティブールのを取り除くためのmul +フロートは、クロス製品はあなたに、より安定したソリューションを提供した後、ベクターの比較を行う

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

をキャストu == xであるかどうかを調べるよりも、浮動キャストはアーキテクチャに依存しますが、ほとんどのコンパイラ/プラットフォームで動作します。

基本的に、この種の基底関数は、xがuと同一直線上にあるときに常に特異点を持つので、コンテキストから賢明に選ぶようにしてください。ただし、uは定数である必要はありません。ほとんどの場合、微妙な事例に合わせてuを選ぶことができますので、特異点を滑らかにし、全体的な変換を安定に保ちます。

関連する問題