Index of Functions: A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X 
Index Page
vsepg

Table of contents
Procedure
Abstract
Required_Reading
Keywords
Declarations
Brief_I/O
Detailed_Input
Detailed_Output
Parameters
Exceptions
Files
Particulars
Examples
Restrictions
Literature_References
Author_and_Institution
Version

Procedure

     VSEPG ( Angular separation of vectors, general dimension )

     DOUBLE PRECISION FUNCTION VSEPG ( V1, V2, NDIM )

Abstract

     Find the separation angle in radians between two double precision
     vectors of arbitrary dimension. This angle is defined as zero if
     either vector is zero.

Required_Reading

     None.

Keywords

     ANGLE
     VECTOR

Declarations

     IMPLICIT NONE

     DOUBLE PRECISION   V1 ( * )
     DOUBLE PRECISION   V2 ( * )
     INTEGER            NDIM

Brief_I/O

     VARIABLE  I/O  DESCRIPTION
     --------  ---  --------------------------------------------------
     V1         I   First vector.
     V2         I   Second vector.
     NDIM       I   The number of elements in V1 and V2.

     The function returns the angle between V1 and V2 expressed in
     radians.

Detailed_Input

     V1,
     V2       are two double precision vectors of arbitrary dimension.
              Either V1 or V2, or both, may be the zero vector.

              An implicit assumption exists that V1 and V2 are
              specified in the same reference space. If this is not
              the case, the numerical result of this routine has no
              meaning.

     NDIM     is the dimension of both V1 and V2.

Detailed_Output

     The function returns the angle between V1 and V2 expressed in
     radians.

     VSEPG is strictly non-negative. For input vectors of four or more
     dimensions, the angle is defined as the generalization of the
     definition for three dimensions. If either V1 or V2 is the zero
     vector, then VSEPG is defined to be 0 radians.

Parameters

     None.

Exceptions

     Error free.

Files

     None.

Particulars

     In four or more dimensions this angle does not have a physically
     realizable interpretation. However, the angle is defined as
     the generalization of the following definition which is valid in
     three or two dimensions:

        In the plane, it is a simple matter to calculate the angle
        between two vectors once the two vectors have been made to be
        unit length. Then, since the two vectors form the two equal
        sides of an isosceles triangle, the length of the third side
        is given by the expression

           LENGTH = 2.0 * SIN ( VSEPG/2.0 )

        The length is given by the magnitude of the difference of the
        two unit vectors

           LENGTH = NORM ( U1 - U2 )

        Once the length is found, the value of VSEPG may be calculated
        by inverting the first expression given above as

           VSEPG = 2.0 * ARCSIN ( LENGTH/2.0 )

        This expression becomes increasingly unstable when VSEPG gets
        larger than PI/2 radians or 90 degrees. In this situation
        (which is easily detected by determining the sign of the dot
        product of V1 and V2) the supplementary angle is calculated
        first and then VSEPG is given by

           VSEPG = PI - SUPPLEMENTARY_ANGLE

Examples

     The numerical results shown for this example may differ across
     platforms. The results depend on the SPICE kernels used as
     input, the compiler and supporting libraries, and the machine
     specific arithmetic implementation.

     1) Define two sets of n-dimensional vectors and compute the
        angular separation between each vector in first set and the
        corresponding vector in the second set.


        Example code begins here.


              PROGRAM VSEPG_EX1
              IMPLICIT NONE

        C
        C     SPICELIB functions.
        C
              DOUBLE PRECISION      VSEPG

        C
        C     Local parameters.
        C
              INTEGER               NDIM
              PARAMETER           ( NDIM   = 4 )

              INTEGER               SETSIZ
              PARAMETER           ( SETSIZ = 3 )

        C
        C     Local variables.
        C
              DOUBLE PRECISION      V1   ( NDIM, SETSIZ )
              DOUBLE PRECISION      V2   ( NDIM, SETSIZ )

              INTEGER               I
              INTEGER               J

        C
        C     Define the two vector sets.
        C
              DATA                  V1 /
             .                      1.D0,  0.D0,  0.D0,  0.D0,
             .                      1.D0,  0.D0,  0.D0,  0.D0,
             .                      3.D0,  0.D0,  0.D0,  0.D0   /

              DATA                  V2 /
             .                      1.D0,  0.D0,  0.D0,  0.D0,
             .                      0.D0,  1.D0,  0.D0,  0.D0,
             .                     -5.D0,  0.D0,  0.D0,  0.D0  /

        C
        C     Calculate the angular separation between each pair
        C     of vectors.
        C
              DO I=1, SETSIZ

                 WRITE(*,'(A,4F6.1)')  'First vector            : ',
             .                        ( V1(J,I), J=1,NDIM )
                 WRITE(*,'(A,4F6.1)')  'Second vector           : ',
             .                        ( V2(J,I), J=1,NDIM )
                 WRITE(*,'(A,F15.10)') 'Angular separation (rad): ',
             .                VSEPG ( V1(1,I), V2(1,I), NDIM )
                 WRITE(*,*)

              END DO

              END


        When this program was executed on a Mac/Intel/gfortran/64-bit
        platform, the output was:


        First vector            :    1.0   0.0   0.0   0.0
        Second vector           :    1.0   0.0   0.0   0.0
        Angular separation (rad):    0.0000000000

        First vector            :    1.0   0.0   0.0   0.0
        Second vector           :    0.0   1.0   0.0   0.0
        Angular separation (rad):    1.5707963268

        First vector            :    3.0   0.0   0.0   0.0
        Second vector           :   -5.0   0.0   0.0   0.0
        Angular separation (rad):    3.1415926536

Restrictions

     1)  The user is required to insure that the input vectors will not
         cause floating point overflow upon calculation of the vector
         dot product since no error detection or correction code is
         implemented. In practice, this is not a significant
         restriction.

Literature_References

     None.

Author_and_Institution

     C.A. Curzon        (JPL)
     J. Diaz del Rio    (ODC Space)
     K.R. Gehringer     (JPL)
     H.A. Neilan        (JPL)
     W.L. Taber         (JPL)

Version

    SPICELIB Version 1.2.0, 06-JUL-2021 (JDR)

        Added IMPLICIT NONE statement.

        Edited the header to comply with NAIF standard. Removed
        unnecessary $Revisions section.

        Added complete code example based on existing example.

    SPICELIB Version 1.1.0, 29-FEB-1996 (KRG)

        The declaration for the SPICELIB function PI is now
        preceded by an EXTERNAL statement declaring PI to be an
        external function. This removes a conflict with any
        compilers that have a PI intrinsic function.

    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 (CAC) (HAN)
Fri Dec 31 18:37:06 2021