📄 matrix4x4.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 + -