ホームページ > バックエンド開発 > C++ > 2 つのベクトル間の時計回りの角度を計算する方法: 内積を超えて?

2 つのベクトル間の時計回りの角度を計算する方法: 内積を超えて?

DDD
リリース: 2024-11-19 04:34:02
オリジナル
632 人が閲覧しました

How to Calculate the Clockwise Angle Between Two Vectors: Beyond the Dot Product?

ベクトル間の時計回りの角度の計算: 古典的なアプローチを超えて

2 つのベクトル間の角度を計算する古典的な方法は、ドット積に依存します。内角 (0 ~ 180 度) のみを提供します。望ましい時計回りの角度を直接取得するために、行列式を利用する別のアプローチを検討します。

2D ベクトル

2D 領域では、行列式は、行列式に比例する値を表します。角度の正弦。したがって、次を使用して角度を計算できます。

dot = x1*x2 + y1*y2 
det = x1*y2 - y1*x2 
angle = atan2(det, dot)
ログイン後にコピー

結果の角度は座標系の方向と一致し、時計回りの回転では正の値が得られます。入力ベクトルを入れ替えると、符号が反転します。

3D ベクトル

3D ベクトルの場合、回転軸が未定義のままであり、通常は正の角度を選択します。正規化されたドット積は、適切な尺度を提供します。

dot = x1*x2 + y1*y2 + z1*z2
lenSq1 = x1*x1 + y1*y1 + z1*z1
lenSq2 = x2*x2 + y2*y2 + z2*z2
angle = acos(dot/sqrt(lenSq1 * lenSq2))
ログイン後にコピー

3D に埋め込まれた平面

ベクトルが既知の法線ベクトル 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)
ログイン後にコピー

範囲0 – 360°

一般的な atan2 実装は、[-π, π] ラジアンの範囲の角度を返します。希望の範囲 [0, 2π] ラジアンの角度を取得するには、負の結果に 2π を加算するだけです。あるいは、無条件に atan2(-det, -dot) π を使用します。

以上が2 つのベクトル間の時計回りの角度を計算する方法: 内積を超えて?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート