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;  }  
