原理:将2维向量扩展到3维向量,求叉乘得到新向量,检查新向量的第三维坐标是正的还是负的,即可判断角度属于0-180还是180-360
import numpy as np
def calc_angle_2(v1, v2):
'''
支持大于180度计算
:param v1:
:param v2:
:return:
'''
r = np.arccos(np.dot(v1, v2) / (np.linalg.norm(v1, 2) * np.linalg.norm(v2, 2)))
deg = r * 180 / np.pi
a1 = np.array([*v1, 0])
a2 = np.array([*v2, 0])
a3 = np.cross(a1, a2)
if np.sign(a3[2]) > 0:
deg = 360 - deg
return deg
print(calc_angle_2([0, 1], [1, 0]))
# 输出90
print(calc_angle_2([1, 0], [0, 1]))
# 输出270
print(calc_angle_2([1, 0], [-1, 0]))
# 输出180