矢量之间的 2D 角度.负数为向上和向右



我正在研究一些 2D 数学,我发现我在 up(0, 1)right(1, 0) 之间得到的角度是-90的,除非我疯了或在这里错过了什么,否则这似乎是错误的。我希望+90.我希望这里有人可以帮助我进行健全性检查。

这是我正在使用的实现:

GetAngle(a, b) = atan2(Cross(a, b), Dot(a, b))

哪里:

Cross(a, b) = (a.x * b.y) - (a.y * b.x)
Dot(a, b) = (a.x * b.x) + (a.y * b.y)

由于右手规则,它应该是-90度。根据你的计算:

a = (0, 1)
b = (1, 0)
Cross(a,b) = 0 * 0 - 1 * 1 = -1 = sin(angle)
Dot(a,b) = 0 * 1 + 1 * 0 = 0 = cos(angle)

因此

GetAngle(a,b) = atan2(-1, 0) = -90 degrees

请注意,atan2(y,x)tan^-1(y/x)GetAngle公式基于以下事实:叉积定义为a X b = ||a||||b||sin(angle between a and b),点积定义为a . b = ||a||||b||cos(angle between a and b)

希望这有帮助。

我知道

这是一个老问题,但是:

要计算两个向量

之间的角度,使符号告诉您另一个向量是向右还是向左(即负表示它在左边,正向右(,您可以计算两个向量之间的差异atan2然后像这样更正它们:

def angleVec2(d, v):
    a_1 = math.atan2(d[1], d[0])
    a_2 = math.atan2(v[1], v[0])
    diff = a_2 - a_1
    if diff < -math.pi:
        diff = math.pi-(abs(diff)-math.pi)
    elif diff > math.pi:
        diff = -math.pi+(abs(diff)-math.pi)
    return diff

相关内容

  • 没有找到相关文章

最新更新