/*
 * Author: Paul Koshevoy
 * m3x3.java  Wed, Jan 14 1998, 11:30:00 1998
 */

public class m3x3
{
public double m[][];

public m3x3(double M[][])
    {
	m = M;
    }
    
// k-axis of rotation, th - angle theta
public m3x3(v3x1 k, double th)
    {
	m = new double[3][3];
	double sth = (double)(Math.sin(th));// sine theta
	double cth = (double)(Math.cos(th));// cosine theta
	double vth = 1 - cth;     // versine theta

	m[0][0] = k.x*k.x*vth + cth;
	m[0][1] = k.x*k.y*vth - k.z*sth;
	m[0][2] = k.x*k.z*vth + k.y*sth;

	m[1][0] = k.x*k.y*vth + k.z*sth;
	m[1][1] = k.y*k.y*vth + cth;
	m[1][2] = k.y*k.z*vth - k.x*sth;

	m[2][0] = k.x*k.z*vth - k.y*sth;
	m[2][1] = k.y*k.z*vth + k.x*sth;
	m[2][2] = k.z*k.z*vth + cth;
    }

public static m3x3 rotx(double th)
    {
	return (new m3x3(new v3x1(1, 0, 0), th));
    }

public static m3x3 roty(double th)
    {
	return (new m3x3(new v3x1(0, 1, 0), th));
    }

public static m3x3 rotz(double th)
    {
	return (new m3x3(new v3x1(0, 0, 1), th));
    }

public v3x1 times(v3x1 v)
    {
	return (new v3x1(m[0][0]*v.x + m[0][1]*v.y + m[0][2]*v.z,
			 m[1][0]*v.x + m[1][1]*v.y + m[1][2]*v.z,
			 m[2][0]*v.x + m[2][1]*v.y + m[2][2]*v.z));
    }

public m3x3 times(m3x3 MATRIX)
    {
	double M[][] = new double[3][3];
	for(int row=0; row<3; row++)
	    for(int col=0; col<3; col++)
		{
		    double temp = 0;
		    for(int i=0; i<3; i++)
			temp+=m[row][i]*MATRIX.m[i][col];
		    M[row][col] = temp;
		}
	return (new m3x3(M));
    }
}

