向量几何提供了(至少)两个有用的公式来找到两个向量之间的角度:
![](https://wikimedia.org/api/rest_v1/media/math/render/svg/f578afaa0ed0f3728d4a6546d11b95456ec84647)
其中a·b
可以使用以下方法计算
![](https://wikimedia.org/api/rest_v1/media/math/render/svg/5bd0b488ad92250b4e7c2f8ac92f700f8aefddd5)
![](https://wikimedia.org/api/rest_v1/media/math/render/svg/c490692f825bfe3206e550b5a4701289e7103be0)
在哪里
![](https://wikimedia.org/api/rest_v1/media/math/render/svg/cb09ebf107d09964f8fe4090c9840c26fbc60ed9)
由于我们的向量是二维的,因此可以将a3
和b3
(在z轴方向上的分量)设为0。这进一步简化了公式:
|a x b| = |a1 * b2 - a2 * b1| = |a| * |b| * sin(ϴ)
这两个公式都属于θ,但解释不同。对于点积,角度是两个向量之间的夹角 -- 因此始终为0到π之间的值。
对于叉积,角度是从a到b逆时针方向的测量角度。由于你要寻找顺时针方向的角度,只需反转使用叉积公式得到的角度的符号即可。
在Python中,math.asin返回范围为[-pi/2, pi/2]的值,而math.acos返回范围为[0, pi]的值。由于你想要在范围[-pi/2, pi/2](以弧度为单位)内获得角度,因此叉积公式似乎是更有前途的候选者:
import math
class Vect:
def __init__(self, a, b):
self.a = a
self.b = b
def findClockwiseAngle(self, other):
return -math.degrees(math.asin((self.a * other.b - self.b * other.a)/(self.length()*other.length())))
def length(self):
return math.sqrt(self.a**2 + self.b**2)
vector1 = Vect(2,0)
N = 12
theta = [i * 2 * math.pi / N for i in range(N)]
result = []
for t in theta:
vector2 = Vect(math.cos(t), math.sin(t))
angle = vector1.findClockwiseAngle(vector2)
result.append((math.degrees(t), angle))
print('{:>10}{:>10}'.format('t', 'angle'))
print('\n'.join(['{:>10.2f}{:>10.2f}'.format(*pair) for pair in result]))
打印
t angle
0.00 -0.00
30.00 -30.00
60.00 -60.00
90.00 -90.00
120.00 -60.00
150.00 -30.00
180.00 -0.00
210.00 30.00
240.00 60.00
270.00 90.00
300.00 60.00
330.00 30.00
以上,t
是从vector1
到vector2
的角度,以逆时针方向在(0, 360)度范围内测量。 angle
是从vector1
到vector2
的角度,以顺时针方向测量,并在(-90, 90)度范围内。