找到两个矢量之间角度的不同方法

时间:2012-12-21 04:11:28

标签: c++ 2d

去年我在一所学校,在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弧度,这是正确的吗?

4 个答案:

答案 0 :(得分:2)

我发现可用的方法:

        // 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);

答案 1 :(得分:2)

第二种方法计算b和a(b-a)的几何差矢量,并返回该差与X轴之间的角度。显然,这个角度并不等于a和b之间的角度。

答案 2 :(得分:1)

acosf来源与atanf2f来源进行比较,看看实施方面的差异。后者使用的表格可能对某些系统不可行。

答案 3 :(得分:0)

您可以使用复数进行二维矢量计算。复数的乘法可以看作是正旋转,而划分为负旋转。我们想要使用除法,因为它的作用是从另一个角度中减去一个角度:

#include <complex>

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

    complex<double> a, b;

    double angle = arg(a/b);

    return 0;
}