www.pudn.com > JAVIS-0.3.zip > Matrix.java


package math;

import math.Vector;

/**
   A mathematical matrix class. Member variables are public to guarantee fast
   access when it is needed.

   @author Christian Nentwich
   @author Steven Vischer
   @version 0.1 02/12/1998
*/

public class Matrix {

    /**
       The contents of the matrix.
    */
    public double m_values[][];

    /**
       Default constructor, initialises the matrix and sets it to the identity
       matrix
    */
    public Matrix() {
        m_values=new double[3][3];
        this.identity();
    }


    /**
       This function will clear the matrix (set all elements to 0)
    */
    public void clear() {
        int i,j;
        for(i=0; i<3; i++) {
            for(j=0; j<3; j++) {
                m_values[i][j]=0;
            }
        }
    }


    /**
       Function to set the matrix to identity, i.e. all elements 0 but elements
       on the diagonal are 1.
    */
    public void identity() {
        int i,j;
        for(i=0; i<3; i++) {

            for(j=0; j<3; j++) {
                if(i==j) m_values[i][j]=1;
                else m_values[i][j]=0;
            }
        }
    }


    /**
       Calculate the determinant of this matrix.
       @return the determinant
    */
    public double determinant() {
      return m_values[0][0]*m_values[1][1]*m_values[2][2]+
	     m_values[0][1]*m_values[1][2]*m_values[2][0]+
	     m_values[0][2]*m_values[1][0]*m_values[2][1]-
	     m_values[0][2]*m_values[1][1]*m_values[2][0]-
	     m_values[0][1]*m_values[1][0]*m_values[2][2]-
	     m_values[0][0]*m_values[1][2]*m_values[2][1];
    }


    /**
       Invert the matrix.
    */
    public void invert() {

    }


    /**
       Translate the matrix. This will add the arguments to the rightmost
       column of the matrix to translate it.

       @param dx the offset to translate horizontally
       @param dy the offset to translate vertically
    */
    public void translate(double dx,double dy) {
      m_values[0][2]+=dx;
      m_values[1][2]+=dy;
    }



    /**
       This will scale the matrix, i.e. multiply its diagonal by these two
       values.

       @param sx amount to scale in x direction
       @param sy amount to scale in y direction
     */
    public void scale(double sx,double sy) {
	m_values[0][0]*=sx;
	m_values[1][1]*=sy;
    }


    /**
       Rotate the matrix using a specified angle. This will create a rotation
       matrix from the angle and then multiply this matrix times the rotation
       matrix.

       @param angle the angle to rotate
       @see #getRotationMatrix
     */
    public void rotate(double angle) {

      Matrix r=getRotationMatrix(angle);

      this.mulMatrixPre(r);
    }


    /**
       This function will generate a rotation matrix from the specified angle
       and return it.

       @param angle the amount to rotate
       @return the rotation matrix
    */
    public static Matrix getRotationMatrix(double angle) {
      Matrix rot=new Matrix();

      rot.m_values[0][0]=Math.cos(angle);
      rot.m_values[0][1]=Math.sin(angle);
      rot.m_values[1][0]=-Math.sin(angle);
      rot.m_values[1][1]=Math.cos(angle);

      return rot;
    }


    /**
       Mutiply this matrix times another matrix and store the result in this
       matrix.

       @param other the matrix to multiply by
    */
    public void mulMatrixPre(Matrix other) {
        
        Matrix res=new Matrix();

	// Multiply matrices into new matrix

        for(int i=0; i<3; i++) {
            
            for(int j=0; j<3; j++) {

	        res.m_values[i][j]=0.0;
                
                for(int x=0; x<3; x++) 
                res.m_values[i][j]+=m_values[i][x]*other.m_values[x][j];
                    
            }
        }

	// Assign result to ourselves
	this.m_values=res.m_values;
    }


    /**
       Multiply another matrix by this matrix and store the result in this
       matrix.

       @param other the matrix to multiply by
    */
    public void mulMatrixPost(Matrix other) {
        
        Matrix res=new Matrix();

	// Multiply matrices into new matrix

        for(int i=0; i<3; i++) {
            
            for(int j=0; j<3; j++) {

	        res.m_values[i][j]=0.0;
                
                for(int x=0; x<3; x++) 
                res.m_values[i][j]+=other.m_values[i][x]*m_values[x][j];
                    
            }
        }

	// Assign result to ourselves
	this.m_values=res.m_values;        
    }


    /**
       Return a copy of this matrix
       @return the copied matrix
    */
    public Matrix copy() {
      Matrix res=new Matrix();

      for (int i=0;i<3;i++)
      for (int j=0;j<3;j++)
      res.m_values[i][j]=m_values[i][j];

      return res;
    }


    /**
       For debugging, support conversion to a string
    */
    public String toString() {
      
      return "("+m_values[0][0]+" "+m_values[0][1]+" "+m_values[0][2]+")\n"+
	     "("+m_values[1][0]+" "+m_values[1][1]+" "+m_values[1][2]+")\n"+
	     "("+m_values[2][0]+" "+m_values[2][1]+" "+m_values[2][2]+")\n";
    }
}