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


#> Vector3 Class <#
class Vector3 {
	construct=func(self,x,y,z){
		self:x=x;
		self:y=y;
		self:z=z;
	};
	ToString=func(self){
		send self.x+", "+self.y+", "+self.z;
	};
	Magnitude=func(self){
		send math.sqrt((self.x^2)+(self.y^2)+(self.z^2));
	};
	Normalize=func(self){
		set Mag = self::Magnitude();
		send new Vector3 with [self.x/Mag,self.y/Mag,self.z/Mag];
	};
	Dot=func(self,v2){
		send (self.x*v2.x)+(self.y*v2.y)+(self.z*v2.z);
	};
	__add=func(self,x){
		if (type(x)=="object"){
			send new Vector3 with [self.x+x.x,self.y+x.y,self.z+x.z];
		} else {
			send new Vector3 with [self.x+x,self.y+x,self.z+x];
		}
	};
	__sub=func(self,x){
		if (type(x)=="object"){
			send new Vector3 with [self.x-x.x,self.y-x.y,self.z-x.z];
		} else {
			send new Vector3 with [self.x-x,self.y-x,self.z-x];
		}
	};
	__mul=func(self,x){
		if (type(x)=="object"){
			send new Vector3 with [self.x*x.x,self.y*x.y,self.z*x.z];
		} else {
			send new Vector3 with [self.x*x,self.y*x,self.z*x];
		}
	};
	__div=func(self,x){
		if (type(x)=="object"){
			send new Vector3 with [self.x/x.x,self.y/x.y,self.z/x.z];
		} else {
			send new Vector3 with [self.x/x,self.y/x,self.z/x];
		}
	};
	__pow=func(self,x){
		if (type(x)=="object"){
			send new Vector3 with [self.x^x.x,self.y^x.y,self.z^x.z];
		} else {
			send new Vector3 with [self.x^x,self.y^x,self.z^x];
		}
	};
	__mod=func(self,x){
		if (type(x)=="object"){
			send new Vector3 with [self.x%x.x,self.y%x.y,self.z%x.z];
		} else {
			send new Vector3 with [self.x%x,self.y%x,self.z%x];
		}
	};
	Reflect=func(self,v2){
		set Normal = self::Normalize();
		set Direction = v2::Normalize();
		send (Normal*(2*Normal::Dot(Direction)))-Direction;
	};
	Cross=func(self,v2){
		send new Vector3 with [(self.y*v2.z)-(self.z*v2.y),(self.z*v2.x)-(self.x*v2.z),(self.x*v2.y)-(self.y*v2.x)];
	};
}
 
math:deg=func(x){
	send x*(180/math.PI);
}
 
math:rad=func(x){
	send x*(math.PI/180);
}
 
set a = new Vector3 with [3,4,5];
set b = new Vector3 with [4,3,5];
set c = new Vector3 with [-5,-12,-13];
 
log("Dot: ",a::Dot(b));
log("Cross: ",a::Cross(b)::ToString());
log("Scalar Triple: ",a::Dot(b::Cross(c)));
log("Vector Triple: ",a::Cross(b::Cross(c))::ToString());