use crate::matrix_functions::matrix_2x2_functions::determinant_2x2;
use crate::vector_functions::vector_3d_functions::*;
pub fn add_3x3(a: [[f64; 3]; 3], b: [[f64; 3]; 3]) -> [[f64; 3]; 3] {
[add_3d(a[0], b[0]), add_3d(a[1], b[1]), add_3d(a[2], b[2])]
}
pub fn subtract_3x3(a: [[f64; 3]; 3], b: [[f64; 3]; 3]) -> [[f64; 3]; 3] {
[
subtract_3d(a[0], b[0]),
subtract_3d(a[1], b[1]),
subtract_3d(a[2], b[2]),
]
}
pub fn multiply_3x3(a: [[f64; 3]; 3], b: [[f64; 3]; 3]) -> [[f64; 3]; 3] {
[
multiply_1x3(a[0], b),
multiply_1x3(a[1], b),
multiply_1x3(a[2], b),
]
}
pub fn multiply_1x3(a: [f64; 3], b: [[f64; 3]; 3]) -> [f64; 3] {
[
dot_3d(a, column_3d(b, 0)),
dot_3d(a, column_3d(b, 1)),
dot_3d(a, column_3d(b, 2)),
]
}
pub fn column_3d(a: [[f64; 3]; 3], i: usize) -> [f64; 3] {
[a[0][i], a[1][i], a[2][i]]
}
pub fn transpose_3x3(a: [[f64; 3]; 3]) -> [[f64; 3]; 3] {
[column_3d(a, 0), column_3d(a, 1), column_3d(a, 2)]
}
pub fn scale_3x3(a: [[f64; 3]; 3], b: f64) -> [[f64; 3]; 3] {
[scale_3d(a[0], b), scale_3d(a[1], b), scale_3d(a[2], b)]
}
pub fn determinant_3x3(a: [[f64; 3]; 3]) -> f64 {
a[0][0] * (a[1][1] * a[2][2] - a[1][2] * a[2][1])
- a[0][1] * (a[1][0] * a[2][2] - a[1][2] * a[2][0])
+ a[0][2] * (a[1][0] * a[2][1] - a[1][1] * a[2][0])
}
pub fn minor_matrix_3x3(a: [[f64; 3]; 3]) -> [[f64; 3]; 3] {
[
[
determinant_2x2([a[1][1], a[1][2]], [a[2][1], a[2][2]]),
determinant_2x2([a[1][0], a[1][2]], [a[2][0], a[2][2]]),
determinant_2x2([a[1][0], a[1][1]], [a[2][0], a[2][1]]),
],
[
determinant_2x2([a[0][1], a[0][2]], [a[2][1], a[2][2]]),
determinant_2x2([a[0][0], a[0][2]], [a[2][0], a[2][2]]),
determinant_2x2([a[0][0], a[0][1]], [a[2][0], a[2][1]]),
],
[
determinant_2x2([a[0][1], a[0][2]], [a[1][1], a[1][2]]),
determinant_2x2([a[0][0], a[0][2]], [a[1][0], a[1][2]]),
determinant_2x2([a[0][0], a[0][1]], [a[1][0], a[1][1]]),
],
]
}
pub fn cofactor_matrix_3x3(a: [[f64; 3]; 3]) -> [[f64; 3]; 3] {
let minor = minor_matrix_3x3(a);
[
[minor[0][0], -minor[0][1], minor[0][2]],
[-minor[1][0], minor[1][1], -minor[1][2]],
[minor[2][0], -minor[2][1], minor[2][2]],
]
}
pub fn adjugate_matrix_3x3(a: [[f64; 3]; 3]) -> [[f64; 3]; 3] {
transpose_3x3(cofactor_matrix_3x3(a))
}
pub fn inverse_3x3(a: [[f64; 3]; 3]) -> [[f64; 3]; 3] {
scale_3x3(adjugate_matrix_3x3(a), 1.0 / determinant_3x3(a))
}