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


Structure vector
  x.f 
  y.f
  z.f
EndStructure
 
;convert vector to a string for display
Procedure.s toString(*v.vector)
  ProcedureReturn "[" + StrF(*v\x, 2) + ", " + StrF(*v\y, 2) + ", " + StrF(*v\z, 2) + "]"
EndProcedure
 
Procedure.f dotProduct(*a.vector, *b.vector)
  ProcedureReturn *a\x * *b\x + *a\y * *b\y + *a\z * *b\z
EndProcedure
 
Procedure crossProduct(*a.vector, *b.vector, *r.vector)
  *r\x = *a\y * *b\z - *a\z * *b\y
  *r\y = *a\z * *b\x - *a\x * *b\z
  *r\z = *a\x * *b\y - *a\y * *b\x
EndProcedure
 
Procedure.f scalarTriple(*a.vector, *b.vector, *c.vector)
  Protected r.vector
  crossProduct(*b, *c, r)
  ProcedureReturn dotProduct(*a, r)
EndProcedure
 
Procedure vectorTriple(*a.vector, *b.vector, *c.vector, *r.vector)
  Protected r.vector
  crossProduct(*b, *c, r)
  crossProduct(*a, r, *r)
EndProcedure
 
If OpenConsole()
  Define.vector a, b, c, r
  a\x = 3: a\y = 4: a\z = 5
  b\x = 4: b\y = 3: b\z = 5
  c\x = -5: c\y = -12: c\z = -13
 
  PrintN("a = " + toString(a) + ", b = " + toString(b) + ", c = " + toString(c))
  PrintN("a . b = " + StrF(dotProduct(a, b), 2))
  crossProduct(a, b, r)
  PrintN("a x b = " + toString(r))
  PrintN("a . b x c  = " + StrF(scalarTriple(a, b, c), 2))
  vectorTriple(a, b, c, r)
  PrintN("a x b x c = " + toString(r))
 
  Print(#CRLF$ + #CRLF$ + "Press ENTER to exit"): Input()
  CloseConsole()
EndIf