(x、y、z)として与えられる入力ベクトルを取得し、それとは異なる方向の新しいベクトルを見つける最も簡単な方法は何ですか?どの方向でもかまいませんが、入力とは異なる方向である必要があります(些細な正反対の方向を除く)。
分岐を伴わない簡単な解決策があるはずなのに、見つからないようですが、実際にあるのか知りたいです。
(x、y、z)として与えられる入力ベクトルを取得し、それとは異なる方向の新しいベクトルを見つける最も簡単な方法は何ですか?どの方向でもかまいませんが、入力とは異なる方向である必要があります(些細な正反対の方向を除く)。
分岐を伴わない簡単な解決策があるはずなのに、見つからないようですが、実際にあるのか知りたいです。
これがどれほど単純かはわかりませんが、(x、y、z)の長さがL(0ではない)であると仮定すると、下のベクトルの長さは1で、(x、y、z)に対して直角になります。
-y * (x + sign(x)*L) / (L*(L+|x|))
1 - y * y / (L*(L+|x|))
-y * z / (L*(L+|x|))
(ここで、| x |はxの絶対値であり、sign(x)はx <0の場合は-1、x> = 0の場合は1です)
この式は、(x、y、z)を(1,0,0)の倍数にマッピングするハウスホルダー反射(例: http: //en.wikipedia.org/wiki/Householder_transformation)を計算し、画像を計算することによって導き出しました。このマトリックスの下の(0,1,0)の; 行列は直交と対称の両方であるため、このベクトルは(x、y、z)に直交します。
(x、y、z)->(x'、y'、z')(for(x、y、z)!=(0,0,0))(x'、y '、z')は(x、y、z)の倍数になることはありません。(x'、y'、z')から(x、y、z)方向のコンポーネントを削除して、連続マップ(x、y、z)->(x''、y ''、z'')ここで、(x''、y''、z'')は(x、y、z)に対して直角ですが、毛の生えたボールの定理ではできません。
上記の式では、不連続符号関数が発生すると、式が不連続になります。サインはブランチを含む必要がないことに注意してください。一部の言語では、それを行うための組み込み関数があります。Cでは、2 *(x> = 0)-1を使用できます。