in commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/threed/AffineTransformMatrix3D.java [435:485]
public AffineTransformMatrix3D inverse() {
// Our full matrix is 4x4 but we can significantly reduce the amount of computations
// needed here since we know that our last row is [0 0 0 1].
final double det = Matrices.checkDeterminantForInverse(determinant());
// validate the remaining matrix elements that were not part of the determinant
Matrices.checkElementForInverse(m03);
Matrices.checkElementForInverse(m13);
Matrices.checkElementForInverse(m23);
// compute the necessary elements of the cofactor matrix
// (we need all but the last column)
final double invDet = 1.0 / det;
final double c00 = invDet * Matrices.determinant(m11, m12, m21, m22);
final double c01 = -invDet * Matrices.determinant(m10, m12, m20, m22);
final double c02 = invDet * Matrices.determinant(m10, m11, m20, m21);
final double c10 = -invDet * Matrices.determinant(m01, m02, m21, m22);
final double c11 = invDet * Matrices.determinant(m00, m02, m20, m22);
final double c12 = -invDet * Matrices.determinant(m00, m01, m20, m21);
final double c20 = invDet * Matrices.determinant(m01, m02, m11, m12);
final double c21 = -invDet * Matrices.determinant(m00, m02, m10, m12);
final double c22 = invDet * Matrices.determinant(m00, m01, m10, m11);
final double c30 = -invDet * Matrices.determinant(
m01, m02, m03,
m11, m12, m13,
m21, m22, m23
);
final double c31 = invDet * Matrices.determinant(
m00, m02, m03,
m10, m12, m13,
m20, m22, m23
);
final double c32 = -invDet * Matrices.determinant(
m00, m01, m03,
m10, m11, m13,
m20, m21, m23
);
return new AffineTransformMatrix3D(
c00, c10, c20, c30,
c01, c11, c21, c31,
c02, c12, c22, c32
);
}