気合いで実装しました.
ごにょごにょするより早いと期待して...
public static float mat2Determinant(float[][] mat){
return mat[0][0]*mat[1][1]-mat[0][1]*mat[1][0];
}
public static boolean mat2inv(float[][] mat, float[][] inv){
float det=mat2Determinant(mat);
if(Math.abs(det)
//System.out.println("mat inv is not exist");
return false;
}
inv[0][0]=mat[1][1]/det;
inv[0][1]=-mat[0][1]/det;
inv[1][0]=-mat[1][0]/det;
inv[1][1]=-mat[0][0]/det;
return true;
}
public static float mat3Determinant(float[][] mat){
return mat[0][0]*mat[1][1]*mat[2][2]
+mat[0][1]*mat[1][2]*mat[2][0]
+mat[0][2]*mat[1][0]*mat[2][1]
-mat[0][0]*mat[2][1]*mat[1][2]
-mat[0][1]*mat[1][0]*mat[2][2]
-mat[0][2]*mat[1][1]*mat[2][0];
}
public static boolean mat3inv(float[][] mat, float[][] inv){
float det=mat3Determinant(mat);
if(Math.abs(det)
//System.out.println("mat inv is not exist");
return false;
}
inv[0][0]=(mat[1][1]*mat[2][2]-mat[1][2]*mat[2][1])/det;
inv[0][1]=(mat[0][2]*mat[2][1]-mat[0][1]*mat[2][2])/det;
inv[0][2]=(mat[0][1]*mat[1][2]-mat[0][2]*mat[1][1])/det;
inv[1][0]=(mat[1][2]*mat[2][0]-mat[1][0]*mat[2][2])/det;
inv[1][1]=(mat[0][0]*mat[2][2]-mat[0][2]*mat[2][0])/det;
inv[1][2]=(mat[0][2]*mat[1][0]-mat[0][0]*mat[1][2])/det;
inv[2][0]=(mat[1][0]*mat[2][1]-mat[1][1]*mat[2][0])/det;
inv[2][1]=(mat[0][1]*mat[2][0]-mat[0][0]*mat[2][1])/det;
inv[2][2]=(mat[0][0]*mat[1][1]-mat[0][1]*mat[1][0])/det;
return true;
}
public static float mat4Determinant(float[][] mat){
return mat[0][0]*mat[1][1]*mat[2][2]*mat[3][3]
+ mat[0][0]*mat[1][2]*mat[2][3]*mat[3][1]
+ mat[0][0]*mat[1][3]*mat[2][1]*mat[3][2]
+ mat[0][1]*mat[1][0]*mat[2][3]*mat[3][2]
+ mat[0][1]*mat[1][2]*mat[2][0]*mat[3][3]
+ mat[0][1]*mat[1][3]*mat[2][2]*mat[3][0]
+ mat[0][2]*mat[1][0]*mat[2][1]*mat[3][3]
+ mat[0][2]*mat[1][1]*mat[2][3]*mat[3][0]
+ mat[0][2]*mat[1][3]*mat[2][0]*mat[3][1]
+ mat[0][3]*mat[1][0]*mat[2][2]*mat[3][1]
+ mat[0][3]*mat[1][1]*mat[2][0]*mat[3][2]
+ mat[0][3]*mat[1][2]*mat[2][1]*mat[3][0]
- mat[0][0]*mat[1][1]*mat[2][3]*mat[3][2]
- mat[0][0]*mat[1][2]*mat[2][1]*mat[3][3]
- mat[0][0]*mat[1][3]*mat[2][2]*mat[3][1]
- mat[0][1]*mat[1][0]*mat[2][2]*mat[3][3]
- mat[0][1]*mat[1][2]*mat[2][3]*mat[3][0]
- mat[0][1]*mat[1][3]*mat[2][0]*mat[3][2]
- mat[0][2]*mat[1][0]*mat[2][3]*mat[3][1]
- mat[0][2]*mat[1][1]*mat[2][0]*mat[3][3]
- mat[0][2]*mat[1][3]*mat[2][1]*mat[3][0]
- mat[0][3]*mat[1][0]*mat[2][1]*mat[3][2]
- mat[0][3]*mat[1][1]*mat[2][2]*mat[3][0]
- mat[0][3]*mat[1][2]*mat[2][0]*mat[3][1];
}
public static boolean mat4inv(float[][] mat, float[][] inv){
float det=mat4Determinant(mat);
if(Math.abs(det)
//System.out.println("mat inv is not exist");
return false;
}
inv[0][0] = (mat[1][1]*mat[2][2]*mat[3][3]
+ mat[1][2]*mat[2][3]*mat[3][1]
+ mat[1][3]*mat[2][1]*mat[3][2]
- mat[1][1]*mat[2][3]*mat[3][2]
- mat[1][2]*mat[2][1]*mat[3][3]
- mat[1][3]*mat[2][2]*mat[3][1])/det;
inv[0][1] = (mat[0][1]*mat[2][3]*mat[3][2]
+ mat[0][2]*mat[2][1]*mat[3][3]
+ mat[0][3]*mat[2][2]*mat[3][1]
- mat[0][1]*mat[2][2]*mat[3][3]
- mat[0][2]*mat[2][3]*mat[3][1]
- mat[0][3]*mat[2][1]*mat[3][2])/det;
inv[0][2] = (mat[0][1]*mat[1][2]*mat[3][3]
+ mat[0][2]*mat[1][3]*mat[3][1]
+ mat[0][3]*mat[1][1]*mat[3][2]
- mat[0][1]*mat[1][3]*mat[3][2]
- mat[0][2]*mat[1][1]*mat[3][3]
- mat[0][3]*mat[1][2]*mat[3][1])/det;
inv[0][3] = (mat[0][1]*mat[1][3]*mat[2][2]
+ mat[0][2]*mat[1][1]*mat[2][3]
+ mat[0][3]*mat[1][2]*mat[2][1]
- mat[0][1]*mat[1][2]*mat[2][3]
- mat[0][2]*mat[1][3]*mat[2][1]
- mat[0][3]*mat[1][1]*mat[2][2])/det;
inv[1][0] = (mat[1][0]*mat[2][3]*mat[3][2]
+ mat[1][2]*mat[2][0]*mat[3][3]
+ mat[1][3]*mat[2][2]*mat[3][0]
- mat[1][0]*mat[2][2]*mat[3][3]
- mat[1][2]*mat[2][3]*mat[3][0]
- mat[1][3]*mat[2][0]*mat[3][2])/det;
inv[1][1] = (mat[0][0]*mat[2][2]*mat[3][3]
+ mat[0][2]*mat[2][3]*mat[3][0]
+ mat[0][3]*mat[2][0]*mat[3][2]
- mat[0][0]*mat[2][3]*mat[3][2]
- mat[0][2]*mat[2][0]*mat[3][3]
- mat[0][3]*mat[2][2]*mat[3][0])/det;
inv[1][2] = (mat[0][0]*mat[1][3]*mat[3][2]
+ mat[0][2]*mat[1][0]*mat[3][3]
+ mat[0][3]*mat[1][2]*mat[3][0]
- mat[0][0]*mat[1][2]*mat[3][3]
- mat[0][2]*mat[1][3]*mat[3][0]
- mat[0][3]*mat[1][0]*mat[3][2])/det;
inv[1][3] = (mat[0][0]*mat[1][2]*mat[2][3]
+ mat[0][2]*mat[1][3]*mat[2][0]
+ mat[0][3]*mat[1][0]*mat[2][2]
- mat[0][0]*mat[1][3]*mat[2][2]
- mat[0][2]*mat[1][0]*mat[2][3]
- mat[0][3]*mat[1][2]*mat[2][0])/det;
inv[2][0] = (mat[1][0]*mat[2][1]*mat[3][3]
+ mat[1][1]*mat[2][3]*mat[3][0]
+ mat[1][3]*mat[2][0]*mat[3][1]
- mat[1][0]*mat[2][3]*mat[3][1]
- mat[1][1]*mat[2][0]*mat[3][3]
- mat[1][3]*mat[2][1]*mat[3][0])/det;
inv[2][1] = (mat[0][0]*mat[2][3]*mat[3][1]
+ mat[0][1]*mat[2][0]*mat[3][3]
+ mat[0][3]*mat[2][1]*mat[3][0]
- mat[0][0]*mat[2][1]*mat[3][3]
- mat[0][1]*mat[2][3]*mat[3][0]
- mat[0][3]*mat[2][0]*mat[3][1])/det;
inv[2][2] = (mat[0][0]*mat[1][1]*mat[3][3]
+ mat[0][1]*mat[1][3]*mat[3][0]
+ mat[0][3]*mat[1][0]*mat[3][1]
- mat[0][0]*mat[1][3]*mat[3][1]
- mat[0][1]*mat[1][0]*mat[3][3]
- mat[0][3]*mat[1][1]*mat[3][0])/det;
inv[2][3] = (mat[0][0]*mat[1][3]*mat[2][1]
+ mat[0][1]*mat[1][0]*mat[2][3]
+ mat[0][3]*mat[1][1]*mat[2][0]
- mat[0][0]*mat[1][1]*mat[2][3]
- mat[0][1]*mat[1][3]*mat[2][0]
- mat[0][3]*mat[1][0]*mat[2][1])/det;
inv[3][0] = (mat[1][0]*mat[2][2]*mat[3][1]
+ mat[1][1]*mat[2][0]*mat[3][2]
+ mat[1][2]*mat[2][1]*mat[3][0]
- mat[1][0]*mat[2][1]*mat[3][2]
- mat[1][1]*mat[2][2]*mat[3][0]
- mat[1][2]*mat[2][0]*mat[3][1])/det;
inv[3][1] = (mat[0][0]*mat[2][1]*mat[3][2]
+ mat[0][1]*mat[2][2]*mat[3][0]
+ mat[0][2]*mat[2][0]*mat[3][1]
- mat[0][0]*mat[2][2]*mat[3][1]
- mat[0][1]*mat[2][0]*mat[3][2]
- mat[0][2]*mat[2][1]*mat[3][0])/det;
inv[3][2] = (mat[0][0]*mat[1][2]*mat[3][1]
+ mat[0][1]*mat[1][0]*mat[3][2]
+ mat[0][2]*mat[1][1]*mat[3][0]
- mat[0][0]*mat[1][1]*mat[3][2]
- mat[0][1]*mat[1][2]*mat[3][0]
- mat[0][2]*mat[1][0]*mat[3][1])/det;
inv[3][3] = (mat[0][0]*mat[1][1]*mat[2][2]
+ mat[0][1]*mat[1][2]*mat[2][0]
+ mat[0][2]*mat[1][0]*mat[2][1]
- mat[0][0]*mat[1][2]*mat[2][1]
- mat[0][1]*mat[1][0]*mat[2][2]
- mat[0][2]*mat[1][1]*mat[2][0])/det;
return true;
}
return mat[0][0]*mat[1][1]-mat[0][1]*mat[1][0];
}
public static boolean mat2inv(float[][] mat, float[][] inv){
float det=mat2Determinant(mat);
if(Math.abs(det)
//System.out.println("mat inv is not exist");
return false;
}
inv[0][0]=mat[1][1]/det;
inv[0][1]=-mat[0][1]/det;
inv[1][0]=-mat[1][0]/det;
inv[1][1]=-mat[0][0]/det;
return true;
}
public static float mat3Determinant(float[][] mat){
return mat[0][0]*mat[1][1]*mat[2][2]
+mat[0][1]*mat[1][2]*mat[2][0]
+mat[0][2]*mat[1][0]*mat[2][1]
-mat[0][0]*mat[2][1]*mat[1][2]
-mat[0][1]*mat[1][0]*mat[2][2]
-mat[0][2]*mat[1][1]*mat[2][0];
}
public static boolean mat3inv(float[][] mat, float[][] inv){
float det=mat3Determinant(mat);
if(Math.abs(det)
//System.out.println("mat inv is not exist");
return false;
}
inv[0][0]=(mat[1][1]*mat[2][2]-mat[1][2]*mat[2][1])/det;
inv[0][1]=(mat[0][2]*mat[2][1]-mat[0][1]*mat[2][2])/det;
inv[0][2]=(mat[0][1]*mat[1][2]-mat[0][2]*mat[1][1])/det;
inv[1][0]=(mat[1][2]*mat[2][0]-mat[1][0]*mat[2][2])/det;
inv[1][1]=(mat[0][0]*mat[2][2]-mat[0][2]*mat[2][0])/det;
inv[1][2]=(mat[0][2]*mat[1][0]-mat[0][0]*mat[1][2])/det;
inv[2][0]=(mat[1][0]*mat[2][1]-mat[1][1]*mat[2][0])/det;
inv[2][1]=(mat[0][1]*mat[2][0]-mat[0][0]*mat[2][1])/det;
inv[2][2]=(mat[0][0]*mat[1][1]-mat[0][1]*mat[1][0])/det;
return true;
}
public static float mat4Determinant(float[][] mat){
return mat[0][0]*mat[1][1]*mat[2][2]*mat[3][3]
+ mat[0][0]*mat[1][2]*mat[2][3]*mat[3][1]
+ mat[0][0]*mat[1][3]*mat[2][1]*mat[3][2]
+ mat[0][1]*mat[1][0]*mat[2][3]*mat[3][2]
+ mat[0][1]*mat[1][2]*mat[2][0]*mat[3][3]
+ mat[0][1]*mat[1][3]*mat[2][2]*mat[3][0]
+ mat[0][2]*mat[1][0]*mat[2][1]*mat[3][3]
+ mat[0][2]*mat[1][1]*mat[2][3]*mat[3][0]
+ mat[0][2]*mat[1][3]*mat[2][0]*mat[3][1]
+ mat[0][3]*mat[1][0]*mat[2][2]*mat[3][1]
+ mat[0][3]*mat[1][1]*mat[2][0]*mat[3][2]
+ mat[0][3]*mat[1][2]*mat[2][1]*mat[3][0]
- mat[0][0]*mat[1][1]*mat[2][3]*mat[3][2]
- mat[0][0]*mat[1][2]*mat[2][1]*mat[3][3]
- mat[0][0]*mat[1][3]*mat[2][2]*mat[3][1]
- mat[0][1]*mat[1][0]*mat[2][2]*mat[3][3]
- mat[0][1]*mat[1][2]*mat[2][3]*mat[3][0]
- mat[0][1]*mat[1][3]*mat[2][0]*mat[3][2]
- mat[0][2]*mat[1][0]*mat[2][3]*mat[3][1]
- mat[0][2]*mat[1][1]*mat[2][0]*mat[3][3]
- mat[0][2]*mat[1][3]*mat[2][1]*mat[3][0]
- mat[0][3]*mat[1][0]*mat[2][1]*mat[3][2]
- mat[0][3]*mat[1][1]*mat[2][2]*mat[3][0]
- mat[0][3]*mat[1][2]*mat[2][0]*mat[3][1];
}
public static boolean mat4inv(float[][] mat, float[][] inv){
float det=mat4Determinant(mat);
if(Math.abs(det)
//System.out.println("mat inv is not exist");
return false;
}
inv[0][0] = (mat[1][1]*mat[2][2]*mat[3][3]
+ mat[1][2]*mat[2][3]*mat[3][1]
+ mat[1][3]*mat[2][1]*mat[3][2]
- mat[1][1]*mat[2][3]*mat[3][2]
- mat[1][2]*mat[2][1]*mat[3][3]
- mat[1][3]*mat[2][2]*mat[3][1])/det;
inv[0][1] = (mat[0][1]*mat[2][3]*mat[3][2]
+ mat[0][2]*mat[2][1]*mat[3][3]
+ mat[0][3]*mat[2][2]*mat[3][1]
- mat[0][1]*mat[2][2]*mat[3][3]
- mat[0][2]*mat[2][3]*mat[3][1]
- mat[0][3]*mat[2][1]*mat[3][2])/det;
inv[0][2] = (mat[0][1]*mat[1][2]*mat[3][3]
+ mat[0][2]*mat[1][3]*mat[3][1]
+ mat[0][3]*mat[1][1]*mat[3][2]
- mat[0][1]*mat[1][3]*mat[3][2]
- mat[0][2]*mat[1][1]*mat[3][3]
- mat[0][3]*mat[1][2]*mat[3][1])/det;
inv[0][3] = (mat[0][1]*mat[1][3]*mat[2][2]
+ mat[0][2]*mat[1][1]*mat[2][3]
+ mat[0][3]*mat[1][2]*mat[2][1]
- mat[0][1]*mat[1][2]*mat[2][3]
- mat[0][2]*mat[1][3]*mat[2][1]
- mat[0][3]*mat[1][1]*mat[2][2])/det;
inv[1][0] = (mat[1][0]*mat[2][3]*mat[3][2]
+ mat[1][2]*mat[2][0]*mat[3][3]
+ mat[1][3]*mat[2][2]*mat[3][0]
- mat[1][0]*mat[2][2]*mat[3][3]
- mat[1][2]*mat[2][3]*mat[3][0]
- mat[1][3]*mat[2][0]*mat[3][2])/det;
inv[1][1] = (mat[0][0]*mat[2][2]*mat[3][3]
+ mat[0][2]*mat[2][3]*mat[3][0]
+ mat[0][3]*mat[2][0]*mat[3][2]
- mat[0][0]*mat[2][3]*mat[3][2]
- mat[0][2]*mat[2][0]*mat[3][3]
- mat[0][3]*mat[2][2]*mat[3][0])/det;
inv[1][2] = (mat[0][0]*mat[1][3]*mat[3][2]
+ mat[0][2]*mat[1][0]*mat[3][3]
+ mat[0][3]*mat[1][2]*mat[3][0]
- mat[0][0]*mat[1][2]*mat[3][3]
- mat[0][2]*mat[1][3]*mat[3][0]
- mat[0][3]*mat[1][0]*mat[3][2])/det;
inv[1][3] = (mat[0][0]*mat[1][2]*mat[2][3]
+ mat[0][2]*mat[1][3]*mat[2][0]
+ mat[0][3]*mat[1][0]*mat[2][2]
- mat[0][0]*mat[1][3]*mat[2][2]
- mat[0][2]*mat[1][0]*mat[2][3]
- mat[0][3]*mat[1][2]*mat[2][0])/det;
inv[2][0] = (mat[1][0]*mat[2][1]*mat[3][3]
+ mat[1][1]*mat[2][3]*mat[3][0]
+ mat[1][3]*mat[2][0]*mat[3][1]
- mat[1][0]*mat[2][3]*mat[3][1]
- mat[1][1]*mat[2][0]*mat[3][3]
- mat[1][3]*mat[2][1]*mat[3][0])/det;
inv[2][1] = (mat[0][0]*mat[2][3]*mat[3][1]
+ mat[0][1]*mat[2][0]*mat[3][3]
+ mat[0][3]*mat[2][1]*mat[3][0]
- mat[0][0]*mat[2][1]*mat[3][3]
- mat[0][1]*mat[2][3]*mat[3][0]
- mat[0][3]*mat[2][0]*mat[3][1])/det;
inv[2][2] = (mat[0][0]*mat[1][1]*mat[3][3]
+ mat[0][1]*mat[1][3]*mat[3][0]
+ mat[0][3]*mat[1][0]*mat[3][1]
- mat[0][0]*mat[1][3]*mat[3][1]
- mat[0][1]*mat[1][0]*mat[3][3]
- mat[0][3]*mat[1][1]*mat[3][0])/det;
inv[2][3] = (mat[0][0]*mat[1][3]*mat[2][1]
+ mat[0][1]*mat[1][0]*mat[2][3]
+ mat[0][3]*mat[1][1]*mat[2][0]
- mat[0][0]*mat[1][1]*mat[2][3]
- mat[0][1]*mat[1][3]*mat[2][0]
- mat[0][3]*mat[1][0]*mat[2][1])/det;
inv[3][0] = (mat[1][0]*mat[2][2]*mat[3][1]
+ mat[1][1]*mat[2][0]*mat[3][2]
+ mat[1][2]*mat[2][1]*mat[3][0]
- mat[1][0]*mat[2][1]*mat[3][2]
- mat[1][1]*mat[2][2]*mat[3][0]
- mat[1][2]*mat[2][0]*mat[3][1])/det;
inv[3][1] = (mat[0][0]*mat[2][1]*mat[3][2]
+ mat[0][1]*mat[2][2]*mat[3][0]
+ mat[0][2]*mat[2][0]*mat[3][1]
- mat[0][0]*mat[2][2]*mat[3][1]
- mat[0][1]*mat[2][0]*mat[3][2]
- mat[0][2]*mat[2][1]*mat[3][0])/det;
inv[3][2] = (mat[0][0]*mat[1][2]*mat[3][1]
+ mat[0][1]*mat[1][0]*mat[3][2]
+ mat[0][2]*mat[1][1]*mat[3][0]
- mat[0][0]*mat[1][1]*mat[3][2]
- mat[0][1]*mat[1][2]*mat[3][0]
- mat[0][2]*mat[1][0]*mat[3][1])/det;
inv[3][3] = (mat[0][0]*mat[1][1]*mat[2][2]
+ mat[0][1]*mat[1][2]*mat[2][0]
+ mat[0][2]*mat[1][0]*mat[2][1]
- mat[0][0]*mat[1][2]*mat[2][1]
- mat[0][1]*mat[1][0]*mat[2][2]
- mat[0][2]*mat[1][1]*mat[2][0])/det;
return true;
}
0 件のコメント:
コメントを投稿