向量之间的二维角度。负向上和向右?

2D angle between vectors. Negative for up and right?

我正在研究一些二维数学,我发现 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