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}