去年我在一所学校的 C++ 游戏开发课上学到,要找到两个向量之间的角度,可以使用以下方法:
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]);
}
这似乎更容易实现......我的问题是,当第二种方法更简单时,为什么一种方法会优于第二种方法?
编辑:只是为了确保:如果向量 a 是 [100, 100] 并且向量 b 是 [300, 300] 那么方法 2 返回 0.78539819 弧度,这是正确的吗?