void matrix_3x3_transpose(math_matrix_3x3 *out, const math_matrix_3x3 *in) { math_matrix_3x3 mat; for (unsigned i = 0; i < 3; i++) for (unsigned j = 0; j < 3; j++) MAT_ELEM_3X3(mat, j, i) = MAT_ELEM_3X3(*in, i, j); *out = mat; }
float matrix_3x3_determinant(const math_matrix_3x3 *mat) { float det = MAT_ELEM_3X3(*mat, 0, 0) * (MAT_ELEM_3X3(*mat, 1, 1) * MAT_ELEM_3X3(*mat, 2, 2) - MAT_ELEM_3X3(*mat, 1, 2) * MAT_ELEM_3X3(*mat, 2, 1)); det -= MAT_ELEM_3X3(*mat, 0, 1) * (MAT_ELEM_3X3(*mat, 1, 0) * MAT_ELEM_3X3(*mat, 2, 2) - MAT_ELEM_3X3(*mat, 1, 2) * MAT_ELEM_3X3(*mat, 2, 0)); det += MAT_ELEM_3X3(*mat, 0, 2) * (MAT_ELEM_3X3(*mat, 1, 0) * MAT_ELEM_3X3(*mat, 2, 1) - MAT_ELEM_3X3(*mat, 1, 1) * MAT_ELEM_3X3(*mat, 2, 0)); return det; }
void matrix_3x3_divide_scalar(math_matrix_3x3 *mat, const float s) { unsigned i, j; for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) MAT_ELEM_3X3(*mat, i, j) /= s; }
void matrix_3x3_identity(math_matrix_3x3 *mat) { unsigned i; memset(mat, 0, sizeof(*mat)); for (i = 0; i < 3; i++) MAT_ELEM_3X3(*mat, i, i) = 1.0f; }
void matrix_3x3_multiply(math_matrix_3x3 *out, const math_matrix_3x3 *a, const math_matrix_3x3 *b) { math_matrix_3x3 mat; for (unsigned r = 0; r < 3; r++) { for (unsigned c = 0; c < 3; c++) { float dot = 0.0f; for (unsigned k = 0; k < 3; k++) dot += MAT_ELEM_3X3(*a, r, k) * MAT_ELEM_3X3(*b, k, c); MAT_ELEM_3X3(mat, r, c) = dot; } } *out = mat; }
void matrix_3x3_inits(math_matrix_3x3 *mat, const float n11, const float n12, const float n13, const float n21, const float n22, const float n23, const float n31, const float n32, const float n33) { MAT_ELEM_3X3(*mat, 0, 0) = n11; MAT_ELEM_3X3(*mat, 0, 1) = n12; MAT_ELEM_3X3(*mat, 0, 2) = n13; MAT_ELEM_3X3(*mat, 1, 0) = n21; MAT_ELEM_3X3(*mat, 1, 1) = n22; MAT_ELEM_3X3(*mat, 1, 2) = n23; MAT_ELEM_3X3(*mat, 2, 0) = n31; MAT_ELEM_3X3(*mat, 2, 1) = n32; MAT_ELEM_3X3(*mat, 2, 2) = n33; }
void matrix_3x3_adjoint(math_matrix_3x3 *mat) { math_matrix_3x3 out; MAT_ELEM_3X3(out, 0, 0) = (MAT_ELEM_3X3(*mat, 1, 1) * MAT_ELEM_3X3(*mat, 2, 2) - MAT_ELEM_3X3(*mat, 1, 2) * MAT_ELEM_3X3(*mat, 2, 1)); MAT_ELEM_3X3(out, 0, 1) = -(MAT_ELEM_3X3(*mat, 0, 1) * MAT_ELEM_3X3(*mat, 2, 2) - MAT_ELEM_3X3(*mat, 0, 2) * MAT_ELEM_3X3(*mat, 2, 1)); MAT_ELEM_3X3(out, 0, 2) = (MAT_ELEM_3X3(*mat, 0, 1) * MAT_ELEM_3X3(*mat, 1, 1) - MAT_ELEM_3X3(*mat, 0, 2) * MAT_ELEM_3X3(*mat, 1, 1)); MAT_ELEM_3X3(out, 1, 0) = -(MAT_ELEM_3X3(*mat, 1, 0) * MAT_ELEM_3X3(*mat, 2, 2) - MAT_ELEM_3X3(*mat, 1, 2) * MAT_ELEM_3X3(*mat, 2, 0)); MAT_ELEM_3X3(out, 1, 1) = (MAT_ELEM_3X3(*mat, 0, 0) * MAT_ELEM_3X3(*mat, 2, 2) - MAT_ELEM_3X3(*mat, 0, 2) * MAT_ELEM_3X3(*mat, 2, 0)); MAT_ELEM_3X3(out, 1, 2) = -(MAT_ELEM_3X3(*mat, 0, 0) * MAT_ELEM_3X3(*mat, 1, 2) - MAT_ELEM_3X3(*mat, 0, 2) * MAT_ELEM_3X3(*mat, 1, 0)); MAT_ELEM_3X3(out, 2, 0) = (MAT_ELEM_3X3(*mat, 1, 0) * MAT_ELEM_3X3(*mat, 2, 1) - MAT_ELEM_3X3(*mat, 1, 1) * MAT_ELEM_3X3(*mat, 2, 0)); MAT_ELEM_3X3(out, 2, 1) = -(MAT_ELEM_3X3(*mat, 0, 0) * MAT_ELEM_3X3(*mat, 2, 1) - MAT_ELEM_3X3(*mat, 0, 1) * MAT_ELEM_3X3(*mat, 2, 0)); MAT_ELEM_3X3(out, 2, 2) = (MAT_ELEM_3X3(*mat, 0, 0) * MAT_ELEM_3X3(*mat, 1, 1) - MAT_ELEM_3X3(*mat, 0, 1) * MAT_ELEM_3X3(*mat, 1, 0)); *mat = out; }