我正在研究一些 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