import java.text.DecimalFormat; /** * Matrix transforms and composites for homogeneous coords points in 3D. *

* For CSU540 Computer Graphics class, Spring 2005 * CCIS, Northeastern University *

* Consists of a single 4x4 double matrix, mat, and various static methods. *
* Method names ending with "Same" alter the matrix argument. * Others return a copy. * @author Bob Futrelle * @version 26 January 2005 */ public class Mat { /** * The only (non-static) field, a 4x4 array. */ public double[][] mat; /** * Tests and prints results of all methods (all are static) */ public static void main(String[] args) { Mat mat1 = new Mat(); System.out.println("Unit matrix is: " + mat1); Mat trans = Mat.transMat(1.0, 2.0, 3.0); // could omit "Mat." in this context System.out.println("Translation matrix: " + trans); Vec vec = new Vec(); vec.vec[0] = 5.0; vec.vec[1] = 5.0; vec.vec[2] = 5.0; System.out.println("Vector to be translated is: " + vec); Vec translated = Mat.matrixXvector(trans, vec); System.out.println("Translated vec is: " + translated); Mat trans2 = Mat.transMat(7.0, 11.0, 15.0); // could omit "Mat." in this context System.out.println("Second translation matrix: " + trans2); Mat transProduct = Mat.matrixXmatrix(trans,trans2); System.out.println("Product of two translations, should be additive:" + transProduct); } /** * Lists all 16 elements of the matrix. */ public String toString(){ String str = ""; // there's no way to format with aligned leading blanks :-( DecimalFormat nnnn = new DecimalFormat( "0.0000"); // outer loop over rows for (int j=0; j < 4; j++) {str += "\n| "; // inner loop over columns for(int k=0; k < 4; k++) str += " " + nnnn.format(mat[j][k]) + " "; str += "|"; } return str; } // toString() for Mat /** * Creates unit matrix with homogeneous 4th row, column elements */ public Mat () { mat = new double[][] {{1.0,0.0,0.0,0.0}, {0.0,1.0,0.0,0.0}, {0.0,0.0,1.0,0.0}, {0.0,0.0,0.0,1.0}}; } /** * Creates an empty matrix with 1.0 in 3,3 lower corner */ public static Mat emptyMat() { Mat emptyMat = new Mat(); for(int diag=0; diag < 3; diag++) // zero out diagonals of unit matrix emptyMat.mat[diag][diag] = 0.0; return emptyMat; } /** * Creates a translation matrix with displacements tx, ty, tz. */ public static Mat transMat(double tx, double ty, double tz) { Mat trans = new Mat(); trans.mat[0][3] = tx; trans.mat[1][3] = ty; trans.mat[2][3] = tz; return trans; } /** * Creates a rotation matrix around x axis. * TO BE COMPLETED */ public static Mat rotxMat(double theta) { Mat rotX = new Mat(); // TO BE COMPLETED return rotX; } /** * Creates a rotation matrix around y axis. * TO BE COMPLETED */ public static Mat rotyMat(double theta) { Mat rotY = new Mat(); // TO BE COMPLETED return rotY; } /** * Creates a rotation matrix around z axis. * TO BE COMPLETED */ public static Mat rotzMat(double theta) { Mat rotZ = new Mat(); // TO BE COMPLETED return rotZ; } /** * Creates a scaling matrix. * TO BE COMPLETED */ public static Mat scaleMat(double s1, double s2, double s3) { Mat scaleMat = new Mat(); // TO BE COMPLETED return scaleMat; } /** * Matrix x vector ==> vector * @return The resulting vector */ public static Vec matrixXvector(Mat mat, Vec v){ Vec vecResult = new Vec(); for(int m = 0 ; m < 3; m++) // 4th element will remain 1.0 for(int n=0; n < 4; n++) vecResult.vec[m] += mat.mat[m][n]*v.vec[n]; return vecResult; } /** * Matrix product * @return The product of the two matrices */ public static Mat matrixXmatrix(Mat m1, Mat m2){ Mat matResult = Mat.emptyMat(); for(int row = 0 ; row < 3; row++) // last row will not change for(int col=0; col < 4; col++) for(int tmp=0; tmp < 4;tmp++) matResult.mat[row][col] += m1.mat[row][tmp]*m2.mat[tmp][col]; return matResult; } } // end class Mat