1 #pragma once
2 
3 #include <mbgl/util/interpolate.hpp>
4 #include <mbgl/util/range.hpp>
5 #include <mbgl/util/unitbezier.hpp>
6 
7 namespace mbgl {
8 namespace style {
9 namespace expression {
10 
11 class ExponentialInterpolator {
12 public:
ExponentialInterpolator(double base_)13     ExponentialInterpolator(double base_) : base(base_) {}
14 
15     double base;
16 
interpolationFactor(const Range<double> & inputLevels,const double input) const17     double interpolationFactor(const Range<double>& inputLevels, const double input) const {
18         return util::interpolationFactor(base,
19                                          Range<float> {
20                                             static_cast<float>(inputLevels.min),
21                                             static_cast<float>(inputLevels.max)
22                                          },
23                                          input);
24     }
25 
operator ==(const ExponentialInterpolator & rhs) const26     bool operator==(const ExponentialInterpolator& rhs) const {
27         return base == rhs.base;
28     }
29 };
30 
31 class CubicBezierInterpolator {
32 public:
CubicBezierInterpolator(double x1_,double y1_,double x2_,double y2_)33     CubicBezierInterpolator(double x1_, double y1_, double x2_, double y2_) : ub(x1_, y1_, x2_, y2_) {}
34 
interpolationFactor(const Range<double> & inputLevels,const double input) const35     double interpolationFactor(const Range<double>& inputLevels, const double input) const {
36         return ub.solve(input / (inputLevels.max - inputLevels.min), 1e-6);
37     }
38 
operator ==(const CubicBezierInterpolator & rhs) const39     bool operator==(const CubicBezierInterpolator& rhs) const {
40         return ub == rhs.ub;
41     }
42 
43     util::UnitBezier ub;
44 };
45 
46 using Interpolator = variant<ExponentialInterpolator, CubicBezierInterpolator>;
47 
48 } // namespace expression
49 } // namespace style
50 } // namespace mbgl
51