rot_a_to_b

plasmapy.formulary.mathematics.rot_a_to_b(a: ndarray, b: ndarray) ndarray[source]

Calculates the 3D rotation matrix that will rotate vector a to be aligned with vector b.

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. If a 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. If b is not normalized, then it will be.

Returns:

R – The rotation matrix that will rotate vector a onto vector b.

Return type:

ndarray, shape (3,3)