c++ - 寻找两个 vector 之间角度的不同方法

标签 c++ 2d

去年我在一所学校的 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/

相关文章:

android - AndEngine - 我是否尝试尽可能使用一点 map 集?

c - 段错误 C(1d 数组到 2d 数组并返回)

java - 如何用java画简单的眼睛

c++ - 为什么在将 extern const (int) 包含在头文件中时不需要为其赋值?在 C++ 中

c++ - 使用类对象对双端队列进行排序

android - opengl中android fingerpaint的例子?

c++ - 在 C++ 中搜索二维数组以查看一行/列是否与另一行/列相同

c++ - 在不接触类的情况下添加转换构造函数

c++ - I/O流与外部设备有什么关系

c++ - 使用 XPath 在 QDomDocument 中搜索节点