From c97bc25323e341563d1d22d69a576745f8bb427e Mon Sep 17 00:00:00 2001 From: Bill Thiede Date: Thu, 1 Jul 2021 20:54:00 -0700 Subject: [PATCH] Implement 2x2 determinant --- rtchallenge/src/matrices.rs | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/rtchallenge/src/matrices.rs b/rtchallenge/src/matrices.rs index 677f3b1..d9ea7d3 100644 --- a/rtchallenge/src/matrices.rs +++ b/rtchallenge/src/matrices.rs @@ -18,6 +18,22 @@ impl Matrix2x2 { pub fn new(r0: [f32; 2], r1: [f32; 2]) -> Matrix2x2 { Matrix2x2 { m: [r0, r1] } } + + /// Calculate the determinant of a 2x2. + /// + /// # Examples + /// + /// ``` + /// use rtchallenge::matrices::Matrix2x2; + /// + /// let a = Matrix2x2::new([1., 5.], [-3., 2.]); + /// + /// assert_eq!(a.determinant(), 17.); + /// ``` + pub fn determinant(&self) -> f32 { + let m = self; + m[(0, 0)] * m[(1, 1)] - m[(0, 1)] * m[(1, 0)] + } } impl Index<(usize, usize)> for Matrix2x2 { type Output = f32; @@ -131,7 +147,7 @@ impl Matrix4x4 { /// use rtchallenge::matrices::Matrix4x4; /// /// let i = Matrix4x4::identity(); - /// assert_eq!(i.inverse() * i, i); + /// assert_eq!(i.inverse_old() * i, i); /// /// let m = Matrix4x4::new( /// [2., 0., 0., 0.], @@ -139,10 +155,10 @@ impl Matrix4x4 { /// [0., 0., 4., 0.], /// [0., 0., 0., 1.], /// ); - /// assert_eq!(m.inverse() * m, i); - /// assert_eq!(m * m.inverse(), i); + /// assert_eq!(m.inverse_old() * m, i); + /// assert_eq!(m * m.inverse_old(), i); /// ``` - pub fn inverse(&self) -> Matrix4x4 { + pub fn inverse_old(&self) -> Matrix4x4 { // TODO(wathiede): how come the C++ version doesn't need to deal with non-invertable // matrix. let mut indxc: [usize; 4] = Default::default();