OLD | NEW |
| (Empty) |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 double _evaluateCubic(double a, double b, double m) { | |
6 // TODO(abarth): Would Math.pow be faster? | |
7 return 3 * a * (1 - m) * (1 - m) * m + 3 * b * (1 - m) * m * m + m * m * m; | |
8 } | |
9 | |
10 const double _kCubicErrorBound = 0.001; | |
11 | |
12 abstract class Curve { | |
13 double transform(double t); | |
14 } | |
15 | |
16 class Linear implements Curve { | |
17 const Linear(); | |
18 | |
19 double transform(double t) { | |
20 return t; | |
21 } | |
22 } | |
23 | |
24 class ParabolicFall implements Curve { | |
25 const ParabolicFall(); | |
26 | |
27 double transform(double t) { | |
28 return -t*t + 1; | |
29 } | |
30 } | |
31 | |
32 class ParabolicRise implements Curve { | |
33 const ParabolicRise(); | |
34 | |
35 double transform(double t) { | |
36 return -(t-1)*(t-1) + 1; | |
37 } | |
38 } | |
39 | |
40 class Cubic implements Curve { | |
41 final double a; | |
42 final double b; | |
43 final double c; | |
44 final double d; | |
45 | |
46 const Cubic(this.a, this.b, this.c, this.d); | |
47 | |
48 double transform(double t) { | |
49 double start = 0.0; | |
50 double end = 1.0; | |
51 while (true) { | |
52 double midpoint = (start + end) / 2; | |
53 double estimate = _evaluateCubic(a, c, midpoint); | |
54 | |
55 if ((t - estimate).abs() < _kCubicErrorBound) | |
56 return _evaluateCubic(b, d, midpoint); | |
57 | |
58 if (estimate < t) | |
59 start = midpoint; | |
60 else | |
61 end = midpoint; | |
62 } | |
63 } | |
64 } | |
65 | |
66 const Linear linear = const Linear(); | |
67 const Cubic ease = const Cubic(0.25, 0.1, 0.25, 1.0); | |
68 const Cubic easeIn = const Cubic(0.42, 0.0, 1.0, 1.0); | |
69 const Cubic easeOut = const Cubic(0.0, 0.0, 0.58, 1.0); | |
70 const Cubic easeInOut = const Cubic(0.42, 0.0, 0.58, 1.0); | |
71 const ParabolicRise parabolicRise = const ParabolicRise(); | |
72 const ParabolicFall parabolicFall = const ParabolicFall(); | |
OLD | NEW |