surfpt |
Table of contents
ProcedureSURFPT ( Surface point on an ellipsoid ) SUBROUTINE SURFPT ( POSITN, U, A, B, C, POINT, FOUND ) AbstractDetermine the intersection of a line-of-sight vector with the surface of an ellipsoid. Required_ReadingNone. KeywordsELLIPSOID GEOMETRY DeclarationsIMPLICIT NONE DOUBLE PRECISION POSITN ( 3 ) DOUBLE PRECISION U ( 3 ) DOUBLE PRECISION A DOUBLE PRECISION B DOUBLE PRECISION C DOUBLE PRECISION POINT ( 3 ) LOGICAL FOUND Brief_I/OVARIABLE I/O DESCRIPTION -------- --- -------------------------------------------------- POSITN I Position of the observer in body-fixed frame. U I Vector from the observer in some direction. A I Length of ellipsoid semi-axis along the x-axis. B I Length of ellipsoid semi-axis along the y-axis. C I Length of ellipsoid semi-axis along the z-axis. POINT O Point on the ellipsoid pointed to by U. FOUND O Flag indicating if U points at the ellipsoid. Detailed_InputPOSITN is a 3-vector giving the position of an observer with respect to the center of an ellipsoid. The vector is expressed in a body-fixed reference frame. The semi-axes of the ellipsoid are aligned with the X, Y, and Z-axes of the body-fixed frame. U is a pointing 3-vector emanating from the observer. A is the length of the semi-axis of the ellipsoid that is parallel to the X-axis of the body-fixed reference frame. B is the length of the semi-axis of the ellipsoid that is parallel to the Y-axis of the body-fixed reference frame. C is the length of the semi-axis of the ellipsoid that is parallel to the Z-axis of the body-fixed reference frame. Detailed_OutputPOINT is the position of the intercept of the input ray, defined by the direction vector U emanating from POSITN, on the surface of the input ellipsoid. If the ray intersects the ellipsoid, POINT will be returned with the body-fixed coordinates of the point where the ray first meets the ellipsoid. Otherwise, POINT will be returned as (0, 0, 0). FOUND is a logical flag indicating whether or not the ray from POSITN with direction U actually intersects the ellipsoid. If the ray does intersect the ellipsoid, FOUND will be returned as .TRUE. If the ray misses the ellipsoid, FOUND will be returned as .FALSE. ParametersNone. Exceptions1) If the input vector is the zero vector, the error SPICE(ZEROVECTOR) is signaled. 2) If any of the body's axes is zero, the error SPICE(BADAXISLENGTH) is signaled. FilesNone. ParticularsThis routine assumes that an ellipsoid having semi-axes of length A, B and C is given. Moreover, it is assumed that these axes are parallel to the X-, Y-, and Z-axes of a reference frame whose origin is the geometric center of the ellipsoid---this is called the body-fixed reference frame. ExamplesA typical use of SURFPT would be to obtain the planetocentric coordinates of the point at which the optic axis of a spacecraft-mounted instrument intersects the surface of a target body, given the following items. 1) The epoch (ET) of observation, and the inertial pointing (VPNT) of the instrument at this epoch. 2) The apparent position (VTARG) of the center of the target body as seen from the spacecraft at the epoch of observation, and the one-way light time (TAU) from the target to the spacecraft. In order to find the point of intersection, the following items are also needed. 3) The transformation (TIBF) from inertial to body-fixed coordinates at epoch ET-TAU. 4) The radii (R) of the tri-axial ellipsoid used to model the target body. These may be obtained from the kernel pool via calls to PXFORM and BODVRD or BODVCD respectively. The position of the observer is just the negative of the spacecraft-target vector, VTARG, computed using the VMINUS module. (Note that this is NOT the same as the apparent position of the spacecraft as seen from the target!) Both vectors must be specified in the body-fixed reference frame. The point of intersection is found as follows: CALL VMINUS ( VTARG, VPOS ) CALL MXV ( TIBF, VPOS, VPOS ) CALL MXV ( TIBF, VPNT, VPNT ) CALL SURFPT ( VPOS, VPNT, R(1), R(2), R(3), VSURF, FOUND ) Note that VSURF may or may not be a point of intersection, depending on whether FOUND is .TRUE. or .FALSE. Note also that VSURF is a vector from the center to the surface of the target, in body-fixed coordinates, which may be converted directly to planetocentric latitude, longitude, and radius: CALL RECLAT ( VSURF, RADIUS, LONG, LAT ) To get the inertial vector from the spacecraft to the surface point, you must subtract VPOS from VSURF, and rotate the resulting vector back to inertial coordinates: CALL VSUB ( VSURF, VPOS, VSURF ) CALL MTXV ( TIBF, VSURF, VSURF ) RestrictionsNone. Literature_ReferencesNone. Author_and_InstitutionC.H. Acton (JPL) N.J. Bachman (JPL) J. Diaz del Rio (ODC Space) W.L. Taber (JPL) VersionSPICELIB Version 1.4.0, 25-MAY-2021 (JDR) Added IMPLICIT NONE statement. Edited the header to comply with NAIF standard. Improved "POINT" argument description. SPICELIB Version 1.3.0, 03-APR-2006 (NJB) Bug fix: intercept point is now always set to the ray's vertex when the vertex is on the ellipsoid's surface. This routine now uses discovery check-in. SPICELIB Version 1.2.2, 24-OCT-2005 (NJB) Updated header to refer to BODVRD and BODVCD instead of BODVAR. SPICELIB Version 1.2.1, 27-JUL-2003 (NJB) (CHA) Various header corrections were made. The example program was upgraded to use real kernels, and the program's output is shown. SPICELIB Version 1.2.0, 28-NOV-2002 (NJB) Re-implemented intercept computation to reduce loss of precision. Changed SAVE statement to save only the error message. Previously all local variables were saved. SPICELIB Version 1.1.0, 07-AUG-1996 (WLT) Added a SAVE statement so that the error message will not be lost between separate invocations of the routine. SPICELIB Version 1.0.1, 10-MAR-1992 (WLT) Comment section for permuted index source lines was added following the header. SPICELIB Version 1.0.0, 31-JAN-1990 (WLT) |
Fri Dec 31 18:36:58 2021