public class Matrix3x3 { // PUBLIC ACCESS METHODS public void identity() { doIdentity(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]; } // 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 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]; }