-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCubic.cs
More file actions
56 lines (47 loc) · 1.47 KB
/
Cubic.cs
File metadata and controls
56 lines (47 loc) · 1.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
namespace XClientTransaction;
public class Cubic
{
private readonly double[] _curves;
public Cubic(double[] curves)
{
_curves = curves;
}
public double GetValue(double time)
{
double start = 0, end = 1, mid = 0;
if (time <= 0)
{
var startGrad = _curves[0] > 0
? _curves[1] / _curves[0]
: _curves[1] == 0 && _curves[2] > 0
? _curves[3] / _curves[2]
: 0;
return startGrad * time;
}
if (time >= 1)
{
var endGrad = _curves[2] < 1
? (_curves[3] - 1) / (_curves[2] - 1)
: _curves[2] == 1 && _curves[0] < 1
? (_curves[1] - 1) / (_curves[0] - 1)
: 0;
return 1 + endGrad * (time - 1);
}
while (start < end)
{
mid = (start + end) / 2;
var xEst = Calculate(_curves[0], _curves[2], mid);
if (Math.Abs(time - xEst) < 0.00001)
return Calculate(_curves[1], _curves[3], mid);
if (xEst < time)
start = mid;
else
end = mid;
}
return Calculate(_curves[1], _curves[3], mid);
}
private static double Calculate(double a, double b, double m)
{
return 3 * a * Math.Pow(1 - m, 2) * m + 3 * b * (1 - m) * m * m + Math.Pow(m, 3);
}
}