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


﻿bundle Default {
  class VectorProduct {
    function : Main(args : String[]) ~ Nil {
      a := Vector3D->New(3.0, 4.0, 5.0);
      b := Vector3D->New(4.0, 3.0, 5.0);
      c := Vector3D->New(-5.0, -12.0, -13.0);
 
      a->Dot(b)->Print();
      a->Cross(b)->Print();
      a->ScaleTrip(b, c)->Print();
      a->VectorTrip(b, c)->Print();
    }
  }
 
  class Vector3D {
    @a : Float;
    @b : Float;
    @c : Float;
 
    New(a : Float, b : Float, c : Float) {
      @a := a;
      @b := b;
      @c := c;
    }
 
    method :  GetA() ~ Float {
      return @a;
    }
 
    method : GetB() ~ Float {
      return @b;
    }
 
    method : GetC() ~ Float {
      return @c;
    }
 
    method : public : Dot(vec : Vector3D) ~ Float {
      return @a * vec->GetA() + @b * vec->GetB() + @c * vec->GetC();
    }
 
    method : public : Cross(vec : Vector3D) ~ Vector3D {
      newA := @b * vec->GetC() - @c * vec->GetB();
      newB := @c * vec->GetA() - @a * vec->GetC();
      newC := @a * vec->GetB() - @b * vec->GetA();
 
      return Vector3D->New(newA, newB, newC);
    }  
 
    method : public : ScaleTrip(vec_b: Vector3D, vec_c : Vector3D) ~ Float {
      return Dot(vec_b->Cross(vec_c));
    }
 
    method : public : Print() ~ Nil {
      IO.Console->Print('<')->Print(@a)->Print(" ,")
        ->Print(@b)->Print(", ")->Print(@c)->PrintLine('>');  
    }
 
    method : public : VectorTrip(vec_b: Vector3D, vec_c : Vector3D) ~ Vector3D {
      return Cross(vec_b->Cross(vec_c));
    }
  }
}
 