Numpy's arctan2(y, x)
will compute the counterclockwise angle (a value in radians between -π and π) between the origin and the point (x, y)
.
You could do this for your points A
and B
, then subtract the second angle from the first to get the signed clockwise angular difference. This difference will be between -2π and 2π, so in order to get a positive angle between 0 and 2π you could then take the modulo against 2π. Finally you can convert radians to degrees using np.rad2deg
.
import numpy as np
def angle_between(p1, p2):
ang1 = np.arctan2(*p1[::-1])
ang2 = np.arctan2(*p2[::-1])
return np.rad2deg((ang1 - ang2) % (2 * np.pi))
For example:
A = (1, 0)
B = (1, -1)
print(angle_between(A, B))
# 45.
print(angle_between(B, A))
# 315.
If you don't want to use numpy, you could use math.atan2
in place of np.arctan2
, and use math.degrees
(or just multiply by 180 / math.pi
) in order to convert from radians to degrees. One advantage of the numpy version is that you can also pass two (2, ...)
arrays for p1
and p2
in order to compute the angles between multiple pairs of points in a vectorized way.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…