#include "matrix3x3.h" // ================= Inversion ================== // int bgc_matrix3x3_invert_fp32(BgcMatrix3x3FP32* matrix) { const float determinant = bgc_matrix3x3_get_determinant_fp32(matrix); if (-BGC_EPSYLON_FP32 <= determinant && determinant <= BGC_EPSYLON_FP32) { return 0; } const float r1c1 = matrix->r2c2 * matrix->r3c3 - matrix->r2c3 * matrix->r3c2; const float r1c2 = matrix->r1c3 * matrix->r3c2 - matrix->r1c2 * matrix->r3c3; const float r1c3 = matrix->r1c2 * matrix->r2c3 - matrix->r1c3 * matrix->r2c2; const float r2c1 = matrix->r2c3 * matrix->r3c1 - matrix->r2c1 * matrix->r3c3; const float r2c2 = matrix->r1c1 * matrix->r3c3 - matrix->r1c3 * matrix->r3c1; const float r2c3 = matrix->r1c3 * matrix->r2c1 - matrix->r1c1 * matrix->r2c3; const float r3c1 = matrix->r2c1 * matrix->r3c2 - matrix->r2c2 * matrix->r3c1; const float r3c2 = matrix->r1c2 * matrix->r3c1 - matrix->r1c1 * matrix->r3c2; const float r3c3 = matrix->r1c1 * matrix->r2c2 - matrix->r1c2 * matrix->r2c1; const float multiplier = 1.0f / determinant; matrix->r1c1 = r1c1 * multiplier; matrix->r1c2 = r1c2 * multiplier; matrix->r1c3 = r1c3 * multiplier; matrix->r2c1 = r2c1 * multiplier; matrix->r2c2 = r2c2 * multiplier; matrix->r2c3 = r2c3 * multiplier; matrix->r3c1 = r3c1 * multiplier; matrix->r3c2 = r3c2 * multiplier; matrix->r3c3 = r3c3 * multiplier; return 1; } int bgc_matrix3x3_invert_fp64(BgcMatrix3x3FP64* matrix) { const double determinant = bgc_matrix3x3_get_determinant_fp64(matrix); if (-BGC_EPSYLON_FP64 <= determinant && determinant <= BGC_EPSYLON_FP64) { return 0; } const double r1c1 = matrix->r2c2 * matrix->r3c3 - matrix->r2c3 * matrix->r3c2; const double r1c2 = matrix->r1c3 * matrix->r3c2 - matrix->r1c2 * matrix->r3c3; const double r1c3 = matrix->r1c2 * matrix->r2c3 - matrix->r1c3 * matrix->r2c2; const double r2c1 = matrix->r2c3 * matrix->r3c1 - matrix->r2c1 * matrix->r3c3; const double r2c2 = matrix->r1c1 * matrix->r3c3 - matrix->r1c3 * matrix->r3c1; const double r2c3 = matrix->r1c3 * matrix->r2c1 - matrix->r1c1 * matrix->r2c3; const double r3c1 = matrix->r2c1 * matrix->r3c2 - matrix->r2c2 * matrix->r3c1; const double r3c2 = matrix->r1c2 * matrix->r3c1 - matrix->r1c1 * matrix->r3c2; const double r3c3 = matrix->r1c1 * matrix->r2c2 - matrix->r1c2 * matrix->r2c1; const double multiplier = 1.0 / determinant; matrix->r1c1 = r1c1 * multiplier; matrix->r1c2 = r1c2 * multiplier; matrix->r1c3 = r1c3 * multiplier; matrix->r2c1 = r2c1 * multiplier; matrix->r2c2 = r2c2 * multiplier; matrix->r2c3 = r2c3 * multiplier; matrix->r3c1 = r3c1 * multiplier; matrix->r3c2 = r3c2 * multiplier; matrix->r3c3 = r3c3 * multiplier; return 1; } // ================ Make Inverted =============== // int bgc_matrix3x3_set_inverted_fp32(const BgcMatrix3x3FP32* matrix, BgcMatrix3x3FP32* result) { const float determinant = bgc_matrix3x3_get_determinant_fp32(matrix); if (-BGC_EPSYLON_FP32 <= determinant && determinant <= BGC_EPSYLON_FP32) { return 0; } const float r1c1 = matrix->r2c2 * matrix->r3c3 - matrix->r2c3 * matrix->r3c2; const float r1c2 = matrix->r1c3 * matrix->r3c2 - matrix->r1c2 * matrix->r3c3; const float r1c3 = matrix->r1c2 * matrix->r2c3 - matrix->r1c3 * matrix->r2c2; const float r2c1 = matrix->r2c3 * matrix->r3c1 - matrix->r2c1 * matrix->r3c3; const float r2c2 = matrix->r1c1 * matrix->r3c3 - matrix->r1c3 * matrix->r3c1; const float r2c3 = matrix->r1c3 * matrix->r2c1 - matrix->r1c1 * matrix->r2c3; const float r3c1 = matrix->r2c1 * matrix->r3c2 - matrix->r2c2 * matrix->r3c1; const float r3c2 = matrix->r1c2 * matrix->r3c1 - matrix->r1c1 * matrix->r3c2; const float r3c3 = matrix->r1c1 * matrix->r2c2 - matrix->r1c2 * matrix->r2c1; const float multiplier = 1.0f / determinant; result->r1c1 = r1c1 * multiplier; result->r1c2 = r1c2 * multiplier; result->r1c3 = r1c3 * multiplier; result->r2c1 = r2c1 * multiplier; result->r2c2 = r2c2 * multiplier; result->r2c3 = r2c3 * multiplier; result->r3c1 = r3c1 * multiplier; result->r3c2 = r3c2 * multiplier; result->r3c3 = r3c3 * multiplier; return 1; } int bgc_matrix3x3_set_inverted_fp64(const BgcMatrix3x3FP64* matrix, BgcMatrix3x3FP64* result) { const double determinant = bgc_matrix3x3_get_determinant_fp64(matrix); if (-BGC_EPSYLON_FP64 <= determinant && determinant <= BGC_EPSYLON_FP64) { return 0; } const double r1c1 = matrix->r2c2 * matrix->r3c3 - matrix->r2c3 * matrix->r3c2; const double r1c2 = matrix->r1c3 * matrix->r3c2 - matrix->r1c2 * matrix->r3c3; const double r1c3 = matrix->r1c2 * matrix->r2c3 - matrix->r1c3 * matrix->r2c2; const double r2c1 = matrix->r2c3 * matrix->r3c1 - matrix->r2c1 * matrix->r3c3; const double r2c2 = matrix->r1c1 * matrix->r3c3 - matrix->r1c3 * matrix->r3c1; const double r2c3 = matrix->r1c3 * matrix->r2c1 - matrix->r1c1 * matrix->r2c3; const double r3c1 = matrix->r2c1 * matrix->r3c2 - matrix->r2c2 * matrix->r3c1; const double r3c2 = matrix->r1c2 * matrix->r3c1 - matrix->r1c1 * matrix->r3c2; const double r3c3 = matrix->r1c1 * matrix->r2c2 - matrix->r1c2 * matrix->r2c1; const double multiplier = 1.0 / determinant; result->r1c1 = r1c1 * multiplier; result->r1c2 = r1c2 * multiplier; result->r1c3 = r1c3 * multiplier; result->r2c1 = r2c1 * multiplier; result->r2c2 = r2c2 * multiplier; result->r2c3 = r2c3 * multiplier; result->r3c1 = r3c1 * multiplier; result->r3c2 = r3c2 * multiplier; result->r3c3 = r3c3 * multiplier; return 1; }