153 lines
5.6 KiB
C
153 lines
5.6 KiB
C
#include "matrix3x3.h"
|
|
|
|
// ================= Inversion ================== //
|
|
|
|
int matrix3x3_invert_fp32(matrix3x3_fp32_t* matrix)
|
|
{
|
|
const float determinant = matrix3x3_get_determinant_fp32(matrix);
|
|
|
|
if (-FP32_EPSYLON <= determinant && determinant <= FP32_EPSYLON) {
|
|
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 matrix3x3_invert_fp64(matrix3x3_fp64_t* matrix)
|
|
{
|
|
const double determinant = matrix3x3_get_determinant_fp64(matrix);
|
|
|
|
if (-FP64_EPSYLON <= determinant && determinant <= FP64_EPSYLON) {
|
|
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 matrix3x3_set_inverted_fp32(const matrix3x3_fp32_t* matrix, matrix3x3_fp32_t* result)
|
|
{
|
|
const float determinant = matrix3x3_get_determinant_fp32(matrix);
|
|
|
|
if (-FP32_EPSYLON <= determinant && determinant <= FP32_EPSYLON) {
|
|
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 matrix3x3_set_inverted_fp64(const matrix3x3_fp64_t* matrix, matrix3x3_fp64_t* result)
|
|
{
|
|
const double determinant = matrix3x3_get_determinant_fp64(matrix);
|
|
|
|
if (-FP64_EPSYLON <= determinant && determinant <= FP64_EPSYLON) {
|
|
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;
|
|
}
|