0

昨年、学校の C++ ゲーム開発クラスで、次の方法を使用して 2 つのベクトル間の角度を見つけることができることを学びました。

vec2_t は次のように定義されます: typedef float vec2_t[2]; vec[0] = x および vec[1] = y

float VectorAngle(vec2_t a, vec2_t b)
{
    vec2_t vUp;
    vec2_t vRight;
    vec2_t vDir;
    float dot, side, angle;

    VectorCopy(vUp, a);
    VectorNormalize(vUp);

    VectorInit(vRight, -vUp[1], vUp[0]);

    VectorCopy(vDir, b);
    VectorNormalize(vDir);

    dot = VectorDot(vUp, vDir);
    side = VectorDot(vRight, vDir);
    angle = acosf(dot);

    if(side < 0.0f)
        angle *= -1.0f;

    return angle;
}

それから昨日、他の何かの解決策を探しているときに、代わりにこの方法を使用できることがわかりました:

float VectorAngle(vec2_t a, vec2_t b)
{
    return atan2f(b[1]-a[1], b[0]-a[0]);
}

これは実装がはるかに簡単に思えます...私の質問は、2番目の方法がはるかに単純であるのに、2番目の方法よりも1つの方法を好むのはなぜですか?

編集: 念のため: ベクトル a が [100, 100] でベクトル b が [300, 300] の場合、メソッド 2 は 0.78539819 ラジアンを返しますが、これは正しいですか?

4

4 に答える 4

3

私が使えると思う方法:

        // cross product
        double y = (v1[0] * v2[1]) - (v2[0] * v1[1]);

        // dot product
        double x = (v1[0] * v2[0]) + (v1[1] * v2[1]);

        return atan2(y, x);
于 2012-12-21T04:33:19.100 に答える
2

2番目の方法は、bとa(ba)の幾何学的差ベクトルを計算し、この差とX軸の間の角度を返します。明らかに、このような角度はaとbの間の角度と一般的に等しくありません。

于 2012-12-21T05:53:56.677 に答える
1

acosfソースとatanf2fソースを比較して、実装の違いを確認してください。後者は、一部のシステムでは実行不可能なテーブルを使用します。

于 2012-12-21T04:30:35.583 に答える
0

2次元ベクトルの計算には複素数を使用できます。複素数の乗算は正の回転と見なされ、除算は負の回転と見なされます。ある角度を他の角度から引くように機能する除算を使用します。

#include <complex>

int main() {
    using std::complex;
    using std::arg;

    complex<double> a, b;

    double angle = arg(a/b);

    return 0;
}
于 2012-12-21T08:49:53.197 に答える