#pragma once #include #include #include namespace mbgl { namespace style { namespace expression { class ExponentialInterpolator { public: ExponentialInterpolator(double base_) noexcept : base(base_) {} double base; double interpolationFactor(const Range& inputLevels, const double input) const noexcept { return util::interpolationFactor( static_cast(base), Range{static_cast(inputLevels.min), static_cast(inputLevels.max)}, static_cast(input)); } bool operator==(const ExponentialInterpolator& rhs) const noexcept { return base == rhs.base; } }; class CubicBezierInterpolator { public: CubicBezierInterpolator(double x1_, double y1_, double x2_, double y2_) noexcept : ub(x1_, y1_, x2_, y2_) {} double interpolationFactor(const Range& inputLevels, const double input) const noexcept { return ub.solve(util::interpolationFactor( 1.0f, Range{static_cast(inputLevels.min), static_cast(inputLevels.max)}, static_cast(input)), 1e-6); } bool operator==(const CubicBezierInterpolator& rhs) const noexcept { return ub == rhs.ub; } util::UnitBezier ub; }; using Interpolator = variant; } // namespace expression } // namespace style } // namespace mbgl