44#define ANIMATIONHELPER_CC
46#include "AnimationHelper.hh"
50#define APPROXIMATION_EPSILON 1.0e-09
51#define VERYSMALL 1.0e-20
52#define MAXIMUM_ITERATIONS 1000
54template<
typename Scalar>
55Scalar AnimationHelper::clampTo01Interval(Scalar _value) {
58 else if (_value > 1.0)
64template<
typename Scalar>
65Scalar AnimationHelper::abs(Scalar _value) {
72template<
typename Scalar>
74 if (_atX - _P0X < VERYSMALL)
77 if (_P1X - _atX < VERYSMALL)
80 long iterationStep = 0;
82 float u = 0.0f;
float v = 1.0f;
85 while (iterationStep < MAXIMUM_ITERATIONS) {
88 Scalar a = (_P0X + _C0X)*0.5;
89 Scalar b = (_C0X + _C1X)*0.5;
90 Scalar c = (_C1X + _P1X)*0.5;
91 Scalar d = (a + b)*0.5;
92 Scalar e = (b + c)*0.5;
93 Scalar f = (d + e)*0.5;
96 if (abs<Scalar>(f - _atX) < APPROXIMATION_EPSILON)
97 return clampTo01Interval<Scalar>((u + v)*0.5f);
106 _C0X = a; _C1X = d; _P1X = f; v = (u + v)*0.5f;
112 return clampTo01Interval<Scalar>((u + v)*0.5f);
115template<
typename Scalar>
117 unsigned int size = _P0.size();
118 assert(size == _P1.size() && size == _C0.size() && size == _C1.size());
123 std::vector<Scalar> result;
125 for (
unsigned int i=0;i<size;++i) {
126 result.push_back( _P0[i]*sinv*sinv*sinv + 3*_C0[i]*s*sinv*sinv + 3*_C1[i]*s*s*sinv + _P1[i]*s*s*s );
static float approximateCubicBezierParameter(Scalar _atX, Scalar _P0X, Scalar _P1X, Scalar _C0X, Scalar _C1X)
Approximates the parameter value for a Bezier curve to get a certain x value Does an iterative DeCast...
static std::vector< Scalar > evaluateBezier(float at, std::vector< Scalar > _P0, std::vector< Scalar > _P1, std::vector< Scalar > _C0, std::vector< Scalar > _C1)
Evaluates the cubic Bezier curve parameterized by P0, P1, C0 and C1 at the parameter value "at".