eazy_data/interpolation/piecewize/
quadratic.rs

1//! The Piecewize Quadratic Curve.
2
3use crate::easing::Curve;
4
5use libm::sqrtf;
6
7/// The [`InPiecewizeQuadratic`] Curve.
8///
9/// #### examples.
10///
11/// ```
12/// use eazy::interpolation::piecewize::quadratic::InPiecewizeQuadratic;
13/// use eazy::Curve;
14///
15/// let p = InPiecewizeQuadratic.y(1.0);
16///
17/// assert_eq!(p, 1.0);
18/// ```
19#[derive(Debug)]
20pub struct InPiecewizeQuadratic;
21
22impl Curve for InPiecewizeQuadratic {
23  #[inline(always)]
24  fn y(&self, p: f32) -> f32 {
25    if p < 0.5 {
26      return 2.0 * p * p;
27    }
28
29    2.0 * p * (2.0 - p) - 1.0
30  }
31}
32
33#[test]
34fn test_in_piecewize_quadratic() {
35  let p = InPiecewizeQuadratic.y(1.0);
36
37  assert_eq!(p, 1.0);
38}
39
40/// The [`OutPiecewizeQuadratic`] Curve.
41///
42/// #### examples.
43///
44/// ```
45/// use eazy::interpolation::piecewize::quadratic::InPiecewizeQuadratic;
46/// use eazy::Curve;
47///
48/// let p = OutPiecewizeQuadratic.y(1.0);
49///
50/// assert_eq!(p, 1.0);
51/// ```
52#[derive(Debug)]
53pub struct OutPiecewizeQuadratic;
54
55impl Curve for OutPiecewizeQuadratic {
56  #[inline(always)]
57  fn y(&self, p: f32) -> f32 {
58    if p < 0.5 {
59      return sqrtf(0.5 * p);
60    }
61
62    1.0 - sqrtf(0.5 - 0.5 * p)
63  }
64}
65
66#[test]
67fn test_out_piecewize_quadratic() {
68  let p = OutPiecewizeQuadratic.y(1.0);
69
70  assert_eq!(p, 1.0);
71}