ベクトル A に垂直な平面上にある 3 次元ベクトル B を求める公式は?
つまり、ベクトル A が与えられたとき、A に垂直で、上記の係数を持ち、ある角度だけ回転したベクトルを与える公式 f(角度、係数) は何ですか?
2 つのベクトルが直交する場合、内積はゼロになります。
だから:v1(x1, y1, z1), v2(x2, y2, z2)
。
=> x1 * x2 + y1 * y2 + z1 * z2 = 0
あなたが知っている(x1, y1, z1)
。任意のx2
を入力y2
すると、対応する が表示されますz2
:
z1 * z2 = -x1 * x2 - y1 * y2
=> z2 = (-x1 * x2 - y1 * y2) / z1
z1
である場合は注意してください0
。それからあなたは飛行機にいます。
Calculate the cross product AxC
with another vector C
which is not collinear with A
.
There are many possible directions in the plane perpendicular to A
. If you don't really care, which one to pick, just create an arbitrary vector C
not collinear with A
:
if (A2 != 0 || A3 != 0)
C = (1, 0, 0);
else
C = (0, 1, 0);
B = A x C;
1つの方法は、正のz軸(または他の軸)から指定されたベクトルへの回転変換を見つけることです。次に<modulus * cos(angle), modulus * sin(angle), 0>
、この変換を使用して変換します。
def getPerpendicular(v1,modulus,angle):
v2 = vector(0,0,1)
v1_len = v2.length()
axis = v1.cross_product(v2)
sinAngle = axis.length() / v1_len # |u x v| = |u| * |v| * sin(angle)
cosAngle = v1.dot_product(v2) / v1_len # u . v = |u| * |v| * cos(angle)
axis = axis.normalize()
# atan2(sin(a), cos(a)) = a, -pi < a < pi
angle = math.atan2(sinAngle, cosAngle)
rotationMatrix = fromAxisAngle(axis, angle)
# perpendicular to v2
v3 = vector(modulus*cos(angle),modulus*sin(angle),0)
return rotationMatrix.multiply(v3);
回転行列を計算するには、次の記事を参照してください。WP:軸と角度からの回転行列
別の方法は、クォータニオン回転を使用することです。頭を包むのはもう少しですが、追跡する数は少なくなります。
q4w56 は、堅牢なソリューションとしてほぼ存在します。問題: 1) スケーリングを考慮していません。2) 必要に応じて、2 つの変数間のマグニチュードを比較しません。
scale = |x| + |y| + |z|
if scale == 0:
return (0,0,0)
x = x/scale
y = y/scale
z = z/scale
if |x| > |y|:
return (z, 0,-x)
else:
return (0, z,-y)
非常に大きな数または非常に小さな数を扱う場合、スケーリングは重要です。さらに、一般に、0 から 1 の間の値に対して浮動小数点演算を行う方がよいでしょう。