use num::Float;
use crate::vector3::Vector3;
use std::ops::{AddAssign, SubAssign, MulAssign, DivAssign, Index, IndexMut, Add, Neg, Sub, Mul, Div};
pub struct Matrix3x3<T: Float> {
_elements: [T; 9],
}
pub type Matrix3x3F = Matrix3x3<f32>;
pub type Matrix3x3D = Matrix3x3<f64>;
impl<T: Float> Matrix3x3<T> {
pub fn new_default() -> Matrix3x3<T> {
return Matrix3x3 {
_elements: [T::one(), T::zero(), T::zero(),
T::zero(), T::one(), T::zero(),
T::zero(), T::zero(), T::one()]
};
}
pub fn new_scalar(s: T) -> Matrix3x3<T> {
return Matrix3x3 {
_elements: [s, s, s,
s, s, s,
s, s, s]
};
}
pub fn new(m00: T, m01: T, m02: T, m10: T, m11: T, m12: T, m20: T, m21: T, m22: T) -> Matrix3x3<T> {
return Matrix3x3 {
_elements: [m00, m01, m02, m10, m11, m12, m20, m21, m22]
};
}
pub fn new_lst(lst: [[T; 3]; 3]) -> Matrix3x3<T> {
return Matrix3x3 {
_elements: [lst[0][0], lst[0][1], lst[0][2],
lst[1][0], lst[1][1], lst[1][2],
lst[2][0], lst[2][1], lst[2][2]]
};
}
pub fn new_array(arr: [T; 9]) -> Matrix3x3<T> {
return Matrix3x3 {
_elements: arr
};
}
}
impl<T: Float> Matrix3x3<T> {
pub fn set_scalar(&mut self, s: T) {
self._elements[0] = s;
self._elements[1] = s;
self._elements[2] = s;
self._elements[3] = s;
self._elements[4] = s;
self._elements[5] = s;
self._elements[6] = s;
self._elements[7] = s;
self._elements[8] = s;
}
pub fn set(&mut self, m00: T, m01: T, m02: T, m10: T, m11: T, m12: T, m20: T, m21: T, m22: T) {
self._elements[0] = m00;
self._elements[1] = m01;
self._elements[2] = m02;
self._elements[3] = m10;
self._elements[4] = m11;
self._elements[5] = m12;
self._elements[6] = m20;
self._elements[7] = m21;
self._elements[8] = m22;
}
pub fn set_lst(&mut self, lst: [[T; 3]; 3]) {
self._elements[0] = lst[0][0];
self._elements[1] = lst[0][1];
self._elements[2] = lst[0][2];
self._elements[3] = lst[1][0];
self._elements[4] = lst[1][1];
self._elements[5] = lst[1][2];
self._elements[6] = lst[2][0];
self._elements[7] = lst[2][1];
self._elements[8] = lst[2][2];
}
pub fn set_self(&mut self, m: Matrix3x3<T>) {
self._elements = m._elements;
}
pub fn set_array(&mut self, arr: [T; 9]) {
self._elements = arr;
}
pub fn set_diagonal(&mut self, s: T) {
self._elements[0] = s;
self._elements[4] = s;
self._elements[8] = s;
}
pub fn set_off_diagonal(&mut self, s: T) {
self._elements[1] = s;
self._elements[2] = s;
self._elements[3] = s;
self._elements[5] = s;
self._elements[6] = s;
self._elements[7] = s;
}
pub fn set_row(&mut self, i: usize, row: Vector3<T>) {
self._elements[3 * i] = row.x;
self._elements[3 * i + 1] = row.y;
self._elements[3 * i + 2] = row.z;
}
pub fn set_column(&mut self, j: usize, col: Vector3<T>) {
self._elements[j] = col.x;
self._elements[j + 3] = col.y;
self._elements[j + 6] = col.z;
}
}
impl<T: Float> Matrix3x3<T> {
pub fn is_similar(&self, m: Matrix3x3<T>, tol: Option<T>) -> bool {
return (T::abs(self._elements[0] - m._elements[0]) < tol.unwrap_or(T::epsilon())) &&
(T::abs(self._elements[1] - m._elements[1]) < tol.unwrap_or(T::epsilon())) &&
(T::abs(self._elements[2] - m._elements[2]) < tol.unwrap_or(T::epsilon())) &&
(T::abs(self._elements[3] - m._elements[3]) < tol.unwrap_or(T::epsilon())) &&
(T::abs(self._elements[4] - m._elements[4]) < tol.unwrap_or(T::epsilon())) &&
(T::abs(self._elements[5] - m._elements[5]) < tol.unwrap_or(T::epsilon())) &&
(T::abs(self._elements[6] - m._elements[6]) < tol.unwrap_or(T::epsilon())) &&
(T::abs(self._elements[7] - m._elements[7]) < tol.unwrap_or(T::epsilon())) &&
(T::abs(self._elements[8] - m._elements[8]) < tol.unwrap_or(T::epsilon()));
}
pub fn is_square(&self) -> bool {
return true;
}
pub fn rows(&self) -> usize {
return 3;
}
pub fn cols(&self) -> usize {
return 3;
}
pub fn data_mut(&mut self) -> &mut [T; 9] {
return &mut self._elements;
}
pub fn data(&self) -> &[T; 9] {
return &self._elements;
}
}
impl<T: Float> Matrix3x3<T> {
pub fn add_scalar(&self, s: T) -> Matrix3x3<T> {
return Matrix3x3::new(self._elements[0] + s, self._elements[1] + s, self._elements[2] + s,
self._elements[3] + s, self._elements[4] + s, self._elements[5] + s,
self._elements[6] + s, self._elements[7] + s, self._elements[8] + s);
}
pub fn add_mat(&self, m: Matrix3x3<T>) -> Matrix3x3<T> {
return Matrix3x3::new(self._elements[0] + m._elements[0], self._elements[1] + m._elements[1], self._elements[2] + m._elements[2],
self._elements[3] + m._elements[3], self._elements[4] + m._elements[4], self._elements[5] + m._elements[5],
self._elements[6] + m._elements[6], self._elements[7] + m._elements[7], self._elements[8] + m._elements[8]);
}
pub fn sub_scalar(&self, s: T) -> Matrix3x3<T> {
return Matrix3x3::new(self._elements[0] - s, self._elements[1] - s, self._elements[2] - s,
self._elements[3] - s, self._elements[4] - s, self._elements[5] - s,
self._elements[6] - s, self._elements[7] - s, self._elements[8] - s);
}
pub fn sub_mat(&self, m: Matrix3x3<T>) -> Matrix3x3<T> {
return Matrix3x3::new(self._elements[0] - m._elements[0], self._elements[1] - m._elements[1], self._elements[2] - m._elements[2],
self._elements[3] - m._elements[3], self._elements[4] - m._elements[4], self._elements[5] - m._elements[5],
self._elements[6] - m._elements[6], self._elements[7] - m._elements[7], self._elements[8] - m._elements[8]);
}
pub fn mul_scalar(&self, s: T) -> Matrix3x3<T> {
return Matrix3x3::new(self._elements[0] * s, self._elements[1] * s, self._elements[2] * s,
self._elements[3] * s, self._elements[4] * s, self._elements[5] * s,
self._elements[6] * s, self._elements[7] * s, self._elements[8] * s);
}
pub fn mul_vec(&self, v: Vector3<T>) -> Vector3<T> {
return Vector3::new(self._elements[0] * v.x + self._elements[1] * v.y + self._elements[2] * v.z,
self._elements[3] * v.x + self._elements[4] * v.y + self._elements[5] * v.z,
self._elements[6] * v.x + self._elements[7] * v.y + self._elements[8] * v.z, );
}
pub fn mul_mat(&self, m: Matrix3x3<T>) -> Matrix3x3<T> {
return Matrix3x3::new(
self._elements[0] * m._elements[0] + self._elements[1] * m._elements[3] +
self._elements[2] * m._elements[6],
self._elements[0] * m._elements[1] + self._elements[1] * m._elements[4] +
self._elements[2] * m._elements[7],
self._elements[0] * m._elements[2] + self._elements[1] * m._elements[5] +
self._elements[2] * m._elements[8],
self._elements[3] * m._elements[0] + self._elements[4] * m._elements[3] +
self._elements[5] * m._elements[6],
self._elements[3] * m._elements[1] + self._elements[4] * m._elements[4] +
self._elements[5] * m._elements[7],
self._elements[3] * m._elements[2] + self._elements[4] * m._elements[5] +
self._elements[5] * m._elements[8],
self._elements[6] * m._elements[0] + self._elements[7] * m._elements[3] +
self._elements[8] * m._elements[6],
self._elements[6] * m._elements[1] + self._elements[7] * m._elements[4] +
self._elements[8] * m._elements[7],
self._elements[6] * m._elements[2] + self._elements[7] * m._elements[5] +
self._elements[8] * m._elements[8]);
}
pub fn div_scalar(&self, s: T) -> Matrix3x3<T> {
return Matrix3x3::new(self._elements[0] / s, self._elements[1] / s, self._elements[2] / s,
self._elements[3] / s, self._elements[4] / s, self._elements[5] / s,
self._elements[6] / s, self._elements[7] / s, self._elements[8] / s);
}
}
impl<T: Float> Matrix3x3<T> {
pub fn radd_scalar(&self, s: T) -> Matrix3x3<T> {
return Matrix3x3::new(s + self._elements[0], s + self._elements[1], s + self._elements[2],
s + self._elements[3], s + self._elements[4], s + self._elements[5],
s + self._elements[6], s + self._elements[7], s + self._elements[8]);
}
pub fn radd_mat(&self, m: Matrix3x3<T>) -> Matrix3x3<T> {
return Matrix3x3::new(m._elements[0] + self._elements[0], m._elements[1] + self._elements[1], m._elements[2] + self._elements[2],
m._elements[3] + self._elements[3], m._elements[4] + self._elements[4], m._elements[5] + self._elements[5],
m._elements[6] + self._elements[6], m._elements[7] + self._elements[7], m._elements[8] + self._elements[8]);
}
pub fn rsub_scalar(&self, s: T) -> Matrix3x3<T> {
return Matrix3x3::new(s - self._elements[0], s - self._elements[1], s - self._elements[2],
s - self._elements[3], s - self._elements[4], s - self._elements[5],
s - self._elements[6], s - self._elements[7], s - self._elements[8]);
}
pub fn rsub_mat(&self, m: Matrix3x3<T>) -> Matrix3x3<T> {
return Matrix3x3::new(m._elements[0] - self._elements[0], m._elements[1] - self._elements[1], m._elements[2] - self._elements[2],
m._elements[3] - self._elements[3], m._elements[4] - self._elements[4], m._elements[5] - self._elements[5],
m._elements[6] - self._elements[6], m._elements[7] - self._elements[7], m._elements[8] - self._elements[8]);
}
pub fn rmul_scalar(&self, s: T) -> Matrix3x3<T> {
return Matrix3x3::new(s * self._elements[0], s * self._elements[1], s * self._elements[2],
s * self._elements[3], s * self._elements[4], s * self._elements[5],
s * self._elements[6], s * self._elements[7], s * self._elements[8]);
}
pub fn rmul_mat(&self, m: Matrix3x3<T>) -> Matrix3x3<T> {
return m.mul_mat(*self);
}
pub fn rdiv_scalar(&self, s: T) -> Matrix3x3<T> {
return Matrix3x3::new(s / self._elements[0], s / self._elements[1], s / self._elements[2],
s / self._elements[3], s / self._elements[4], s / self._elements[5],
s / self._elements[6], s / self._elements[7], s / self._elements[8]);
}
}
impl<T: Float> Matrix3x3<T> {
pub fn iadd_scalar(&mut self, s: T) {
self._elements[0] = self._elements[0] + s;
self._elements[1] = self._elements[1] + s;
self._elements[2] = self._elements[2] + s;
self._elements[3] = self._elements[3] + s;
self._elements[4] = self._elements[4] + s;
self._elements[5] = self._elements[5] + s;
self._elements[6] = self._elements[6] + s;
self._elements[7] = self._elements[7] + s;
self._elements[8] = self._elements[8] + s;
}
pub fn iadd_mat(&mut self, m: Matrix3x3<T>) {
self._elements[0] = self._elements[0] + m._elements[0];
self._elements[1] = self._elements[1] + m._elements[1];
self._elements[2] = self._elements[2] + m._elements[2];
self._elements[3] = self._elements[3] + m._elements[3];
self._elements[4] = self._elements[4] + m._elements[4];
self._elements[5] = self._elements[5] + m._elements[5];
self._elements[6] = self._elements[6] + m._elements[6];
self._elements[7] = self._elements[7] + m._elements[7];
self._elements[8] = self._elements[8] + m._elements[8];
}
pub fn isub_scalar(&mut self, s: T) {
self._elements[0] = self._elements[0] - s;
self._elements[1] = self._elements[1] - s;
self._elements[2] = self._elements[2] - s;
self._elements[3] = self._elements[3] - s;
self._elements[4] = self._elements[4] - s;
self._elements[5] = self._elements[5] - s;
self._elements[6] = self._elements[6] - s;
self._elements[7] = self._elements[7] - s;
self._elements[8] = self._elements[8] - s;
}
pub fn isub_mat(&mut self, m: Matrix3x3<T>) {
self._elements[0] = self._elements[0] - m._elements[0];
self._elements[1] = self._elements[1] - m._elements[1];
self._elements[2] = self._elements[2] - m._elements[2];
self._elements[3] = self._elements[3] - m._elements[3];
self._elements[4] = self._elements[4] - m._elements[4];
self._elements[5] = self._elements[5] - m._elements[5];
self._elements[6] = self._elements[6] - m._elements[6];
self._elements[7] = self._elements[7] - m._elements[7];
self._elements[8] = self._elements[8] - m._elements[8];
}
pub fn imul_scalar(&mut self, s: T) {
self._elements[0] = self._elements[0] * s;
self._elements[1] = self._elements[1] * s;
self._elements[2] = self._elements[2] * s;
self._elements[3] = self._elements[3] * s;
self._elements[4] = self._elements[4] * s;
self._elements[5] = self._elements[5] * s;
self._elements[6] = self._elements[6] * s;
self._elements[7] = self._elements[7] * s;
self._elements[8] = self._elements[8] * s;
}
pub fn imul_mat(&mut self, m: Matrix3x3<T>) {
self.set_self(self.mul_mat(m));
}
pub fn idiv_scalar(&mut self, s: T) {
self._elements[0] = self._elements[0] / s;
self._elements[1] = self._elements[1] / s;
self._elements[2] = self._elements[2] / s;
self._elements[3] = self._elements[3] / s;
self._elements[4] = self._elements[4] / s;
self._elements[5] = self._elements[5] / s;
self._elements[6] = self._elements[6] / s;
self._elements[7] = self._elements[7] / s;
self._elements[8] = self._elements[8] / s;
}
}
impl<T: Float> Matrix3x3<T> {
pub fn transpose(&mut self) {
let temp = self._elements[1];
self._elements[1] = self._elements[3];
self._elements[3] = temp;
let temp = self._elements[2];
self._elements[2] = self._elements[6];
self._elements[6] = temp;
let temp = self._elements[5];
self._elements[5] = self._elements[7];
self._elements[7] = temp;
}
pub fn invert(&mut self) {
let d = self.determinant();
let mut m = Matrix3x3::new_default();
m._elements[0] = self._elements[4] * self._elements[8] - self._elements[5] * self._elements[7];
m._elements[1] = self._elements[2] * self._elements[7] - self._elements[1] * self._elements[8];
m._elements[2] = self._elements[1] * self._elements[5] - self._elements[2] * self._elements[4];
m._elements[3] = self._elements[5] * self._elements[6] - self._elements[3] * self._elements[8];
m._elements[4] = self._elements[0] * self._elements[8] - self._elements[2] * self._elements[6];
m._elements[5] = self._elements[2] * self._elements[3] - self._elements[0] * self._elements[5];
m._elements[6] = self._elements[3] * self._elements[7] - self._elements[4] * self._elements[6];
m._elements[7] = self._elements[1] * self._elements[6] - self._elements[0] * self._elements[7];
m._elements[8] = self._elements[0] * self._elements[4] - self._elements[1] * self._elements[3];
m.idiv_scalar(d);
self.set_self(m);
}
}
impl<T: Float> Matrix3x3<T> {
pub fn sum(&self) -> T {
let mut s = T::zero();
for i in 0..9 {
s = s + self._elements[i];
}
return s;
}
pub fn avg(&self) -> T {
return self.sum() / T::from(9.0).unwrap();
}
pub fn min(&self) -> T {
let mut m = self._elements[0];
for i in 1..self._elements.len() {
m = T::min(m, self._elements[i]);
}
return m;
}
pub fn max(&self) -> T {
let mut m = self._elements[0];
for i in 1..self._elements.len() {
m = T::max(m, self._elements[i]);
}
return m;
}
pub fn absmin(&self) -> T {
let mut m = self._elements[0];
for i in 1..self._elements.len() {
m = crate::math_utils::absmin(m, self._elements[i]);
}
return m;
}
pub fn absmax(&self) -> T {
let mut m = self._elements[0];
for i in 1..self._elements.len() {
m = crate::math_utils::absmax(m, self._elements[i]);
}
return m;
}
pub fn trace(&self) -> T {
return self._elements[0] + self._elements[4] + self._elements[8];
}
pub fn determinant(&self) -> T {
return self._elements[0] * self._elements[4] * self._elements[8] -
self._elements[0] * self._elements[5] * self._elements[7] +
self._elements[1] * self._elements[5] * self._elements[6] -
self._elements[1] * self._elements[3] * self._elements[8] +
self._elements[2] * self._elements[3] * self._elements[7] -
self._elements[2] * self._elements[4] * self._elements[6];
}
pub fn diagonal(&self) -> Matrix3x3<T> {
return Matrix3x3::new(self._elements[0], T::zero(), T::zero(),
T::zero(), self._elements[4], T::zero(),
T::zero(), T::zero(), self._elements[8]);
}
pub fn off_diagonal(&self) -> Matrix3x3<T> {
return Matrix3x3::new(T::zero(), self._elements[1], self._elements[2],
self._elements[3], T::zero(), self._elements[5],
self._elements[6], self._elements[7], T::zero());
}
pub fn strict_lower_tri(&self) -> Matrix3x3<T> {
return Matrix3x3::new(T::zero(), T::zero(), T::zero(),
self._elements[3], T::zero(), T::zero(),
self._elements[6], self._elements[7], T::zero());
}
pub fn strict_upper_tri(&self) -> Matrix3x3<T> {
return Matrix3x3::new(T::zero(), self._elements[1], self._elements[2],
T::zero(), T::zero(), self._elements[5],
T::zero(), T::zero(), T::zero());
}
pub fn lower_tri(&self) -> Matrix3x3<T> {
return Matrix3x3::new(self._elements[0], T::zero(), T::zero(),
self._elements[3], self._elements[4], T::zero(),
self._elements[6], self._elements[7], self._elements[8]);
}
pub fn upper_tri(&self) -> Matrix3x3<T> {
return Matrix3x3::new(self._elements[0], self._elements[1], self._elements[2],
T::zero(), self._elements[4], self._elements[5],
T::zero(), T::zero(), self._elements[8]);
}
pub fn transposed(&self) -> Matrix3x3<T> {
return Matrix3x3::new(self._elements[0], self._elements[3], self._elements[6],
self._elements[1], self._elements[4], self._elements[7],
self._elements[2], self._elements[5], self._elements[8]);
}
pub fn inverse(&self) -> Matrix3x3<T> {
let mut m = *self;
m.invert();
return m;
}
pub fn frobenius_norm(&self) -> T {
return T::sqrt(self._elements[0] * self._elements[0] + self._elements[1] * self._elements[1] +
self._elements[2] * self._elements[2] + self._elements[3] * self._elements[3] +
self._elements[4] * self._elements[4] + self._elements[5] * self._elements[5] +
self._elements[6] * self._elements[6] + self._elements[7] * self._elements[7] +
self._elements[8] * self._elements[8]);
}
}
impl<T: Float> Clone for Matrix3x3<T> {
fn clone(&self) -> Self {
return Matrix3x3 {
_elements: self._elements,
};
}
}
impl<T: Float> Copy for Matrix3x3<T> {}
impl<T: Float> AddAssign<T> for Matrix3x3<T> {
fn add_assign(&mut self, rhs: T) {
self.iadd_scalar(rhs);
}
}
impl<T: Float> AddAssign for Matrix3x3<T> {
fn add_assign(&mut self, rhs: Self) {
self.iadd_mat(rhs);
}
}
impl<T: Float> SubAssign<T> for Matrix3x3<T> {
fn sub_assign(&mut self, rhs: T) {
self.isub_scalar(rhs);
}
}
impl<T: Float> SubAssign for Matrix3x3<T> {
fn sub_assign(&mut self, rhs: Self) {
self.isub_mat(rhs);
}
}
impl<T: Float> MulAssign<T> for Matrix3x3<T> {
fn mul_assign(&mut self, rhs: T) {
self.imul_scalar(rhs);
}
}
impl<T: Float> MulAssign for Matrix3x3<T> {
fn mul_assign(&mut self, rhs: Self) {
self.imul_mat(rhs);
}
}
impl<T: Float> DivAssign<T> for Matrix3x3<T> {
fn div_assign(&mut self, rhs: T) {
self.idiv_scalar(rhs);
}
}
impl<T: Float> Index<usize> for Matrix3x3<T> {
type Output = T;
fn index(&self, index: usize) -> &Self::Output {
return &self._elements[index];
}
}
impl<T: Float> IndexMut<usize> for Matrix3x3<T> {
fn index_mut(&mut self, index: usize) -> &mut Self::Output {
return &mut self._elements[index];
}
}
impl<T: Float> Index<(usize, usize)> for Matrix3x3<T> {
type Output = T;
fn index(&self, index: (usize, usize)) -> &Self::Output {
return &self._elements[3 * index.0 + index.1];
}
}
impl<T: Float> IndexMut<(usize, usize)> for Matrix3x3<T> {
fn index_mut(&mut self, index: (usize, usize)) -> &mut Self::Output {
return &mut self._elements[3 * index.0 + index.1];
}
}
impl<T: Float> PartialEq for Matrix3x3<T> {
fn eq(&self, other: &Self) -> bool {
return self._elements[0] == other._elements[0] && self._elements[1] == other._elements[1] && self._elements[2] == other._elements[2] &&
self._elements[3] == other._elements[3] && self._elements[4] == other._elements[4] && self._elements[5] == other._elements[5] &&
self._elements[6] == other._elements[6] && self._elements[7] == other._elements[7] && self._elements[8] == other._elements[8];
}
}
impl<T: Float> Eq for Matrix3x3<T> {}
impl<T: Float> Matrix3x3<T> {
pub fn make_zero() -> Matrix3x3<T> {
return Matrix3x3::new(T::zero(), T::zero(), T::zero(),
T::zero(), T::zero(), T::zero(),
T::zero(), T::zero(), T::zero());
}
pub fn make_identity() -> Matrix3x3<T> {
return Matrix3x3::new(T::one(), T::zero(), T::zero(),
T::zero(), T::one(), T::zero(),
T::zero(), T::zero(), T::one());
}
pub fn make_scale_matrix_scalar(sx: T, sy: T, sz: T) -> Matrix3x3<T> {
return Matrix3x3::new(sx, T::zero(), T::zero(),
T::zero(), sy, T::zero(),
T::zero(), T::zero(), sz);
}
pub fn make_scale_matrix_vec(s: Vector3<T>) -> Matrix3x3<T> {
return Matrix3x3::new(s.x, T::zero(), T::zero(),
T::zero(), s.y, T::zero(),
T::zero(), T::zero(), s.z);
}
pub fn make_rotation_matrix(axis: Vector3<T>, rad: T) -> Matrix3x3<T> {
return Matrix3x3::new(
T::one() + (T::one() - T::cos(rad)) * (axis.x * axis.x - T::one()),
-axis.z * T::sin(rad) + (T::one() - T::cos(rad)) * axis.x * axis.y,
axis.y * T::sin(rad) + (T::one() - T::cos(rad)) * axis.x * axis.z,
axis.z * T::sin(rad) + (T::one() - T::cos(rad)) * axis.x * axis.y,
T::one() + (T::one() - T::cos(rad)) * (axis.y * axis.y - T::one()),
-axis.x * T::sin(rad) + (T::one() - T::cos(rad)) * axis.y * axis.z,
-axis.y * T::sin(rad) + (T::one() - T::cos(rad)) * axis.x * axis.z,
axis.x * T::sin(rad) + (T::one() - T::cos(rad)) * axis.y * axis.z,
T::one() + (T::one() - T::cos(rad)) * (axis.z * axis.z - T::one()));
}
}
impl<T: Float> Neg for Matrix3x3<T> {
type Output = Matrix3x3<T>;
fn neg(self) -> Self::Output {
return Matrix3x3::new(-self._elements[0], -self._elements[1], -self._elements[2],
-self._elements[3], -self._elements[4], -self._elements[5],
-self._elements[6], -self._elements[7], -self._elements[8]);
}
}
impl<T: Float> Add<T> for Matrix3x3<T> {
type Output = Matrix3x3<T>;
fn add(self, rhs: T) -> Self::Output {
return self.add_scalar(rhs);
}
}
impl<T: Float> Add for Matrix3x3<T> {
type Output = Matrix3x3<T>;
fn add(self, rhs: Self) -> Self::Output {
return self.add_mat(rhs);
}
}
impl<T: Float> Sub<T> for Matrix3x3<T> {
type Output = Matrix3x3<T>;
fn sub(self, rhs: T) -> Self::Output {
return self.sub_scalar(rhs);
}
}
impl<T: Float> Sub for Matrix3x3<T> {
type Output = Matrix3x3<T>;
fn sub(self, rhs: Self) -> Self::Output {
return self.sub_mat(rhs);
}
}
impl<T: Float> Mul<T> for Matrix3x3<T> {
type Output = Matrix3x3<T>;
fn mul(self, rhs: T) -> Self::Output {
return self.mul_scalar(rhs);
}
}
impl<T: Float> Mul<Vector3<T>> for Matrix3x3<T> {
type Output = Vector3<T>;
fn mul(self, rhs: Vector3<T>) -> Self::Output {
return self.mul_vec(rhs);
}
}
impl<T: Float> Mul for Matrix3x3<T> {
type Output = Matrix3x3<T>;
fn mul(self, rhs: Self) -> Self::Output {
return self.mul_mat(rhs);
}
}
impl<T: Float> Div<T> for Matrix3x3<T> {
type Output = Matrix3x3<T>;
fn div(self, rhs: T) -> Self::Output {
return self.div_scalar(rhs);
}
}