Ellipsoid.find_limbs

giant.ray_tracer.shapes.ellipsoid:

Ellipsoid.find_limbs(self, scan_center_dir, scan_dirs, observer_position=None)

The method determines the limb points (visible edge of the ellipsoid) that would be an observed for an observer located at observer_position looking toward scan_center_dir along the directions given by scan_dirs.

Typically it is assumed that the location of the observer is at the origin of the current frame and therefore observer_position can be left as None.

The limb for the ellipsoid is found by first solving for the particular solution to the underdetermined system of equations

\[\begin{split}\left[\begin{array}{c} \mathbf{s}_c^T\mathbf{A}_C \\ \left(\mathbf{s}_c\times\mathbf{s}_d\right)^T\end{array}\right]\mathbf{p}_0 = \left[\begin{array}{c} -1 \\ -\left(\mathbf{s}_c\times\mathbf{s}_d\right)^T\mathbf{r} \end{array}\right]\end{split}\]

where \(\mathbf{s}_c\) is scan_center_dir, \(\mathbf{s}_d\) is scan_dirs, and \(\mathbf{r}\) is the vector from the observer to the center of the ellipsoid. Once \(\mathbf{p}_0\) is solved for, the limb can be found by solving the quadratic equation

\[ad^2+bd+c=0\]

where

\[\begin{split}a = \mathbf{p}_h^T\mathbf{A}_C\mathbf{p}_h \\ b = 2\mathbf{p}_0^T\mathbf{A}_C\mathbf{p}_h \\ c = \mathbf{p}_0^T\mathbf{A}_C\mathbf{p}_0 - 1\end{split}\]

and \(\mathbf{p}_h=\mathbf{A}_C\mathbf{r}\times\left(\mathbf{s}_c\times\mathbf{s}_d\right)\).

Given the 2 solutions to the quadratic equation, the 2 possible limb points are found by \(\mathbf{p}_0+d\mathbf{p}_h\). The appropriate solution to use is the one which produces a positive dot product with the scan_dirs.

The returned limbs are expressed as vectors from the observer to the limb point in the current frame.

Parameters:
  • scan_center_dir (np.ndarray) – the unit vector which the scan is to begin at in the current frame as a length 3 array

  • scan_dirs (np.ndarray) – the unit vectors along with the scan is to proceed as a 3xn array in the current frame where each column represents a new limb point we wish to find (should be nearly orthogonal to the scan_center_dir in most cases).

  • observer_position (Optional[np.ndarray]) – The location of the observer in the current frame. If None then it is assumed the observer is at the origin of the current frame

Returns:

the vectors from the observer to the limbs in the current frame as a 3xn array

Return type:

np.ndarray