diff --git a/src/point.rs b/src/point.rs index df5a299..980d496 100644 --- a/src/point.rs +++ b/src/point.rs @@ -118,6 +118,10 @@ macro_rules! impl_point { fn product(self) -> S where S: Mul { fold_array!(mul, { $(self.$field),+ }) } + + fn is_finite(&self) -> bool where S: BaseFloat { + $(self.$field.is_finite())&&+ + } } impl $PointN { diff --git a/src/quaternion.rs b/src/quaternion.rs index fb07ae4..8723785 100644 --- a/src/quaternion.rs +++ b/src/quaternion.rs @@ -173,6 +173,10 @@ impl Quaternion { (self * scale1 + other * scale2) * Rad::sin(theta).recip() } } + + pub fn is_finite(&self) -> bool { + self.s.is_finite() && self.v.is_finite() + } } impl Zero for Quaternion { diff --git a/src/structure.rs b/src/structure.rs index d165fa1..75eadeb 100644 --- a/src/structure.rs +++ b/src/structure.rs @@ -87,6 +87,11 @@ where fn product(self) -> Self::Element where Self::Element: Mul::Element>; + + /// Whether all elements of the array are finite + fn is_finite(&self) -> bool + where + Self::Element: BaseFloat; } /// Element-wise arithmetic operations. These are supplied for pragmatic diff --git a/src/vector.rs b/src/vector.rs index 05d1ae7..b71c65e 100644 --- a/src/vector.rs +++ b/src/vector.rs @@ -118,13 +118,6 @@ 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] @@ -170,6 +163,10 @@ macro_rules! impl_vector { fn product(self) -> S where S: Mul { fold_array!(mul, { $(self.$field),+ }) } + + fn is_finite(&self) -> bool where S: BaseFloat { + $(self.$field.is_finite())&&+ + } } impl Zero for $VectorN {