eazy_core/easing/trigonometric/
circle.rs

1//! # The Circle Curve.
2
3use crate::easing::Curve;
4
5use libm::sqrtf;
6
7/// ### The [`InCircle`] Easing Function.
8///
9/// #### examples.
10///
11/// ```rust
12/// use eazy::Curve;
13/// use eazy::trigonetric::circle::InCircle;
14///
15/// let p = InCircle.y(1.0);
16/// ```
17#[derive(Debug)]
18pub struct InCircle;
19
20impl Curve for InCircle {
21  #[inline(always)]
22  fn y(&self, p: f32) -> f32 {
23    1.0 - (1.0 - p * p)
24  }
25}
26
27#[test]
28fn test_in_circle() {
29  let p = InCircle.y(0.5);
30
31  assert_eq!(p, 0.25);
32}
33
34/// ### The [`OutCircle`] Easing Function.
35///
36/// #### examples.
37///
38/// ```rust
39/// use eazy::Curve;
40/// use eazy::trigonetric::circle::OutCircle;
41///
42/// let p = OutCircle.y(1.0);
43/// ```
44#[derive(Debug)]
45pub struct OutCircle;
46
47impl Curve for OutCircle {
48  #[inline(always)]
49  fn y(&self, p: f32) -> f32 {
50    let m = p - 1.0;
51
52    sqrtf(1.0 - m * m)
53  }
54}
55
56#[test]
57fn test_out_circle() {
58  let p = OutCircle.y(0.5);
59
60  assert_eq!(p, 0.8660254);
61}
62
63/// ### The [`InOutCircle`] Easing Function.
64///
65/// #### examples.
66///
67/// ```rust
68/// use eazy::Curve;
69/// use eazy::trigonetric::circle::InOutCircle;
70///
71/// let p = InOutCircle.y(1.0);
72/// ```
73#[derive(Debug)]
74pub struct InOutCircle;
75
76impl Curve for InOutCircle {
77  #[inline(always)]
78  fn y(&self, p: f32) -> f32 {
79    let m = p - 1.0;
80    let t = p * 2.0;
81
82    if t < 1.0 {
83      return (1.0 - sqrtf(1.0 - t * t)) * 0.5;
84    }
85
86    (sqrtf(1.0 - 4.0 * m * m) + 1.0) * 0.5
87  }
88}
89
90#[test]
91fn test_in_out_circle() {
92  let p = InOutCircle.y(0.5);
93
94  assert_eq!(p, 0.5);
95}