C++ (Qt)QVector<QPair<double, QVariant> >
value = point0 * k0(t) + ctl0 * k1(t) + ctl1 * k2(t) + point1 * k3(t);
C++ (Qt)QVariant myColorInterpolator(const MyColor &start, const MyColor &end, qreal progress){// красная компонента float red = start.red * (1.0 - progress) + end.red * progress; // др компоненты ... return MyColor(red, green, blue);}
C++ (Qt)float k0 = CalcK0(progress); // вычисление коэффициентов сплайна (зависят только от t)... float red = start.red * k0 + start.red_ctl1 * k1 + end.red_ctl0 * k2 + end.red * k3;
C++ (Qt)struct AbstractCurve{...}; template <class Key, class Point, class Option = EmptyOption>struct Curve final : public AbstractCurve{ struct Data { Key key; Point point; Option option; }; ... using Container = vector<Data>; Container data; ...};
C++ (Qt)QVector<QPair<TimeValue, QVariant> >
class ColorInterpolator : public AbstractInterpolator{ColorInterpolator(const MyColor &start, const MyColor &end, Hint hint): _start(start), _end(_end), _hint(hint){}QVariant interpolate(qreal progress) override{// красная компонента float k0 = CalcK0(_hint, progress); // вычисление коэффициентов сплайна (зависят только от t). // _hint - это что вам захочется, тип кривой (и тогда внутре будет свитч по типу кривой) // или модно передать std::function() которая будет вычислять эти ваши k. // или это просто массив будет // тут уж вам виднее, как удобнее считать коэффициенты ... float red = _start.red * k0 + _start.red_ctl1 * k1 + _end.red_ctl0 * k2 + _end.red * k3;// др компоненты ... return MyColor(red, green, blue);}private:};
auto interpolate[k1, k2, k3, start, end](qreal time) { return /*ваша форумула*/; };