From f6fc122290ab1b34c84272c1843a1c56091ab876 Mon Sep 17 00:00:00 2001
From: Dmitri Naumov <github@naumov.de>
Date: Thu, 20 Oct 2016 00:10:43 +0200
Subject: [PATCH] [MaL] Speedup the piecewise interpolation.

---
 .../PiecewiseLinearInterpolation.cpp          | 41 +++++++++++--------
 1 file changed, 25 insertions(+), 16 deletions(-)

diff --git a/MathLib/InterpolationAlgorithms/PiecewiseLinearInterpolation.cpp b/MathLib/InterpolationAlgorithms/PiecewiseLinearInterpolation.cpp
index cf984006af5..33ab8f3ddc8 100644
--- a/MathLib/InterpolationAlgorithms/PiecewiseLinearInterpolation.cpp
+++ b/MathLib/InterpolationAlgorithms/PiecewiseLinearInterpolation.cpp
@@ -52,13 +52,18 @@ double PiecewiseLinearInterpolation::getValue(double pnt_to_interpolate) const
                                     pnt_to_interpolate));
     std::size_t const interval_idx = std::distance(_supp_pnts.begin(), it) - 1;
 
+    // support points.
+    double const x = _supp_pnts[interval_idx];
+    double const x_r = _supp_pnts[interval_idx + 1];
+
+    // values.
+    double const f = _values_at_supp_pnts[interval_idx];
+    double const f_r = _values_at_supp_pnts[interval_idx + 1];
+
     // compute linear interpolation polynom: y = m * (x - support[i]) + value[i]
-    const double m((_values_at_supp_pnts[interval_idx + 1] -
-                    _values_at_supp_pnts[interval_idx]) /
-                   (_supp_pnts[interval_idx + 1] - _supp_pnts[interval_idx]));
+    const double m = (f_r - f) / (x_r - x);
 
-    return m * (pnt_to_interpolate - _supp_pnts[interval_idx]) +
-           _values_at_supp_pnts[interval_idx];
+    return m * (pnt_to_interpolate - x) + f;
 }
 
 double PiecewiseLinearInterpolation::getDerivative(
@@ -81,17 +86,21 @@ double PiecewiseLinearInterpolation::getDerivative(
 
     if (interval_idx > 2 && interval_idx < _supp_pnts.size() - 1)
     {
-        double const tangent_right =
-            (_values_at_supp_pnts[interval_idx - 1] -
-             _values_at_supp_pnts[interval_idx + 1]) /
-            (_supp_pnts[interval_idx - 1] - _supp_pnts[interval_idx + 1]);
-        double const tangent_left =
-            (_values_at_supp_pnts[interval_idx - 2] -
-             _values_at_supp_pnts[interval_idx]) /
-            (_supp_pnts[interval_idx - 2] - _supp_pnts[interval_idx]);
-        double const w =
-            (pnt_to_interpolate - _supp_pnts[interval_idx]) /
-            (_supp_pnts[interval_idx - 1] - _supp_pnts[interval_idx]);
+        // left and right support points.
+        double const x_ll = _supp_pnts[interval_idx - 2];
+        double const x_l = _supp_pnts[interval_idx - 1];
+        double const x = _supp_pnts[interval_idx];
+        double const x_r = _supp_pnts[interval_idx + 1];
+
+        // left and right values.
+        double const f_ll = _values_at_supp_pnts[interval_idx - 2];
+        double const f_l = _values_at_supp_pnts[interval_idx - 1];
+        double const f = _values_at_supp_pnts[interval_idx];
+        double const f_r = _values_at_supp_pnts[interval_idx + 1];
+
+        double const tangent_right = (f_l - f_r) / (x_l - x_r);
+        double const tangent_left = (f_ll - f) / (x_ll - x);
+        double const w = (pnt_to_interpolate - x) / (x_l - x);
         return (1. - w) * tangent_right + w * tangent_left;
     }
     else
-- 
GitLab