diff --git a/src/bin/flat/float_fun.rs b/src/bin/flat/float_fun.rs new file mode 100644 index 0000000..82411e9 --- /dev/null +++ b/src/bin/flat/float_fun.rs @@ -0,0 +1,36 @@ +use glam::FloatExt; + +mod bounds { + pub trait Pair {} + + impl Pair for (T, T) {} +} + +pub trait FloatExt2: bounds::Pair { + fn lerp(self, t: T) -> T; + fn inverse_lerp(self, y: T) -> T; +} + +impl FloatExt2 for (F, F) { + fn lerp(self, t: F) -> F { F::lerp(self.0, self.1, t) } + fn inverse_lerp(self, y: F) -> F { F::inverse_lerp(self.0, self.1, y) } +} + +#[cfg(test)] +mod test { + use super::FloatExt2; + + #[test] + fn test_lerp() { + assert_eq!((3., 7.).lerp(-0.5), 1.); + assert_eq!((3., 7.).lerp(0.0), 3.); + assert_eq!((3., 7.).lerp(0.5), 5.); + assert_eq!((3., 7.).lerp(1.0), 7.); + assert_eq!((3., 7.).lerp(1.5), 9.); + assert_eq!((3., 7.).inverse_lerp(1.), -0.5); + assert_eq!((3., 7.).inverse_lerp(3.), 0.0); + assert_eq!((3., 7.).inverse_lerp(5.), 0.5); + assert_eq!((3., 7.).inverse_lerp(7.), 1.0); + assert_eq!((3., 7.).inverse_lerp(9.), 1.5); + } +} diff --git a/src/bin/flat/fns.rs b/src/bin/flat/fns.rs index c6d94d8..526e6d7 100644 --- a/src/bin/flat/fns.rs +++ b/src/bin/flat/fns.rs @@ -1,4 +1,4 @@ -use crate::FloatExt2; +use crate::float_fun::FloatExt2; pub struct LinearLimiter { pub min: f32, diff --git a/src/bin/flat/main.rs b/src/bin/flat/main.rs index 244b2f7..2f65d2a 100644 --- a/src/bin/flat/main.rs +++ b/src/bin/flat/main.rs @@ -5,6 +5,7 @@ use glam::*; mod riemann; mod fns; +mod float_fun; use riemann::{Tens2, Decomp2, Metric, trace_iter}; use shape::Shape; @@ -680,13 +681,3 @@ fn test_tube_metric_derivs() { } } } - -trait FloatExt2 { - fn lerp(&self, t: f32) -> f32; - fn inverse_lerp(&self, y: f32) -> f32; -} - -impl FloatExt2 for (f32, f32) { - fn lerp(&self, t: f32) -> f32 { f32::lerp(self.0, self.1, t) } - fn inverse_lerp(&self, y: f32) -> f32 { f32::inverse_lerp(self.0, self.1, y) } -}