Make Spline<T>::clamped_sample return Option<T> instead. #9

This commit is contained in:
Dimitri Sabadie 2019-04-13 22:28:24 +02:00
parent bc329fe736
commit 55e792a98b
2 changed files with 24 additions and 18 deletions

View File

@ -45,7 +45,7 @@
//! # let end = Key::new(1., 10., Interpolation::Linear); //! # let end = Key::new(1., 10., Interpolation::Linear);
//! # let spline = Spline::from_vec(vec![start, end]); //! # let spline = Spline::from_vec(vec![start, end]);
//! assert_eq!(spline.sample(0.), Some(0.)); //! assert_eq!(spline.sample(0.), Some(0.));
//! assert_eq!(spline.clamped_sample(1.), 10.); //! assert_eq!(spline.clamped_sample(1.), Some(10.));
//! assert_eq!(spline.sample(1.1), None); //! assert_eq!(spline.sample(1.1), None);
//! ``` //! ```
//! //!
@ -58,8 +58,8 @@
//! # let start = Key::new(0., 0., Interpolation::Linear); //! # let start = Key::new(0., 0., Interpolation::Linear);
//! # let end = Key::new(1., 10., Interpolation::Linear); //! # let end = Key::new(1., 10., Interpolation::Linear);
//! # let spline = Spline::from_vec(vec![start, end]); //! # let spline = Spline::from_vec(vec![start, end]);
//! assert_eq!(spline.clamped_sample(-0.9), 0.); // clamped to the first key //! assert_eq!(spline.clamped_sample(-0.9), Some(0.)); // clamped to the first key
//! assert_eq!(spline.clamped_sample(1.1), 10.); // clamped to the last key //! assert_eq!(spline.clamped_sample(1.1), Some(10.)); // clamped to the last key
//! ``` //! ```
//! //!
//! # Features and customization //! # Features and customization
@ -284,20 +284,26 @@ impl<T> Spline<T> {
/// If you sample before the first key or after the last one, return the first key or the last /// If you sample before the first key or after the last one, return the first key or the last
/// one, respectively. Otherwise, behave the same way as `Spline::sample`. /// one, respectively. Otherwise, behave the same way as `Spline::sample`.
/// ///
/// # Panic /// # Error
/// ///
/// This function panics if you have no key. /// This function returns `None` if you have no key.
pub fn clamped_sample(&self, t: f32) -> T where T: Interpolate { pub fn clamped_sample(&self, t: f32) -> Option<T> where T: Interpolate {
if self.0.is_empty() {
return None;
}
let first = self.0.first().unwrap(); let first = self.0.first().unwrap();
let last = self.0.last().unwrap(); let last = self.0.last().unwrap();
if t <= first.t { let sampled = if t <= first.t {
return first.value; first.value
} else if t >= last.t { } else if t >= last.t {
return last.value; last.value
} } else {
self.sample(t).unwrap() self.sample(t).unwrap()
};
Some(sampled)
} }
} }

View File

@ -18,7 +18,7 @@ fn step_interpolation_0() {
assert_eq!(spline.sample(0.5), Some(10.)); assert_eq!(spline.sample(0.5), Some(10.));
assert_eq!(spline.sample(0.9), Some(10.)); assert_eq!(spline.sample(0.9), Some(10.));
assert_eq!(spline.sample(1.), None); assert_eq!(spline.sample(1.), None);
assert_eq!(spline.clamped_sample(1.), 10.); assert_eq!(spline.clamped_sample(1.), Some(10.));
} }
#[test] #[test]
@ -33,7 +33,7 @@ fn step_interpolation_0_5() {
assert_eq!(spline.sample(0.5), Some(10.)); assert_eq!(spline.sample(0.5), Some(10.));
assert_eq!(spline.sample(0.9), Some(10.)); assert_eq!(spline.sample(0.9), Some(10.));
assert_eq!(spline.sample(1.), None); assert_eq!(spline.sample(1.), None);
assert_eq!(spline.clamped_sample(1.), 10.); assert_eq!(spline.clamped_sample(1.), Some(10.));
} }
#[test] #[test]
@ -48,7 +48,7 @@ fn step_interpolation_0_75() {
assert_eq!(spline.sample(0.5), Some(0.)); assert_eq!(spline.sample(0.5), Some(0.));
assert_eq!(spline.sample(0.9), Some(10.)); assert_eq!(spline.sample(0.9), Some(10.));
assert_eq!(spline.sample(1.), None); assert_eq!(spline.sample(1.), None);
assert_eq!(spline.clamped_sample(1.), 10.); assert_eq!(spline.clamped_sample(1.), Some(10.));
} }
#[test] #[test]
@ -63,7 +63,7 @@ fn step_interpolation_1() {
assert_eq!(spline.sample(0.5), Some(0.)); assert_eq!(spline.sample(0.5), Some(0.));
assert_eq!(spline.sample(0.9), Some(0.)); assert_eq!(spline.sample(0.9), Some(0.));
assert_eq!(spline.sample(1.), None); assert_eq!(spline.sample(1.), None);
assert_eq!(spline.clamped_sample(1.), 10.); assert_eq!(spline.clamped_sample(1.), Some(10.));
} }
#[test] #[test]
@ -78,7 +78,7 @@ fn linear_interpolation() {
assert_eq!(spline.sample(0.5), Some(5.)); assert_eq!(spline.sample(0.5), Some(5.));
assert_eq!(spline.sample(0.9), Some(9.)); assert_eq!(spline.sample(0.9), Some(9.));
assert_eq!(spline.sample(1.), None); assert_eq!(spline.sample(1.), None);
assert_eq!(spline.clamped_sample(1.), 10.); assert_eq!(spline.clamped_sample(1.), Some(10.));
} }
#[test] #[test]
@ -103,7 +103,7 @@ fn linear_interpolation_several_keys() {
assert_eq!(spline.sample(3.), Some(1.)); assert_eq!(spline.sample(3.), Some(1.));
assert_eq!(spline.sample(6.5), Some(1.5)); assert_eq!(spline.sample(6.5), Some(1.5));
assert_eq!(spline.sample(10.), Some(2.)); assert_eq!(spline.sample(10.), Some(2.));
assert_eq!(spline.clamped_sample(11.), 4.); assert_eq!(spline.clamped_sample(11.), Some(4.));
} }
#[test] #[test]
@ -130,7 +130,7 @@ fn several_interpolations_several_keys() {
assert_eq!(spline.sample(3.), Some(1.)); assert_eq!(spline.sample(3.), Some(1.));
assert_eq!(spline.sample(6.5), Some(1.5)); assert_eq!(spline.sample(6.5), Some(1.5));
assert_eq!(spline.sample(10.), Some(2.)); assert_eq!(spline.sample(10.), Some(2.));
assert_eq!(spline.clamped_sample(11.), 4.); assert_eq!(spline.clamped_sample(11.), Some(4.));
} }
#[cfg(feature = "impl-nalgebra")] #[cfg(feature = "impl-nalgebra")]