]> git.sesse.net Git - nageru/blobdiff - piecewise_interpolator.cpp
Split out the piecewise linear interpolation code into its own class.
[nageru] / piecewise_interpolator.cpp
diff --git a/piecewise_interpolator.cpp b/piecewise_interpolator.cpp
new file mode 100644 (file)
index 0000000..3f07247
--- /dev/null
@@ -0,0 +1,46 @@
+#include "piecewise_interpolator.h"
+
+#include <assert.h>
+
+double PiecewiseInterpolator::fraction_to_db(double db) const
+{
+       if (db >= control_points[0].fraction) {
+               return control_points[0].db_value;
+       }
+       if (db <= control_points.back().fraction) {
+               return control_points.back().db_value;
+       }
+       for (unsigned i = 1; i < control_points.size(); ++i) {
+               const double x0 = control_points[i].fraction;
+               const double x1 = control_points[i - 1].fraction;
+               const double y0 = control_points[i].db_value;
+               const double y1 = control_points[i - 1].db_value;
+               if (db >= x0 && db <= x1) {
+                       const double t = (db - x0) / (x1 - x0);
+                       return y0 + t * (y1 - y0);
+               }
+       }
+       assert(false);
+}
+
+double PiecewiseInterpolator::db_to_fraction(double x) const
+{
+       if (x >= control_points[0].db_value) {
+               return control_points[0].fraction;
+       }
+       if (x <= control_points.back().db_value) {
+               return control_points.back().fraction;
+       }
+       for (unsigned i = 1; i < control_points.size(); ++i) {
+               const double x0 = control_points[i].db_value;
+               const double x1 = control_points[i - 1].db_value;
+               const double y0 = control_points[i].fraction;
+               const double y1 = control_points[i - 1].fraction;
+               if (x >= x0 && x <= x1) {
+                       const double t = (x - x0) / (x1 - x0);
+                       return y0 + t * (y1 - y0);
+               }
+       }
+       assert(false);
+}
+