/* * pMatrix.java v0.01 May 16th, 1998 * * A general purpose (rotation and translation) matrix. * (05/16/1998,05/17/1998) * * Copyright(c) 1998, Alex S, Particle */ import java.lang.String; import java.util.Vector; /** * pMatrix class, to handle all the matrix thingies. * the class represents a 4x4 matrix, with some * useful operations defined on it. * * Note: This thing is Right Handed!; just like OpenGL :-) */ public class pMatrix { /** * the matrix stored as 2D array. */ protected float[][] matrix; protected float[][] matrixinvtrans; /** * the stack to hold working matrices. */ protected static Vector stack; /** * get the stack going... */ static{ stack = new Vector(); } /** * default constructor, initializes the matrix, * and makes sure it's an "intentity" matrix. */ public pMatrix(){ matrix = new float[4][4]; matrixinvtrans = new float[4][4]; ident(); } /** * a copy constructor. * * @param m The matrix to copy. */ public pMatrix(pMatrix m){ matrix = new float[4][4]; for (int i=0;i<4;i++) for (int j=0;j<4;j++) matrix[i][j] = m.matrix[i][j]; } /** * pushes the current matrix onto the stack, * (the current matrix is still there though) */ public void push(){ pMatrix tmp = new pMatrix(this); stack.addElement(tmp.matrix); } /** * pops the last pushed matrix from the stack, * and makes it current. (the previous one is * erased) *
* NOTE: no error checking is performed, you WILL
* get a NoSuchElementException if you're not careful
* and try to pop an empty stack.
*
* @return The freshly poped matrix.
*/
public pMatrix pop(){
matrix = (float[][])stack.lastElement();
stack.removeElement(matrix);
return this;
}
/**
* makes this matrix into an identity matrix.
* (current info of the matrix is erased)
*
* @return Current identity matrix.
*/
public pMatrix ident(){
for (int i=0;i<4;i++)
for (int j=0;j<4;j++)
matrix[i][j] = i == j ? 1:0;
return this;
}
/**
* add another matrix to this one.
* (changes current matrix)
*
* @param m The matrix to add.
* @return The current changed matrix.
*/
public pMatrix add(pMatrix m){
for (int i=0;i<4;i++)
for (int j=0;j<4;j++)
matrix[i][j] += m.matrix[i][j];
return this;
}
/**
* subtract a matrix from this one
* (changes the current matrix)
*
* @param m The matrix to subtract.
* @return The current changed matrix.
*/
public pMatrix sub(pMatrix m){
for (int i=0;i<4;i++)
for (int j=0;j<4;j++)
matrix[i][j] -= m.matrix[i][j];
return this;
}
/**
* get function to the rest of the world.
*
* @param i The column.
* @param j The row.
* @return The location of that row and column.
*/
public float get(int i,int j){
return matrix[i][j];
}
/**
* set function for the rest of the world.
*
* @param i The column.
* @param j The row.
* @param v The value of the new location.
*/
public void set(int i,int j,float v){
matrix[i][j] = v;
}
/**
* function to multiply this matrix by another.
* (the result is a cross multiply of this matrix
* by the parameter matrix.)
* (current matrix changes!)
*
* @param m The matrix to multiply by.
* @return The current changed matrix.
*/
public pMatrix mult(pMatrix m){
pMatrix tmp = new pMatrix(this);
for (int i=0;i<4;i++)
for (int j=0;j<4;j++) {
matrix[i][j] = (float)0.0;
for (int k=0;k<4;k++)
matrix[i][j] += tmp.matrix[i][k] * m.matrix[k][j];
}
return this;
}
/**
* function to transform a vector,
* (a vector consists of a 4 element array of floats,
* the last element of the array is reserved)
*
* @param v The vector to transform.
* @return The transformed vector.
*/
public float[] mult(float[] v){
float[] tmp = new float[4];
int i;
for (i=0;i<4;i++)
tmp[i] = v[i];
for (i=0;i<4;i++) {
v[i] = (float)0.0;
for (int j=0;j<4;j++)
v[i] += matrix[i][j] * tmp[j];
}
return v;
}
/**
* function to transform a vector,
* (a vector consists of a 4 element array of floats,
* the last element of the array is reserved)
*
* @param v The vector to transform.
* @return The transformed vector.
*/
public float[] multinvtrans(float[] v){
float[] tmp = new float[4];
int i;
for (i=0;i<4;i++)
tmp[i] = v[i];
for (i=0;i<4;i++) {
v[i] = (float)0.0;
for (int j=0;j<4;j++)
v[i] += matrixinvtrans[i][j] * tmp[j];
}
return v;
}
/**
* function to transform an array of vectors...
*
* @param a The array of arrays of vectors.
* @return The transformed array...
*/
public float[][] mult(float[][] a){
for (int i=0;i