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


TYPE Vector=[INT x,y,z]
 
PROC CreateVector(INT vx,vy,vz Vector POINTER v)
  v.x=vx v.y=vy v.z=vz
RETURN
 
PROC PrintVector(Vector POINTER v)
  PrintF("(%I,%I,%I)",v.x,v.y,v.z)
RETURN
 
INT FUNC DotProduct(Vector POINTER v1,v2)
  INT res
 
  res=v1.x*v2.x    ;calculation split into parts
  res==+v1.y*v2.y  ;otherwise incorrect result
  res==+v1.z*v2.z  ;is returned
RETURN (res)
 
PROC CrossProduct(Vector POINTER v1,v2,res)
  res.x=v1.y*v2.z    ;calculation split into parts
  res.x==-v1.z*v2.y  ;otherwise incorrect result
  res.y=v1.z*v2.x    ;is returned
  res.y==-v1.x*v2.z
  res.z=v1.x*v2.y
  res.z==-v1.y*v2.x
RETURN
 
PROC Main()
  Vector a,b,c,d,e
  INT res
 
  CreateVector(3,4,5,a)
  CreateVector(4,3,5,b)
  CreateVector(-5,-12,-13,c)
 
  Print("a=") PrintVector(a) PutE()
  Print("b=") PrintVector(b) PutE()
  Print("c=") PrintVector(c) PutE()
  PutE()
 
  res=DotProduct(a,b)
  PrintF("a.b=%I%E",res)
 
  CrossProduct(a,b,d)
  Print("axb=") PrintVector(d) PutE()
 
  CrossProduct(b,c,d)
  res=DotProduct(a,d)
  PrintF("a.(bxc)=%I%E",res)
 
  CrossProduct(b,c,d)
  CrossProduct(a,d,e)
  Print("ax(bxc)=") PrintVector(e) PutE()
RETURN