diff options
Diffstat (limited to 'src/libs/utils/mathutils.cpp')
-rw-r--r-- | src/libs/utils/mathutils.cpp | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/libs/utils/mathutils.cpp b/src/libs/utils/mathutils.cpp index 465d4d5f99..d9e18b18a3 100644 --- a/src/libs/utils/mathutils.cpp +++ b/src/libs/utils/mathutils.cpp @@ -12,7 +12,7 @@ namespace Utils::MathUtils { For x = x1 it returns y1. For x = x2 it returns y2. */ -int interpolate(int x, int x1, int x2, int y1, int y2) +int interpolateLinear(int x, int x1, int x2, int y1, int y2) { if (x1 == x2) return y1; // or the middle point between y1 and y2? @@ -27,4 +27,21 @@ int interpolate(int x, int x1, int x2, int y1, int y2) return qRound((double)numerator / denominator); } +/*! + Tangential interpolation: + For x = 0 it returns y1. + For x = xHalfLife it returns 50 % of the distance between y1 and y2. + For x = infinity it returns y2. +*/ +int interpolateTangential(int x, int xHalfLife, int y1, int y2) +{ + if (x == 0) + return y1; + if (y1 == y2) + return y1; + const double mapped = atan2(double(x), double(xHalfLife)); + const double progress = y1 + (y2 - y1) * mapped * 2 / M_PI; + return qRound(progress); +} + } // namespace Utils::Math |