簡體   English   中英

計算兩個向量之間的方位,然后將其與通過角度進行比較

[英]Calculating the bearing between two vectors then diff that against a passed angle

我正在嘗試從另一個向量中最接近提供的角度的集合中找到2D向量。

因此,如果我有v(10, 10)並且我想沿90度角找到最接近的其他矢量,則應該找到v(20, 10) 我寫了一種方法,我認為它可以返回兩個向量之間的正確方位。

float getBearing(
    const sf::Vector2f& a, const sf::Vector2f& b)
{
    float degs = atan2f(b.y - a.y, b.x - a.x) * (180 / M_PI);
    return (degs > 0.0f ? degs : (360.0f + degs)) + 90.0f;
}

這似乎可行,盡管如果我將一個放在另一個之上,則返回180(可以)和360(僅是奇數)。 如果正好在0之上,它不應該返回0嗎? 最好的方法是檢查360並返回0。

我的問題是我無法計算出通過角度(例如90度)與從getBearing返回的角度之間的getBearing 我什至不確定在所有情況下返回的軸承是否正確。

誰能幫助糾正我的軸承方法中任何明顯的錯誤,並提出一種方法來獲得兩個軸承之間的差異? 我一直在通過互聯網尋找東西,但是有很多方法可以做到,其中大多數以其他語言顯示。

謝謝。

如果只需要查找最接近某個角度的向量,則可以使用@swtdrgn方法; 相反,如果您實際上需要計算兩個向量之間的角度差,則可以利用點積的簡單屬性:

點積幾何定義

其中,θ是兩個向量之間的夾角; 因此,將公式取反,您將得到:

上面公式的逆

我建議采用被比較的兩個向量,並做一個單位點積。 最接近的方位應該最大,1表示最大值(表示向量指向相同的方向),-1表示最小值(表示向量指向相反的方向)。

我現在已經找到了解決方案。 我花了好幾個小時來嘗試解決這個問題,最終在問了典型的SO之后幾分鍾就完成了。 這樣做可能會有更好的方法,因此我仍然願意接受其他答案的建議。

目前,我仍然使用問題中的方位角方法,該方法將始終返回0到360之間的值。然后,我將獲得返回值與指定角度之間的差,如下所示。

fabs(fmodf(getBearing(vectorA, vectorB) + 180 - angle, 360) - 180);

這將返回一個正浮點,該浮點將度量兩個矢量之間的方位之間的距離(以度為單位)。 @swtdrgn的答案建議使用兩個向量的點積,這可能比我的方位方法簡單得多,因為我實際上不需要角度,我只需要差值即可。

暫無
暫無

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

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