0

我试图从另一个向量中找到最接近所提供角度的集合中的 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 吗?最好的方法是检查 360 并返回 0 我猜。

我的问题是我无法计算出通过的角度(例如 90 度)和从getBearing. 我什至不确定退回的轴承是否在所有情况下都是正确的。

任何人都可以帮助纠正我的轴承方法中任何明显的错误,并提出一种方法来区分两个轴承吗?我一直在网上寻找,但是有很多方法可以做到,其中大部分都以其他语言显示。

谢谢。

4

3 回答 3

3

如果你需要的只是找到最接近某个角度的向量,你可以按照@swtdrgn方法;相反,如果您确实需要计算两个向量之间的角度差,则可以利用点积的一个简单属性:

点积几何定义

其中 theta 是两个向量之间的角度;因此,反转公式,你得到:

上面公式的逆

于 2012-12-26T16:18:39.643 回答
2

我建议采用正在比较的两个向量并进行单位点积。最近的方位应该是最大的,1 是最大值(意味着向量指向相同的方向),-1 是最小值(意味着向量指向相反的方向)。

于 2012-12-26T16:02:38.840 回答
0

我现在找到了解决方案。我花了好几个小时试图解决这个问题,我终于在问 SO 几分钟后才解决这个问题,典型的。可能有更好的方法可以做到这一点,所以我仍然愿意接受其他答案的建议。

目前我仍在使用问题中的方位法,它总是返回一个 0 到 360 之间的值。然后我得到返回值和指定角度之间的差异,就像这样。

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

这将返回一个正浮点数,用于测量两个向量之间方位角之间的距离(以度为单位)。@swtdrgn 的回答建议使用两个向量的点积,这可能比我的方位法简单得多,因为我实际上不需要角度,我只需要差异。

于 2012-12-26T16:09:00.730 回答