昨年、学校の 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 ラジアンを返しますが、これは正しいですか?