eazy_data/easing/backtracking/
back.rs

1//! # The Back Curve.
2
3use crate::easing::Curve;
4
5const C1: f32 = 1.70158;
6const C2: f32 = C1 * 1.525;
7
8/// ### The [`InBack`] Easing Function.
9///
10/// #### examples.
11///
12/// ```rust
13/// use eazy::Curve;
14/// use eazy::standard::back::InBack;
15///
16/// let p = InBack.y(1.0);
17///
18/// assert_eq!(p, 1.0);
19/// ```
20#[derive(Debug)]
21pub struct InBack;
22
23impl Curve for InBack {
24  #[inline(always)]
25  fn y(&self, p: f32) -> f32 {
26    let k = C1;
27
28    p * p * (p * (k + 1.0) - k)
29  }
30}
31
32#[test]
33fn test_in_back() {
34  let p = InBack.y(1.0);
35
36  assert_eq!(p, 1.0);
37}
38
39/// ### The [`OutBack`] Easing Function.
40///
41/// #### examples.
42///
43/// ```rust
44/// use eazy::Curve;
45/// use eazy::standard::back::OutBack;
46///
47/// let p = OutBack.y(1.0);
48///
49/// assert_eq!(p, 1.0);
50/// ```
51#[derive(Debug)]
52pub struct OutBack;
53
54impl Curve for OutBack {
55  #[inline(always)]
56  fn y(&self, p: f32) -> f32 {
57    let m = p - 1.0;
58    let k = C1;
59
60    1.0 + m * m * (m * (k + 1.0) + k)
61  }
62}
63
64#[test]
65fn test_out_back() {
66  let p = OutBack.y(1.0);
67
68  assert_eq!(p, 1.0);
69}
70
71/// ### The [`InOutBack`] Easing Function.
72///
73/// #### examples.
74///
75/// ```rust
76/// use eazy::Curve;
77/// use eazy::standard::back::InOutBack;
78///
79/// let p = InOutBack.y(1.0);
80///
81/// assert_eq!(p, 1.0);
82/// ```
83#[derive(Debug)]
84pub struct InOutBack;
85
86impl Curve for InOutBack {
87  #[inline(always)]
88  fn y(&self, p: f32) -> f32 {
89    let m = p - 1.0;
90    let t = p * 2.0;
91    let k = C1 * C2;
92
93    if t < 1.0 {
94      return p * t * (t * (k + 1.0) - k);
95    }
96
97    1.0 + 2.0 * m * m * (2.0 * m * (k + 1.0) + k)
98  }
99}
100
101#[test]
102fn test_in_out_back() {
103  let p = InOutBack.y(1.0);
104
105  assert_eq!(p, 1.0);
106}