A vector is defined as having three dimensions as being represented by an ordered collection of three numbers:   (X, Y, Z).

If you imagine a graph with the   x   and   y   axis being at right angles to each other and having a third,   z   axis coming out of the page, then a triplet of numbers,   (X, Y, Z)   would represent a point in the region,   and a vector from the origin to the point.

Given the vectors:

        A = (a1,  a2,  a3) 
        B = (b1,  b2,  b3) 
        C = (c1,  c2,  c3) 

then the following common vector products are defined:

 The dot product       (a scalar quantity)
  A • B = a1b1   +   a2b2   +   a3b3  
 The cross product       (a vector quantity)
  A x B = (a2b3  -   a3b2,     a3b1   -   a1b3,     a1b2   -   a2b1)  
 The scalar triple product       (a scalar quantity)
  A • (B x C) 
 The vector triple product       (a vector quantity)
  A x (B x C) 


Task

Given the three vectors:

        a = ( 3,    4,    5)
        b = ( 4,    3,    5)
        c = (-5,  -12,  -13)

 Create a named function/subroutine/method to compute the dot product of two vectors.
 Create a function to compute the cross product of two vectors.
 Optionally create a function to compute the scalar triple product of three vectors.
 Optionally create a function to compute the vector triple product of three vectors.
 Compute and display: a • b
 Compute and display: a x b
 Compute and display: a • (b x c), the scalar triple product.
 Compute and display: a x (b x c), the vector triple product.


References

   A starting page on Wolfram MathWorld is   Vector Multiplication .
   Wikipedia   dot product. 
   Wikipedia   cross product. 
   Wikipedia   triple product.


Related tasks

   Dot product
   Quaternion type


BEGIN
 
    CLASS VECTOR(I,J,K); REAL I,J,K;;
 
    REAL PROCEDURE DOTPRODUCT(A,B); REF(VECTOR) A,B;
        DOTPRODUCT := A.I*B.I+A.J*B.J+A.K*B.K;
 
    REF(VECTOR) PROCEDURE CROSSPRODUCT(A,B); REF(VECTOR) A,B;
        CROSSPRODUCT :- NEW VECTOR(A.J*B.K - A.K*B.J,
                                   A.K*B.I - A.I*B.K,
                                   A.I*B.J - A.J*B.I);
 
    REAL PROCEDURE SCALARTRIPLEPRODUCT(A,B,C); REF(VECTOR) A,B,C;
        SCALARTRIPLEPRODUCT := DOTPRODUCT(A,CROSSPRODUCT(B,C));
 
    REF(VECTOR) PROCEDURE VECTORTRIPLEPRODUCT(A,B,C); REF(VECTOR) A,B,C;
        VECTORTRIPLEPRODUCT :- CROSSPRODUCT(A,CROSSPRODUCT(B,C));
 
    PROCEDURE OUTR(X); REAL X;
        OUTFIX(X,6,0);
 
    PROCEDURE OUTVECTOR(A); REF(VECTOR) A;
    BEGIN
        OUTTEXT("(");  OUTR(A.I);
        OUTTEXT(", "); OUTR(A.J);
        OUTTEXT(", "); OUTR(A.K); OUTTEXT(")");
    END;
 
    BEGIN
        REF(VECTOR) A,B,C;
 
        A :- NEW VECTOR(3, 4, 5);
        B :- NEW VECTOR(4, 3, 5);
        C :- NEW VECTOR(-5, -12, -13);
 
        OUTTEXT("A           = "); OUTVECTOR(A);
        OUTIMAGE;
        OUTTEXT("B           = "); OUTVECTOR(B);
        OUTIMAGE;
        OUTTEXT("C           = "); OUTVECTOR(C);
        OUTIMAGE;
        OUTTEXT("A . B       = "); OUTR(DOTPRODUCT(A,B));
        OUTIMAGE;
        OUTTEXT("A X B       = "); OUTVECTOR(CROSSPRODUCT(A,B));
        OUTIMAGE;
        OUTTEXT("A . (B X C) = "); OUTR(SCALARTRIPLEPRODUCT(A,B,C));
        OUTIMAGE;
        OUTTEXT("A X (B X C) = "); OUTVECTOR(VECTORTRIPLEPRODUCT(A,B,C));
        OUTIMAGE;
    END;
END;