from astropy.coordinates import Angle
import numpy as np
from numpy import cos, sin
__all__ = ["rotation_matrix_2d", "length", "normalise", "angle"]
[docs]def rotation_matrix_2d(angle):
"""construct a 2D rotation matrix as a numpy NDArray that rotates a
vector clockwise. Angle should be any object that can be converted
into an `astropy.coordinates.Angle`
"""
psi = Angle(angle).rad
return np.array([[cos(psi), -sin(psi)], [sin(psi), cos(psi)]])
[docs]def length(vec):
""" returns the length/norm of a numpy array
as the square root of the inner product with itself
"""
return vec.dot(vec) ** 0.5
[docs]def normalise(vec):
""" Sets the length of the vector to 1
without changing its direction
Parameters
----------
vec : numpy array
Returns
-------
numpy array with the same direction but length of 1
"""
try:
return vec / length(vec)
except ZeroDivisionError:
return vec
[docs]def angle(v1, v2):
""" computes the angle between two vectors
assuming carthesian coordinates
Parameters
----------
v1 : numpy array
v2 : numpy array
Returns
-------
the angle between v1 and v2 as a dimensioned astropy quantity
"""
norm = np.linalg.norm(v1) * np.linalg.norm(v2)
return np.arccos(np.clip(v1.dot(v2) / norm, -1.0, 1.0))