package hep.physics.vec;
import hep.physics.matrix.Matrix;
import hep.physics.matrix.MatrixOp;
import hep.physics.matrix.MatrixOp.InvalidMatrixException;
import hep.physics.matrix.MutableMatrix;
import java.io.Serializable;
/**
* 3x3 matrices for Hep3Vector operations.
*
* @author Gary Bower
* @version $Id: BasicHep3Matrix.java 9201 2006-10-23 17:42:09Z tonyj $
*/
public class BasicHep3Matrix implements Hep3Matrix, MutableMatrix, Serializable
{
static final long serialVersionUID = 1113014806324139899L;
private double[][] m_dmat;
//
public BasicHep3Matrix()
{
m_dmat = new double[3][3];
}
public BasicHep3Matrix(double e11, double e12, double e13,
double e21, double e22, double e23,
double e31, double e32, double e33)
{
m_dmat = new double[3][3];
m_dmat[0][0] = e11;
m_dmat[0][1] = e12;
m_dmat[0][2] = e13;
m_dmat[1][0] = e21;
m_dmat[1][1] = e22;
m_dmat[1][2] = e23;
m_dmat[2][0] = e31;
m_dmat[2][1] = e32;
m_dmat[2][2] = e33;
}
public BasicHep3Matrix(Matrix m) throws InvalidMatrixException
{
if (m.getNColumns() != 3 || m.getNRows() != 3) throw new InvalidMatrixException("Not 3x3 matrix");
m_dmat = new double[3][3];
m_dmat[0][0] = m.e(0,0);
m_dmat[0][1] = m.e(0,1);
m_dmat[0][2] = m.e(0,2);
m_dmat[1][0] = m.e(1,0);
m_dmat[1][1] = m.e(1,1);
m_dmat[1][2] = m.e(1,2);
m_dmat[2][0] = m.e(2,0);
m_dmat[2][1] = m.e(2,1);
m_dmat[2][2] = m.e(2,2);
}
/**
* Returns the (row, column) element
*/
public double e(int row, int column)
{
return m_dmat[row][column];
}
/**
* Returns the determinent of the matrix.
*/
public double det()
{
double cofact1 = m_dmat[1][1]*m_dmat[2][2] - m_dmat[1][2]*m_dmat[2][1];
double cofact2 = m_dmat[0][1]*m_dmat[2][2] - m_dmat[0][2]*m_dmat[2][1];
double cofact3 = m_dmat[0][1]*m_dmat[1][2] - m_dmat[0][2]*m_dmat[1][1];
return m_dmat[0][0]*cofact1 - m_dmat[1][0]*cofact2 + m_dmat[2][0]*cofact3;
}
/**
* Returns the trace of the matrix.
*/
public double trace()
{
return m_dmat[0][0] + m_dmat[1][1] + m_dmat[2][2];
}
/**
* Sets the (row, column) element
*/
public void setElement( int row, int column, double value)
{
m_dmat[row][column] = value;
}
/**
* Defines a rotation matrix via Euler angles. A "passive" rotation
* matrix rotates the coordinate system, an "active" one rotates the
* vector(body). The angles are defined for a right handed coordinate
* system. They are defined by counterclockwise rotations about an
* axis by the right hand rule, ie, looking down the axis in the
* negative direction the transvers axes are seen to rotate
* counterclockwise. To define passive(active) angles first rotate the
* coordinates(body) about the z-axis by phi, then about the new x-axis
* by theta then about the new z-axis by psi.
* Angles in radians.
*/
public void setPassiveEuler( double phi, double theta, double psi)
{
double cth = Math.cos(theta);
double sth = Math.sin(theta);
double cphi = Math.cos(phi);
double sphi = Math.sin(phi);
double cpsi = Math.cos(psi);
double spsi = Math.sin(psi);
m_dmat[0][0] = cpsi*cphi - cth*sphi*spsi;
m_dmat[0][1] = cpsi*sphi + cth*cphi*spsi;
m_dmat[0][2] = spsi*sth;
m_dmat[1][0] = -spsi*cphi - cth*sphi*cpsi;
m_dmat[1][1] = -spsi*sphi + cth*cphi*cpsi;
m_dmat[1][2] = cpsi*sth;
m_dmat[2][0] = sth*sphi;
m_dmat[2][1] = -sth*cphi;
m_dmat[2][2] = cth;
}
/**
* Defines a rotation matrix via Euler angles. A "passive" rotation
* matrix rotates the coordinate system, an "active" one rotates the
* vector(body). The angles are defined for a right handed coordinate
* system. They are defined by counterclockwise rotations about an
* axis by the right hand rule, ie, looking down the axis in the
* negative direction the transvers axes are seen to rotate
* counterclockwise. To define passive(active) angles first rotate the
* coordinates(body) about the z-axis by phi, then about the new x-axis
* by theta then about the new z-axis by psi.
* Angles in radians.
*/
public void setActiveEuler( double phi, double theta, double psi)
{
double cth = Math.cos(theta);
double sth = Math.sin(theta);
double cphi = Math.cos(phi);
double sphi = Math.sin(phi);
double cpsi = Math.cos(psi);
double spsi = Math.sin(psi);
m_dmat[0][0] = cpsi*cphi - cth*sphi*spsi;
m_dmat[1][0] = cpsi*sphi + cth*cphi*spsi;
m_dmat[2][0] = spsi*sth;
m_dmat[0][1] = -spsi*cphi - cth*sphi*cpsi;
m_dmat[1][1] = -spsi*sphi + cth*cphi*cpsi;
m_dmat[2][1] = cpsi*sth;
m_dmat[0][2] = sth*sphi;
m_dmat[1][2] = -sth*cphi;
m_dmat[2][2] = cth;
}
public static BasicHep3Matrix identity()
{
BasicHep3Matrix result = new BasicHep3Matrix();
result.m_dmat[0][0] = 1;
result.m_dmat[1][1] = 1;
result.m_dmat[2][2] = 1;
return result;
}
public String toString()
{
return VecOp.toString(this);
}
public int getNRows()
{
return 3;
}
public int getNColumns()
{
return 3;
}
public void invert() throws MatrixOp.IndeterminateMatrixException
{
MatrixOp.inverse(this,this);
}
public void transpose()
{
double t = m_dmat[0][1];
m_dmat[0][1] = m_dmat[1][0];
m_dmat[1][0] = t;
t = m_dmat[0][2];
m_dmat[0][2] = m_dmat[2][0];
m_dmat[2][0] = t;
t = m_dmat[1][2];
m_dmat[1][2] = m_dmat[2][1];
m_dmat[2][1] = t;
}
}