rot_a_to_b
- plasmapy.formulary.mathematics.rot_a_to_b(a: ndarray, b: ndarray) ndarray
Calculates the 3D rotation matrix that will rotate vector
a
to be aligned with vectorb
.The rotation matrix is calculated as follows. Let
\[\vec v = \vec a \times \vec b\]and let \(\theta\) be the angle between \(\vec a\) and \(\vec b\) such that the projection of \(\vec a\) along \(\vec b\) is
\[c = \vec a \cdot \vec b \cos\theta\]Then the rotation matrix \(R\) is
\[R = I + v_x + v_x^2 \frac{1}{1 + c}\]where \(I\) is the identity matrix and \(v_x\) is the skew-symmetric cross-product matrix of \(v\) defined as
\[\begin{split}v_x = \begin{bmatrix} 0 & -v_3 & v_2 \\ v_3 & 0 & -v_1 \\ -v_2 & v_1 & 0 \end{bmatrix}\end{split}\]Note that this algorithm fails when \(1+c=0\), which occurs when \(a\) and \(b\) are anti-parallel. However, since the correct rotation matrix in this case is simply \(R=-I\), this function just handles this special case explicitly.
This algorithm is based on this discussion on StackExchange.
- Parameters:
a (
ndarray
, shape (3,)) – Vector to be rotated. Should be a 1D, 3-element unit vector. Ifa
is not normalized, then it will be normalized.b (
ndarray
, shape (3,)) – Vector representing the desired orientation after rotation. Should be a 1D, 3-element unit vector. Ifb
is not normalized, then it will be.
- Returns:
R – The rotation matrix that will rotate vector
a
onto vectorb
.- Return type:
ndarray
, shape (3,3)