簡體   English   中英

尋找兩個向量之間夾角的不同方法

[英]Different methods for finding angle between two vectors

去年,我在一所學校的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弧度,這是正確的嗎?

我覺得可用的方法:

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

第二種方法計算b和a(ba)的幾何差向量,並返回該差與X軸之間的角度。顯然,該角度一般不等於a和b之間的角度。

acosf源代碼與atanf2f源代碼進行比較,以了解實現上的差異。 后者使用的表對於某些系統可能是不可行的。

您可以將復數用於2d向量計算。 復數的乘法可以看作是正旋轉,除法可以看作是負旋轉。 我們要使用除法,因為它的作用是從另一個角度減去一個角度:

#include <complex>

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

    complex<double> a, b;

    double angle = arg(a/b);

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM