insang |
Table of contents
ProcedureINSANG ( Inside Tetrahedral Angle ) SUBROUTINE INSANG ( V, E1, E2, E3, FOUND, SCALE ) AbstractDetermine if a given vector lies inside the solid tetrahedral angle determined by 3 vectors. If it does, return the point where the scale factor such that SCALE*V lies in the plane spanned by E1, E2, and E3. Required_ReadingNone. KeywordsVECTOR DeclarationsIMPLICIT NONE DOUBLE PRECISION V ( 3 ) DOUBLE PRECISION E1 ( 3 ) DOUBLE PRECISION E2 ( 3 ) DOUBLE PRECISION E3 ( 3 ) LOGICAL FOUND DOUBLE PRECISION SCALE Brief_I/OVARIABLE I/O DESCRIPTION -------- --- -------------------------------------------------- V I Vector to test for "betweenness" E1 I First edge of the tetrahedral angle E2 I Second edge of the tetrahedral angle E3 I Third edge of the tetrahedral angle FOUND O Indicates whether V lies in the solid angle SCALE O Scale times V is in the triangle E1,E2,E3 Detailed_InputV is a 3-vector. This is the vector to test to see if it lies between the 3 vectors E1, E2 and E3 E1, E2, E3 are the three edges of a solid tetrahedral angle. (See particulars for a discussion of the solid angle). Detailed_OutputFOUND indicates that V lies inside the solid tetrahedral angle determined by E1, E2 and E3. SCALE if V lies inside the solid tetrahedral angle given by E1, E2 and E3, SCALE*V is the point is the positive scalar multiple of V that pierces the triangle determined by the points E1, E2, E3. ParametersNone. ExceptionsError free. 1) If E1, E2 and E3 are not linearly independent, the routine returns .FALSE. SCALE will be set to 0. 2) If V is the zero vector, the routine returns .FALSE. SCALE will be set to 0. FilesNone. ParticularsGiven 3 linearly independent vectors E1, E2, and E3 the set of vectors a*E1 + b*E2 + c*E3 where a, b, and c are non-negative form a region of space that is a tetrahedral solid angle. If you cut this solid angle with a plane that intersects all three rays from the origin determined by E1, E2 and E3 you will get a tetrahedron (a 4-sided solid with each face a triangle). This routine determines whether the ray associated with a vector V lies inside the tetrahedral angle E1,E2,E3. Moreover, if V lies inside this angle, this routine returns the scale factor SCALE such that the point SCALE*V lies in the plane containing the points E1, E2 and E3. This is necessarily a point in the triangle determined by E1, E2 and E3. ExamplesSuppose you have a triangle in space specified by three vertices P1, P2 and P3 and that an observer at location OBS is looking along the ray emanating from OBS with direction V. Does this ray intersect the triangle P1, P2, P3? Using this routine, you can answer this question and give the point of intersection if there is one. Here's how. First construct the vectors from OBS to the corners of the triangle. CALL VSUB ( P1, OBS, E1 ) CALL VSUB ( P2, OBS, E2 ) CALL VSUB ( P3, OBS, E3 ) Now see if V lies between the vectors E1, E2, E3 and return the intersection point if it does. CALL INSANG ( V, E1, E2, E3, FOUND, SCALE ) If there was an intersection, add SCALE*V to OBS to get the point of intersection. Otherwise say there was no intersection. IF ( FOUND ) THEN CALL VLCOM ( 1.0D0, OBS, SCALE, V, POINT ) WRITE (*,*) 'The ray intersects the triangle at: WRITE (*,*) POINT(1) WRITE (*,*) POINT(2) WRITE (*,*) POINT(3) ELSE WRITE (*,*) 'There is no intersection.' END IF Restrictions1) This routine can suffer from extreme loss of precision if the vectors E1, E2, E3 are too long compared to the lengths of the line segments formed by their pairwise differences. The user of this routine must ensure that the inputs are suitable. Literature_ReferencesNone. Author_and_InstitutionN.J. Bachman (JPL) J. Diaz del Rio (ODC Space) W.L. Taber (JPL) VersionSPICELIB Version 1.0.3, 12-AUG-2021 (JDR) Edited the header to comply with NAIF standard. SPICELIB Version 1.0.2, 02-FEB-2016 (NJB) Fixed comment typos. Updated $Restrictions. SPICELIB Version 1.0.1, 08-OCT-2009 (NJB) Updated header. SPICELIB Version 1.0.0, 09-JUN-1996 (WLT) |
Fri Dec 31 18:36:27 2021