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


 
: 3f!    ( &v - ) ( f: x y z - ) dup float+ dup float+ f! f! f! ;
 
: Vector \ Compiletime: ( f: x y z - ) ( <name> - )
   create here [ 3 floats ] literal allot 3f! ; \ Runtime: ( - &v )
 
: >fx@    ( &v - ) ( f: - n ) postpone f@ ; immediate
: >fy@    ( &v - ) ( f: - n ) float+ f@ ;
: >fz@    ( &v - ) ( f: - n ) float+ float+ f@ ;
: .Vector ( &v - ) dup >fz@ dup >fy@ >fx@ f. f. f. ;
 
: Dot*    ( &v1 &v2 - ) ( f - DotPrd )
   2dup >fx@  >fx@ f*
   2dup >fy@  >fy@ f* f+
        >fz@  >fz@ f* f+ ;
 
: Cross*  ( &v1 &v2 &vResult - )
   >r 2dup >fz@  >fy@ f*
      2dup >fy@  >fz@ f* f-
      2dup >fx@  >fz@ f*
      2dup >fz@  >fx@ f* f-
      2dup >fy@  >fx@ f*
           >fx@  >fy@ f* f-
   r> 3f! ;
 
: ScalarTriple* ( &v1 &v2 &v3 - ) ( f: - ScalarTriple* )
   >r pad Cross* pad r> Dot* ;
 
: VectorTriple* ( &v1 &v2 &v3 &vDest - )
   >r swap r@ Cross* r> tuck Cross* ;
 
 3e   4e   5e Vector A
 4e   3e   5e Vector B
-5e -12e -13e Vector C
 
cr
cr .( a . b = ) A B Dot* f.
cr .( a x b = ) A B pad Cross* pad .Vector
cr .( a . [b x c] = ) A B C ScalarTriple* f.
cr .( a x [b x c] = ) A B C pad VectorTriple* pad .Vector 