public class Matrix3x3 { // PUBLIC ACCESS METHODS public void identity() { doIdentity(data); } public void rotate( double theta) { doMakeRotation(theta, temp); doMultiply(data, temp, temp2); // postMultiply copyData(temp2, data); } public void makeRotation(double theta) { doMakeRotation(theta, data); } public void scale(double sx, double sy) { doMakeScale(sx, sy, temp); doMultiply(data, temp, temp2); // postMultiply copyData(temp2, data); } public void makeScale(double sx, double sy) { doMakeScale(sx, sy, data); } public void translate(double dx, double dy) { doMakeTranslation(dx, dy, temp); doMultiply(data, temp, temp2); // postMultiply copyData(temp2, data); } public void makeTranslation(double dx, double dy) { doMakeTranslation(dx, dy, data); } public void postMultiply(Matrix3x3 src) { doMultiply(data, src.data, temp); copyData(temp, data); } public void preMultiply(Matrix3x3 src) { doMultiply(src.data, data, temp); copyData(temp, data); } public void transform(double x, double y, double dst[]) { dst[0] = data[0][0] * x + data[0][1] * y + data[0][2]; dst[1] = data[1][0] * x + data[1][1] * y + data[1][2]; } protected boolean setData(double src[][]){ if(src.length!=3) return false; if(src[1].length!=3) return false; for(int i=0; i< 3;i++) for(int j = 0; j < 3;j++) data[i][j] = src[i][j]; return true;//only return true if success; } public Matrix3x3 getCopy(){ Matrix3x3 m = new Matrix3x3(); m.setData(this.data); return m; } public void printData(){ for(int i=0; i< 3;i++){ for(int j = 0; j < 3;j++){ System.out.print (" "+data[i][j]); } System.out.println(); } } // INTERNAL WORKHORSE METHODS protected double data[][] = new double[3][3]; protected static void doIdentity(double data[][]) { for (int i = 0 ; i < 3 ; i++) for (int j = 0 ; j < 3 ; j++) data[i][j] = i == j ? 1 : 0; } protected static void doMakeRotation(double theta, double data[][]) { doIdentity(data); data[0][0] = Math.cos(theta); data[0][1] = -Math.sin(theta); data[1][0] = Math.sin(theta); data[1][1] = Math.cos(theta); } protected static void doMakeScale(double sx, double sy, double data[][]) { doIdentity(data); data[0][0] = sx; data[1][1] = sy; } protected static void doMakeTranslation(double dx, double dy, double data[][]) { doIdentity(data); data[0][2] = dx; data[1][2] = dy; } protected static void doMultiply(double a[][], double b[][], double c[][]) { for (int i = 0 ; i < 3 ; i++) for (int j = 0 ; j < 3 ; j++) c[i][j] = a[i][0] * b[0][j] + a[i][1] * b[1][j] + a[i][2] * b[2][j]; } protected static void copyData(double src[][], double dst[][]) { for (int i = 0 ; i < 3 ; i++) for (int j = 0 ; j < 3 ; j++) dst[i][j] = src[i][j]; } private double temp[][] = new double[3][3]; private double temp2[][] = new double[3][3]; }