float_lerp/
lib.rs

1use num_traits::*;
2
3pub fn lerp<T: Float> (a: T, b: T, f: T) -> T {
4    a + (b - a) * f
5}
6
7pub fn inverse_lerp<T: Float> (a: T, b: T, v: T) -> T {
8    (v - a) / (b - a)
9}
10
11#[cfg(test)]
12mod tests {
13    #[test]
14    fn positive_lerp() {
15        assert_eq!(crate::lerp(1.0, 2.0, 0.5), 1.5)
16    }
17    #[test]
18    fn positive_reverse_lerp() {
19        assert_eq!(crate::lerp(10.0, 0.0, 0.5), 5.0)
20    }
21    #[test]
22    fn negative_lerp() {
23        assert_eq!(crate::lerp(-10., 0., 0.5), -5.)
24    }
25    #[test]
26    fn reverse_negative_lerp() {
27        assert_eq!(crate::lerp(0., -10., 0.5), -5.)
28    }
29    #[test]
30    fn basic_inverse_lerp() {
31        assert_eq!(crate::inverse_lerp(10.0, 5.0, 7.5), 0.5)
32    }
33}