| insang | 
| 
        Table of contents 
       Procedure
     INSANG ( Inside Tetrahedral Angle )
     SUBROUTINE INSANG ( V, E1, E2, E3, FOUND, SCALE )
Abstract
     Determine 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_Reading
     None.
Keywords
     VECTOR
Declarations
     IMPLICIT NONE
     DOUBLE PRECISION      V     ( 3 )
     DOUBLE PRECISION      E1    ( 3 )
     DOUBLE PRECISION      E2    ( 3 )
     DOUBLE PRECISION      E3    ( 3 )
     LOGICAL               FOUND
     DOUBLE PRECISION      SCALE
Brief_I/O
     VARIABLE  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_Input
     V        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_Output
     FOUND    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.
Parameters
     None.
Exceptions
     Error 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.
Files
     None.
Particulars
     Given 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.
Examples
     Suppose 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
Restrictions
     1)  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_References
     None.
Author_and_Institution
     N.J. Bachman       (JPL)
     J. Diaz del Rio    (ODC Space)
     W.L. Taber         (JPL)
Version
    SPICELIB 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