⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrix4x4.java

📁 一个J2ME的3D 一个J2ME的3D 一个J2ME的3D
💻 JAVA
字号:
/**
 * 
 */
package Math;

/**
 * @author PanXu
 *
 */
public class Matrix4X4 {

	/**
	 * 
	 */
	public float M[][] = null;
	
	public Matrix4X4() {
		super();
		// TODO 自动生成构造函数存根
		M = new float [4][4];
	}
	public Matrix4X4(float m00 ,float m01 ,float m02 ,float m03,
			float m10 , float m11 , float m12 ,float m13,
			float m20 , float m21 , float m22 ,float m23,
			float m30 , float m31 , float m32 ,float m33) {
		super();
		// TODO 自动生成构造函数存根
		M = new float [4][4];
		M[0][0] = m00; M[0][1] = m01 ; M[0][2] = m02; M[0][3] = m03;
		M[1][0] = m10; M[1][1] = m11 ; M[1][2] = m12; M[1][3] = m13;
		M[2][0] = m20; M[2][1] = m21 ; M[2][2] = m22; M[2][3] = m23;
		M[3][0] = m30; M[3][1] = m31 ; M[3][2] = m32; M[3][3] = m33;
	}
	
	public void InitMat4X4(float m00 ,float m01 ,float m02 ,float m03,
			float m10 , float m11 , float m12 ,float m13,
			float m20 , float m21 , float m22 ,float m23,
			float m30 , float m31 , float m32 ,float m33) {
		M[0][0] = m00; M[0][1] = m01 ; M[0][2] = m02; M[0][3] = m03;
		M[1][0] = m10; M[1][1] = m11 ; M[1][2] = m12; M[1][3] = m13;
		M[2][0] = m20; M[2][1] = m21 ; M[2][2] = m22; M[2][3] = m23;
		M[3][0] = m30; M[3][1] = m31 ; M[3][2] = m32; M[3][3] = m33;
	}
	/*
	 * 生成特定矩阵
	 */
	//归零
	public void Set_Zero (){
		M[0][0] = 0f; M[0][1] = 0f ; M[0][2] = 0f; M[0][3] = 0f;
		M[1][0] = 0f; M[1][1] = 0f ; M[1][2] = 0f; M[1][3] = 0f;
		M[2][0] = 0f; M[2][1] = 0f ; M[2][2] = 0f; M[2][3] = 0f;
		M[3][0] = 0f; M[3][1] = 0f ; M[3][2] = 0f; M[3][3] = 0f;
	}
	/**
	 * 单位化矩阵
	 *
	 */
	public void IDENTITY (){
		M[0][0] = 1.0f; M[0][1] = 0f ; M[0][2] = 0f; M[0][3] = 0f;
		M[1][0] = 0f; M[1][1] = 1.0f ; M[1][2] = 0f; M[1][3] = 0f;
		M[2][0] = 0f; M[2][1] = 0f ; M[2][2] = 1.0f; M[2][3] = 0f;
		M[3][0] = 0f; M[3][1] = 0f ; M[3][2] = 0f; M[3][3] = 1.0f;		
	}
	/**
	 * 
	 * @param x 平移分量
	 * @param y
	 * @param z
	 */
	public void Set_MOVMAT (float x , float y , float z)
	{
		M[0][0] = 1.0f; M[0][1] = 0f ; M[0][2] = 0f; M[0][3] = 0f;
		M[1][0] = 0f; M[1][1] = 1.0f ; M[1][2] = 0f; M[1][3] = 0f;
		M[2][0] = 0f; M[2][1] = 0f ; M[2][2] = 1.0f; M[2][3] = 0f;
		M[3][0] = x; M[3][1] = y ; M[3][2] = z; M[3][3] = 1.0f;	
	}
	/**
	 * 
	 * @param x 旋转角度
	 * @param y
	 * @param z
	 */
	public void Set_CIRMAT (int x , int y , int z)
	{
		x %= 360 ;
		y %= 360 ;
		z %= 360 ;
		//单位化
		this .IDENTITY() ;
		
		Matrix4X4 Tm = new Matrix4X4() ;
		Matrix4X4 Tm1 = new Matrix4X4() ;
		
		Tm1.IDENTITY();
		float sin;
		float cos;
		//x
		if (x != 0)
		{
			sin = MathTool.Sin[x];
			cos = MathTool.Cos[x];
			
			Tm.InitMat4X4(
					1.0f , 0f , 0f , 0f ,
					0f , cos , sin , 0f , 
					0f , -sin , cos , 0f ,
					0f , 0f, 0f , 1.0f);
			this .MAT4X4_MUL(Tm1 , Tm);
			Tm1 = this;
		}
		//y
		if (y != 0)
		{
			sin = MathTool.Sin[y];
			cos = MathTool.Cos[y];
			
			Tm.InitMat4X4 (
					cos , 0.f , -sin , 0.f ,
					0f , 1 , 0f , 0f,
					sin , 0f , cos , 0f,
					0f , 0f, 0f , 1f);
			this .MAT4X4_MUL(Tm1 , Tm);
			Tm1 = this ;
		}//if
		//z
		if (z != 0)
		{
			sin = MathTool.Sin[z];
			cos = MathTool.Cos[z];
			
			Tm.InitMat4X4 (
					cos , sin , 0f , 0f ,
					-sin , cos , 0f , 0f ,
					 0f , 0f , 1f, 0f ,
					 0f ,0f ,0f ,1f);
			this .MAT4X4_MUL(Tm1 , Tm);
		}//if
	}
	/**
	 * 缩放矩阵
	 * @param divw 缩放比例的倒数
	 */
	public void Set_ScaleMat (float divw)
	{
		M[0][0] = 1.0f; M[0][1] = 0f ; M[0][2] = 0f; M[0][3] = 0f;
		M[1][0] = 0f; M[1][1] = 1.0f ; M[1][2] = 0f; M[1][3] = 0f;
		M[2][0] = 0f; M[2][1] = 0f ; M[2][2] = 1.0f; M[2][3] = 0f;
		M[3][0] = 0f; M[3][1] = 0f ; M[3][2] = 0f; M[3][3] = divw;			
	}
	/*
	 * 运算
	 */
	//加
	public Matrix4X4 MAT4X4_ADD_Stack (Matrix4X4 a , Matrix4X4 b)
	{
		Matrix4X4 res = null;
		res .M[0][0] = a.M[0][0] + b .M[0][0];
		res .M[0][1] = a.M[0][1] + b .M[0][1];
		res .M[0][2] = a.M[0][2] + b .M[0][2];
		res .M[0][3] = a.M[0][3] + b .M[0][3];
		
		res .M[1][0] = a.M[1][0] + b .M[1][0];
		res .M[1][1] = a.M[1][1] + b .M[1][1];
		res .M[1][2] = a.M[1][2] + b .M[1][2];
		res .M[1][3] = a.M[1][3] + b .M[1][3];
		
		res .M[2][0] = a.M[2][0] + b .M[2][0];
		res .M[2][1] = a.M[2][1] + b .M[2][1];
		res .M[2][2] = a.M[2][2] + b .M[2][2];
		res .M[2][3] = a.M[2][3] + b .M[2][3];
		return res ;
	}
	public void MAT4X4_ADD (Matrix4X4 a , Matrix4X4 b)
	{
		this .M[0][0] = a.M[0][0] + b .M[0][0];
		this .M[0][1] = a.M[0][1] + b .M[0][1];
		this .M[0][2] = a.M[0][2] + b .M[0][2];
		this .M[0][3] = a.M[0][3] + b .M[0][3];
		
		this .M[1][0] = a.M[1][0] + b .M[1][0];
		this .M[1][1] = a.M[1][1] + b .M[1][1];
		this .M[1][2] = a.M[1][2] + b .M[1][2];
		this .M[1][3] = a.M[1][3] + b .M[1][3];
		
		this .M[2][0] = a.M[2][0] + b .M[2][0];
		this .M[2][1] = a.M[2][1] + b .M[2][1];
		this .M[2][2] = a.M[2][2] + b .M[2][2];
		this .M[2][3] = a.M[2][3] + b .M[2][3];
	}
	/**
	 * 
	 * @param a 被减数
	 * @param b 减数
	 * @return 结果矩阵
	 */
	public Matrix4X4 MAT4X4_SUB_Stack (Matrix4X4 a , Matrix4X4 b)
	{
		Matrix4X4 res = null;
		res .M[0][0] = a.M[0][0] - b .M[0][0];
		res .M[0][1] = a.M[0][1] - b .M[0][1];
		res .M[0][2] = a.M[0][2] - b .M[0][2];
		res .M[0][3] = a.M[0][3] - b .M[0][3];
		
		res .M[1][0] = a.M[1][0] - b .M[1][0];
		res .M[1][1] = a.M[1][1] - b .M[1][1];
		res .M[1][2] = a.M[1][2] - b .M[1][2];
		res .M[1][3] = a.M[1][3] - b .M[1][3];
		
		res .M[2][0] = a.M[2][0] - b .M[2][0];
		res .M[2][1] = a.M[2][1] - b .M[2][1];
		res .M[2][2] = a.M[2][2] - b .M[2][2];
		res .M[2][3] = a.M[2][3] - b .M[2][3];
		return res ;
	}
	/**
	 * 
	 * @param a 被减数
	 * @param b 减数
	 */
	public void MAT4X4_SUB (Matrix4X4 a , Matrix4X4 b)
	{
		this .M[0][0] = a.M[0][0] - b .M[0][0];
		this .M[0][1] = a.M[0][1] - b .M[0][1];
		this .M[0][2] = a.M[0][2] - b .M[0][2];
		this .M[0][3] = a.M[0][3] - b .M[0][3];
		
		this .M[1][0] = a.M[1][0] - b .M[1][0];
		this .M[1][1] = a.M[1][1] - b .M[1][1];
		this .M[1][2] = a.M[1][2] - b .M[1][2];
		this .M[1][3] = a.M[1][3] - b .M[1][3];
		
		this .M[2][0] = a.M[2][0] - b .M[2][0];
		this .M[2][1] = a.M[2][1] - b .M[2][1];
		this .M[2][2] = a.M[2][2] - b .M[2][2];
		this .M[2][3] = a.M[2][3] - b .M[2][3];
	}
	/**
	 * 
	 * @param a 被乘数
	 * @param b 乘数
	 */
	public void MAT4X4_MUL (Matrix4X4 a , Matrix4X4 b)
	{
		int j = 0 , i = 0;
		for (i = 0 ; i < 4 ; i ++)
		{
			for (j = 0 ; j < 4 ; j ++)
			{
				this .M[i][j] = a .M[i][0] * b .M[0][j] + 
					a .M[i][1] * b .M[1][j] +
					a .M[i][2] * b .M[2][j] + 
					a .M[i][3] * b .M[3][j];
			}//for 
		}//for 
	}
	/**
	 * 
	 * @param a 被乘数
	 * @param b 乘数
	 * @return 结果矩阵
	 */
	public Matrix4X4 MAT4X4_MUL_Stack (Matrix4X4 a , Matrix4X4 b)
	{
		Matrix4X4 res = new Matrix4X4 ();
		int j = 0 , i = 0;
		for (i = 0 ; i < 4 ; i ++)
		{
			for (j = 0 ; j < 4 ; j ++)
			{
				res .M[i][j] = a .M[i][0] * b .M[0][j] + 
					a .M[i][1] * b .M[1][j] +
					a .M[i][2] * b .M[2][j] + 
					a .M[i][3] * b .M[3][j];
			}//for 
		}//for 
		return res ;
	}
	/**
	 * 
	 * @return 此对象的逆矩阵,最后一列为 (0,0,0,1)
	 */
	public Matrix4X4 MAT4x4_INVERSE()
	{
		Matrix4X4 res = new Matrix4X4 ();
		
		float det_inv = 1.0f / 
		(this.M[0][0]*(this.M[1][1]*this.M[2][2] - this.M[2][1]*this.M[1][2]) -
		this.M[0][1]*(this.M[1][0]*this.M[2][2] - this.M[2][0]*this.M[1][2]) + 
		this.M[0][2]*(this.M[1][0]*this.M[2][1] - this.M[2][0]*this.M[1][1]));

		res.M[0][0] =  det_inv*(this.M[1][1]*this.M[2][2] - this.M[2][1]*this.M[1][2]);
		res.M[1][0] = -det_inv*(this.M[1][0]*this.M[2][2] - this.M[2][0]*this.M[1][2]);
		res.M[2][0] =  det_inv*(this.M[1][0]*this.M[2][1] - this.M[2][0]*this.M[1][1]);
		res.M[3][0] = -( this.M[3][0] * res.M[0][0] + this.M[3][1] * res.M[1][0] + this.M[3][2] * res.M[2][0] );
		
		res.M[0][1] = -det_inv*(this.M[0][1]*this.M[2][2] - this.M[2][1]*this.M[0][2]);
		res.M[1][1] =  det_inv*(this.M[0][0]*this.M[2][2] - this.M[2][0]*this.M[0][2]);
		res.M[2][1] = -det_inv*(this.M[0][0]*this.M[2][1] - this.M[2][0]*this.M[0][1]);
		res.M[3][1] = -( this.M[3][0] * res.M[0][1] + this.M[3][1] * res.M[1][1] + this.M[3][2] * res.M[2][1] );
		
		res.M[0][2] =  det_inv*(this.M[0][1]*this.M[1][2] - this.M[1][1]*this.M[0][2]);
		res.M[1][2] = -det_inv*(this.M[0][0]*this.M[1][2] - this.M[1][0]*this.M[0][2]);
		res.M[2][2] =  det_inv*(this.M[0][0]*this.M[1][1] - this.M[1][0]*this.M[0][1]);
		res.M[3][2] = -( this.M[3][0] * res.M[0][2] + this.M[3][1] * res.M[1][2] + this.M[3][2] * res.M[2][2] );
		
		res.M[0][3] = 0.f;
		res.M[1][3] = 0.f;
		res.M[2][3] = 0.f;
		res.M[3][3] = 1.0f;
		
		return res ;
	}
	/**
	 * 打印(调试用)
	 */
	public void Print ()
	{
		System .out .println("Matrix4X4");
		System .out.println(this.M[0][0] + "	" + this.M[0][1] + "	" +
				this.M[0][2] + "	" + this.M[0][3] + "	" );
		System .out.println(this.M[1][0] + "	" + this.M[1][1] + "	" +
				this.M[1][2] + "	" + this.M[1][3] + "	" );
		System .out.println(this.M[2][0] + "	" + this.M[2][1] + "	" +
				this.M[2][2] + "	" + this.M[2][3] + "	" );
		System .out.println(this.M[3][0] + "	" + this.M[3][1] + "	" +
				this.M[3][2] + "	" + this.M[3][3] + "	" );
		System .out.println();
	}//Point
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -