eazy_core/easing/trigonometric/
circle.rs1use crate::easing::Curve;
4
5use libm::sqrtf;
6
7#[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#[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#[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}