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