1 module animate.animate.interpolator;
2 
3 import std.math;
4 
5 interface Interpolator
6 {
7     /+
8      + This takes a value from 0 to 1, and
9      + returns an interpolated value from 0 to 1
10      + based on the type of curve desired.
11      +/
12     double interpolate(double progress)
13     in
14     {
15         assert(progress >= 0 && progress <= 1);
16     }
17     out
18     {
19         assert(progress >= 0 && progress <= 1);
20     }
21 }
22 
23 class LinearInterpolator : Interpolator
24 {
25     double interpolate(double progress)
26     {
27         return progress;
28     }
29 }
30 
31 class CosineInterpolator : Interpolator
32 {
33     double interpolate(double progress)
34     {
35         return cos(PI * 2 * progress);
36     }
37 }
38 
39 class SineInterpolator : Interpolator
40 {
41     double interpolate(double progress)
42     {
43         return sin(PI * 2 * progress);
44     }
45 }
46 
47 class AccelerationInterpolator : Interpolator
48 {
49     double interpolate(double progress)
50     {
51         return progress * progress;
52     }
53 }
54 
55 class DecelerationInterpolator : Interpolator
56 {
57     double interpolate(double progress)
58     {
59         return 1.0 - (1.0 - progress)^^2;
60     }
61 }
62 
63 class AccelerationDecelerationInterpolator : Interpolator
64 {
65     double interpolate(double progress)
66     {
67         return ((cos(progress + 1) * PI) / 2.0) + .5;
68     }
69 }