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


$ include "seed7_05.s7i";
  include "float.s7i";
 
const type: vec3 is new struct
    var float: x is 0.0;
    var float: y is 0.0;
    var float: z is 0.0;
  end struct;
 
const func vec3: vec3 (in float: x, in float: y, in float: z) is func
  result
    var vec3: aVector is vec3.value;
  begin
    aVector.x := x;
    aVector.y := y;
    aVector.z := z;
  end func;
 
$ syntax expr: .(). dot .() is -> 6;
const func float: (in vec3: a) dot (in vec3: b) is
  return a.x*b.x + a.y*b.y + a.z*b.z;
 
$ syntax expr: .(). X .() is -> 6;
const func vec3: (in vec3: a) X (in vec3: b) is
  return vec3(a.y*b.z - a.z*b.y,
              a.z*b.x - a.x*b.z,
              a.x*b.y - a.y*b.x);
 
const func string: str (in vec3: v) is
  return "(" <& v.x <& ", " <& v.y <& ", " <& v.z <& ")";
 
enable_output(vec3);
 
const func float: scalarTriple (in vec3: a, in vec3: b, in vec3: c) is
  return a dot (b X c);
 
const func vec3: vectorTriple (in vec3: a, in vec3: b, in vec3: c) is
  return a X (b X c);
 
const proc: main is func
  local
    const vec3: a is vec3(3.0, 4.0, 5.0);
    const vec3: b is vec3(4.0, 3.0, 5.0);
    const vec3: c is vec3(-5.0, -12.0, -13.0);
  begin
    writeln("a = " <& a <& ", b = " <& b <& ", c = " <& c);
    writeln("a . b      = " <& a dot b);
    writeln("a x b      = " <& a X b);
    writeln("a .(b x c) = " <& scalarTriple(a, b, c));
    writeln("a x(b x c) = " <& vectorTriple(a, b, c));
  end func;