From 4fede94df5fb025e7cefa29c2890f393af465665 Mon Sep 17 00:00:00 2001 From: Richard Dodd Date: Sat, 28 Apr 2018 11:34:45 +0100 Subject: [PATCH] Add is_finite method to vectors and matrices. This method is useful in debug to error early when some kind of singularity is encountered. --- src/matrix.rs | 15 +++++++++++++++ src/vector.rs | 31 +++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/matrix.rs b/src/matrix.rs index c960064..c5606d1 100644 --- a/src/matrix.rs +++ b/src/matrix.rs @@ -106,6 +106,11 @@ impl Matrix2 { Matrix2::new(c, s, -s, c) } + + /// Are all entries in the matrix finite. + pub fn is_finite(&self) -> bool { + self.x.is_finite() && self.y.is_finite() + } } impl Matrix3 { @@ -205,6 +210,11 @@ impl Matrix3 { _1subc * axis.z * axis.z + c, ) } + + /// Are all entries in the matrix finite. + pub fn is_finite(&self) -> bool { + self.x.is_finite() && self.y.is_finite() && self.z.is_finite() + } } impl Matrix4 { @@ -357,6 +367,11 @@ impl Matrix4 { S::zero(), S::zero(), S::zero(), S::one(), ) } + + /// Are all entries in the matrix finite. + pub fn is_finite(&self) -> bool { + self.w.is_finite() && self.x.is_finite() && self.y.is_finite() && self.z.is_finite() + } } impl Zero for Matrix2 { diff --git a/src/vector.rs b/src/vector.rs index 108792a..9cc18a6 100644 --- a/src/vector.rs +++ b/src/vector.rs @@ -118,6 +118,13 @@ macro_rules! impl_vector { $VectorN::new($($field),+) } + impl $VectorN { + /// True if all entries in the vector are finite + pub fn is_finite(&self) -> bool { + $(self.$field.is_finite())&&+ + } + } + impl $VectorN { /// Component-wise casting to another type. #[inline] @@ -1323,6 +1330,14 @@ mod tests { assert_eq!(v, &VECTOR2); } } + + #[test] + fn test_is_finite() { + use num_traits::Float; + assert!(!Vector2::from([Float::nan(), 1.0]).is_finite()); + assert!(!Vector2::from([1.0, Float::infinity()]).is_finite()); + assert!(Vector2::from([-1.0, 1.0]).is_finite()); + } } mod vector3 { @@ -1428,6 +1443,14 @@ mod tests { assert_eq!(v, &VECTOR3); } } + + #[test] + fn test_is_finite() { + use num_traits::Float; + assert!(!Vector3::from([Float::nan(), 1.0, 1.0]).is_finite()); + assert!(!Vector3::from([1.0, 1.0, Float::infinity()]).is_finite()); + assert!(Vector3::from([-1.0, 1.0, 1.0]).is_finite()); + } } mod vector4 { @@ -1539,5 +1562,13 @@ mod tests { assert_eq!(v, &VECTOR4); } } + + #[test] + fn test_is_finite() { + use num_traits::Float; + assert!(!Vector4::from([0.0, Float::nan(), 1.0, 1.0]).is_finite()); + assert!(!Vector4::from([1.0, 1.0, Float::neg_infinity(), 0.0]).is_finite()); + assert!(Vector4::from([-1.0, 0.0, 1.0, 1.0]).is_finite()); + } } }