ホームページ  >  記事  >  バックエンド開発  >  2 つのベクトル間の時計回りの角度を直接計算するにはどうすればよいですか?

2 つのベクトル間の時計回りの角度を直接計算するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-23 17:24:19832ブラウズ

How to Directly Calculate the Clockwise Angle Between Two Vectors?

ベクトル間の時計回りの角度の直接計算

従来、ベクトル間の角度を計算するにはドット積を使用し、ベクトル間の内角を求めます。 0°と180°。ただし、このアプローチでは、実際の時計回りの角度を決定するために条件ステートメントを使用する必要があります。

2 次元の場合

2D では、次のような簡単なアプローチが存在します。

dot = x1*x2 + y1*y2      # Dot product between [x1, y1] and [x2, y2]
det = x1*y2 - y1*x2      # Determinant
angle = atan2(det, dot)  # atan2(y, x) or atan2(sin, cos)

行列式は角度の正弦に比例し、内積の関係を補完します。コサイン付き。角度の方向は座標系の方向と一致しており、左手系 (コンピュータ グラフィックスなど) では正の角度は時計回りの回転を示します。入力を入れ替えると、角度の符号が変わります。

3 次元の場合

3D では、回転角度は、関係する両方のベクトルに垂直な軸によって定義されます。 1 つの規則では、軸を正の角度に揃える回転に正の角度を割り当てます。この規則を使用すると、

dot = x1*x2 + y1*y2 + z1*z2    # Between [x1, y1, z1] and [x2, y2, z2]
lenSq1 = x1*x1 + y1*y1 + z1*z1
lenSq2 = x2*x2 + y2*y2 + z2*z2
angle = acos(dot/sqrt(lenSq1 * lenSq2))

3D に埋め込まれた平面

ベクトルが既知の法線ベクトル _n_ を持つ平面内にある場合、別の特殊なケースが発生します。 2D 計算を適応させて、_n_ を考慮します。

dot = x1*x2 + y1*y2 + z1*z2
det = x1*y2*zn + x2*yn*z1 + xn*y1*z2 - z1*y2*xn - z2*yn*x1 - zn*y1*x2
angle = atan2(det, dot)

n には単位長が必要であることに注意してください。

三重積形式

行列式はトリプルで表すこともできますproduct:

det = n · (v1 × v2)

この式は、外積が角度の正弦に比例し、平面に垂直になり、事実上 _n_ と整列する、別の視点を提供します。次に、ドット積により、結果のベクトルの長さが正しい符号で測定されます。

範囲 0° – 360°

ほとんどの atan2 実装は次の値を返します。 [-π, π] ラジアンまたは [-180°, 180°] 度の範囲の角度。正の角度 [0°、360°] の場合、負の結果に 2π を加算します。あるいは、atan2(-det, -dot) π を正の角度に無条件に使用できます。

以上が2 つのベクトル間の時計回りの角度を直接計算するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。