12

ベクトル A に垂直な平面上にある 3 次元ベクトル B を求める公式は?

つまり、ベクトル A が与えられたとき、A に垂直で、上記の係数を持ち、ある角度だけ回転したベクトルを与える公式 f(角度、係数) は何ですか?

4

6 に答える 6

16

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。それからあなたは飛行機にいます。

于 2012-06-21T06:35:24.013 に答える
9

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; 
于 2012-06-21T06:31:56.963 に答える
2

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:軸と角度からの回転行列

別の方法は、クォータニオン回転を使用することです。頭を包むのはもう少しですが、追跡する数は少なくなります。

于 2012-06-21T09:05:20.450 に答える
2

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 の間の値に対して浮動小数点演算を行う方がよいでしょう。

于 2017-08-22T17:50:14.853 に答える