package Geometry;

public class Matrix3x3
{
	public Matrix3x3()
	{
		initArray();
		matrix[0][0] =1;
		matrix[1][1] =1;
		matrix[2][2] =1;
	}

	public Matrix3x3(Matrix3x3 copy)
	{
		this.matrix = (double[][])copy.matrix.clone();
	}
	
	public Matrix3x3(int v11, int v12, int v13, 
			int v21, int v22, int v23, 
			int v31, int v32, int v33)
	{
		initArray();

		matrix[0][0] = v11;
		matrix[0][1] = v12;
		matrix[0][2] = v13;

		matrix[1][0] = v21;
		matrix[1][1] = v22;
		matrix[1][2] = v23;

		matrix[2][0] = v31;
		matrix[2][1] = v32;
		matrix[2][2] = v33;

	}

	public Matrix3x3 add(Matrix3x3 rhs)
	{
		Matrix3x3 retval = new Matrix3x3();

		for(int i=0; i<3; i++)
			for(int j=0; j<3; j++)
				retval.matrix[i][j] = matrix[i][j] + rhs.matrix[i][j];	

		return retval;
	}

	public Matrix3x3 sub(Matrix3x3 rhs)
	{
		Matrix3x3 retval = new Matrix3x3();

		for(int i=0; i<3; i++)
			for(int j=0; j<3; j++)
				retval.matrix[i][j] = matrix[i][j] - rhs.matrix[i][j];	

		return retval;
	}

	public Matrix3x3 mul(double c)
	{
		Matrix3x3 retval = new Matrix3x3();
		for(int i=0; i<3; i++)
			for(int j=0; j<3; j++)
				retval.matrix[i][j] = c*matrix[i][j];
		return retval;
	}

	public Matrix3x3 div(double c)
	{
		Matrix3x3 retval = new Matrix3x3();
		for(int i=0; i<3; i++)
			for(int j=0; j<3; j++)
				retval.matrix[i][j] = matrix[i][j]/c;
		return retval;
	}

	public Vector3 mul(Vector3 vec)
	{
		Vector3 retval = new Vector3();
		for(int i=0; i<3; i++)
		{
			retval.xyz[i] = 0;
			for(int j=0; j<3; j++)
				retval.xyz[i] += vec.xyz[j]*matrix[i][j];
		}
		
		return retval;
	}

	public Matrix3x3 mul(Matrix3x3 mat)
	{
		Matrix3x3 retval = new Matrix3x3();
		for(int i=0; i<3; i++)
		{
			for(int j=0; j<3; j++)
			{
				retval.matrix[i][j] = 0;
				for(int k=0; k<3; k++)
				{
					retval.matrix[i][j] += matrix[i][k]*mat.matrix[k][j];
				}
			}
		}
		return retval;
	}

	public double[][] array()
	{
		return (double[][])matrix.clone();
	}

	private void initArray()
	{
		matrix = new double[3][];
		matrix[0] = new double[3];
		matrix[1] = new double[3];
		matrix[2] = new double[3];
	}

	public Matrix3x3 translate(double dx, double dy)
	{
		Matrix3x3 trn = new Matrix3x3();
		trn.matrix[0][2] = dx;
		trn.matrix[1][2] = dy;
		return trn.mul(this);

		/*
		Matrix3x3 ret = new Matrix3x3(this);
		ret.matrix[0][2] += dx;
		ret.matrix[1][2] += dy;
		return ret;
		*/
	}

	public Matrix3x3 scale(double scaleX, double scaleY)
	{
		//Matrix3x3 ret = new Matrix3x3(this);

		Matrix3x3 scl = new Matrix3x3();
		scl.matrix[0][0] = scaleX;
		scl.matrix[1][1] = scaleY;
		return scl.mul(this);
		
		/*
		ret.matrix[0][0] *= scaleX;
		ret.matrix[0][1] *= scaleX;
		ret.matrix[0][2] *= scaleX;

		ret.matrix[1][0] *= scaleY;
		ret.matrix[1][1] *= scaleY;
		ret.matrix[1][2] *= scaleY;
		*/
		
	}
	
	public Matrix3x3 rotate(double degtheta)
	{
		double theta = /*radtheta * 180.0 / Math.PI;*/ degtheta * Math.PI / 180.0;
		Matrix3x3 rot = new Matrix3x3();
		rot.matrix[0][0] = rot.matrix[1][1] = Math.cos(theta);
		rot.matrix[0][1] = Math.sin(theta);
		rot.matrix[1][0] = -rot.matrix[0][1];
		return rot.mul(this);
	}
	
	/*package*/ double[][] matrix;

}


