import java.awt.*;
import java.applet.*;
import java.lang.*;
import java.util.*;


class Matrix3D
{
	static double tempMatrix[][]=new double[4][4];
	static double temp[][]=new double[4][4];
	
	public static void translate(double matrix[][], double a, double b, double c)
	{
		translationMatrix(tempMatrix,a,b,c);

		multiply(matrix,tempMatrix);

	}
	
	public static void xRotate(double matrix[][], double theta)
	{
		xRotationMatrix(tempMatrix,theta);
		multiply(matrix,tempMatrix);
	}
	
	public static void yRotate(double matrix[][],double theta)
	{
		yRotationMatrix(tempMatrix,theta);
		multiply(matrix,tempMatrix);
	}
	
	public static void zRotate(double matrix[][],double theta)
	{
		zRotationMatrix(tempMatrix,theta);
		multiply(matrix,tempMatrix);
	}
	
	public static void scale(double matrix[][], double a, double b, double c)
	{
		scaleMatrix(tempMatrix,a,b,c);
		multiply(matrix,tempMatrix);
	}
	
	
	public static void transform(double src[], double dst[], double matrix[][])
	{
      	dst[0] = matrix[0][0] * src[0] + matrix[0][1] * src[1] + matrix[0][2] * src[2] + matrix[0][3];
      	dst[1] = matrix[1][0] * src[0] + matrix[1][1] * src[1] + matrix[1][2] * src[2] + matrix[1][3];
      	dst[2] = matrix[2][0] * src[0] + matrix[2][1] * src[1] + matrix[2][2] * src[2] + matrix[2][3];
   	}

	
	public static void translationMatrix(double matrix[][], double a, double b, double c)
	{
		identity(matrix);
		matrix[0][3]=a;
		matrix[1][3]=b;
		matrix[2][3]=c;
		
	}
	
	public static void xRotationMatrix(double matrix[][],double angle)
	{
		identity(matrix);
		matrix[1][1]=Math.cos(angle);
		matrix[1][2]=-(Math.sin(angle));
		matrix[2][1]=Math.sin(angle);
		matrix[2][2]=Math.cos(angle);
		
	}
	
	public static void yRotationMatrix(double matrix[][],double angle)
	{
		identity(matrix);
		matrix[0][0]=Math.cos(angle);
		matrix[0][2]=Math.sin(angle);
		matrix[2][0]=-(Math.sin(angle));
		matrix[2][2]=Math.cos(angle);
	}
	
	public static void zRotationMatrix(double matrix[][],double angle)
	{
		identity(matrix);
		matrix[0][0]=Math.cos(angle);
		matrix[0][1]=-(Math.sin(angle));
		matrix[1][0]=Math.sin(angle);
		matrix[1][1]=Math.cos(angle);
	}	
		
	public static void scaleMatrix(double matrix[][], double a, double b, double c)
	{
		identity(matrix);
		matrix[0][0]=a;
		matrix[1][1]=b;
		matrix[2][2]=c;
	
				
	}
	
	public static void identity(double matrix[][])
	{
		for(int i=0;i<4;i++)
		{
			for(int j=0;j<4;j++)
			{
				if(i==j)
					matrix[i][j]=1;
				else
					matrix[i][j]=0;
			}
		}
	}
	
	public static void multiply(double matrixA[][], double matrixB[][])
	{
		
   				
		copy(matrixA,temp);
		
		for(int i=0;i<4;i++)
		{
			for (int j=0;j<4;j++)
			{
				matrixA[i][j] = temp[i][0]*matrixB[0][j] + temp[i][1]*matrixB[1][j] + temp[i][2]*matrixB[2][j] + temp[i][3]*matrixB[3][j];
			}
		}

		
	}
	
	
	public static void copy(double matrixA[][], double tempMatrix[][])
	{
		
		for (int i=0;i<4;i++)
		{
			for (int j=0;j<4;j++)
			{
				tempMatrix[i][j]=matrixA[i][j];
			}
		}
	}
	
	
	
	
	
	
}

