ホームページ >バックエンド開発 >C++ >2 次元と 3 次元の両方で 2 つのベクトル間の時計回りの角度を直接計算するにはどうすればよいでしょうか?

2 次元と 3 次元の両方で 2 つのベクトル間の時計回りの角度を直接計算するにはどうすればよいでしょうか?

DDD
DDDオリジナル
2024-12-07 21:33:15362ブラウズ

How can you directly compute the clockwise angle between two vectors in both two and three dimensions?

ベクトル間の時計回りの角度を計算する直接的な方法

2 次元ベクトルを扱う場合、行列式を使用して時計回りの角度を直接計算できます。そしてドット積。ドット積はコサインに関する情報を提供し、行列式は角度のサインを明らかにします。 atan2 関数を利用すると、次のように時計回りの角度を取得できます。

dot = x1*x2 + y1*y2  # Dot product of [x1, y1] and [x2, y2]
det = x1*y2 - y1*x2  # Determinant
angle = atan2(det, dot)  # Clockwise angle

角度の向きは座標系と一致していることに注意してください。右手系 (x が右、y が下) の場合、時計回りの角度は正の値を生成します。入力の順序を逆にすると、角度の符号が変わります。

3 次元では、ベクトルが任意の平面に沿って存在する可能性があり、回転軸も任意です。一般に、角度は正と見なされ、軸は正の角度に向けられます。正規化されたベクトル間のドット積によって角度を決定できます:

dot = x1*x2 + y1*y2 + z1*z2  # Dot product of [x1, y1, z1] and [x2, y2, z2]
lenSq1 = x1*x1 + y1*y1 + z1*z1  # Squared length of vector 1
lenSq2 = x2*x2 + y2*y2 + z2*z2  # Squared length of vector 2
angle = acos(dot/sqrt(lenSq1 * lenSq2))  # Clockwise angle

ベクトルが既知の平面内に存在する場合、平面の法線ベクトルを行列式に組み込むことによって、修正された 2D 計算を使用できます:

dot = x1*x2 + y1*y2 + z1*z2
det = n * (v1 × v2)  # Triple product
angle = atan2(det, dot)

n は単位長の法線ベクトルです。

調整が必要な場合があります角度が希望の範囲内に収まることを確認します (例: [0、360°])。負の結果に 2π を加算するか、atan2(-det, -dot) π を使用すると、それに応じて角度を調整できます。

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

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