package Geometry;

public class Vector4
{
	public Vector4()
	{
		xyz[0] = 0;
		xyz[1] = 0;
		xyz[2] = 0;
		xyz[3] = 0;
	}

	public Vector4(double x, double y, double z, double w)
	{
		xyz[0] = x;
		xyz[1] = y;
		xyz[2] = z;
		xyz[3] = w;
	}

	public Vector4(double[] array)
	{
		if(array.length != 4)
			throw new RuntimeException("Must create vector with 3 element array");

		xyz[0] = array[0];
		xyz[1] = array[1];
		xyz[2] = array[2];
		xyz[3] = array[3];
	}
	
	public double[] array()
	{
		return (double[])xyz.clone();
	}

	public Vector4 add(Vector4 rhs)
	{
		return new Vector4(
			xyz[0] + rhs.xyz[0],
			xyz[1] + rhs.xyz[1],
			xyz[2] + rhs.xyz[2],
			xyz[3] + rhs.xyz[3]);
	}

	public Vector4 sub(Vector4 rhs)
	{
		return new Vector4(
			xyz[0] - rhs.xyz[0],
			xyz[1] - rhs.xyz[1],
			xyz[2] - rhs.xyz[2],
			xyz[3] - rhs.xyz[3] );
	}
	
	public Vector4 neg()
	{
		return new Vector4(-xyz[0], -xyz[1], -xyz[2], -xyz[3]);
	}

	public Vector4 mul(double c)
	{
		return new Vector4(c*xyz[0], c*xyz[1], c*xyz[2], c*xyz[3]);
	}

	public Vector4 div(double c)
	{
		return new Vector4(xyz[0]/c, xyz[1]/c, xyz[2]/c, xyz[3]/c);
	}

	public double dot(Vector4 rhs)
	{
		return xyz[0]*rhs.xyz[0] +
			xyz[1]*rhs.xyz[1] +
			xyz[2]*rhs.xyz[2] +
			xyz[3]*rhs.xyz[3];
	}

	public double norm()
	{
		return dot(this);	
	}

	public Vector4 normalize()
	{
		return this.div(norm());
	}
	
	/*package*/ double xyz[] = new double[4];
}

