1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
use number_traits::{Cast, Num, Signed}; #[inline] pub fn in_quad<T, F>(s: T, c: T, t: F) -> T where T: Copy + Cast<F> + Num, F: Copy + Cast<T> + Num, { let s = s.cast(); let c = c.cast(); let out = (c * t * t) + s; out.cast() } #[inline] pub fn out_quad<T, F>(s: T, c: T, t: F) -> T where T: Copy + Cast<F> + Num + Signed, F: Copy + Cast<T> + Num + Signed, { let s = s.cast(); let c = c.cast(); let out = (-c * t * (t - F::from_usize(2))) + s; out.cast() } #[inline] pub fn in_out_quad<T, F>(s: T, c: T, t: F) -> T where T: Copy + Cast<F> + Num + Signed, F: Copy + Cast<T> + Num + Signed, { let s = s.cast(); let c = c.cast(); let one = F::one(); let two = F::from_usize(2); let t = t * two; let out = if t < one { ((c / two) * t * t) + s } else { let t = t - one; ((-c / two) * (t * (t - two) - one)) + s }; out.cast() } #[test] fn in_quad_test() { assert_eq!(in_quad(0, 100, 0), 0); assert_eq!(in_quad(0, 100, 0.5), 25); assert_eq!(in_quad(0, 100, 1.0), 100); } #[test] fn out_quad_test() { assert_eq!(out_quad(0, 100, 0), 0); assert_eq!(out_quad(0, 100, 0.5), 75); assert_eq!(out_quad(0, 100, 1.0), 100); } #[test] fn in_out_quad_test() { assert_eq!(in_out_quad(0, 100, 0), 0); assert_eq!(in_out_quad(0, 100, 0.25), 12); assert_eq!(in_out_quad(0, 100, 0.5), 50); assert_eq!(in_out_quad(0, 100, 0.75), 87); assert_eq!(in_out_quad(0, 100, 1.0), 100); }