繁体   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