去年我在一所学校的 C++ 游戏开发类(class)中了解到,要找到两个 vector 之间的角度,您可以使用以下方法:
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]);
}
这似乎更容易实现...我的问题是,当第二种方法更简单时,为什么人们更喜欢一种方法而不是第二种方法?
编辑:只是为了确保: 如果 vector a 为 [100, 100], vector b 为 [300, 300],则方法 2 返回 0.78539819 弧度,是否正确?
最佳答案
一个我觉得有用的方法:
// 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);
关于c++ - 寻找两个 vector 之间角度的不同方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13984154/