#ifndef FADE_HH #define FADE_HH #include <cmath> // tanh #include "constants.hh" // pi inline double fade(const double x, const double x1, const double x2, const double y1, const double y2) { /* fades two functions together smoothly over the range x1 to x2 * function does not check that x2 > x1 */ double theta; theta = (x - x1) / (x2 - x1); // map (linear) {x1 , x2 } => {0 , +1 } theta = (theta - 0.5) * 2.0 * pi; // map (linear) {0 , +1 } => {-Pi , +Pi} theta = tanh(theta); // map (non-linear) {-Pi , +Pi} => {-1 , +1 } theta = (theta + 1.0) / 2.0; // map (linear) {-1 , +1 } => {0 , +1 } return (theta * y1 + (1.0 - theta) * y2); } inline double chkfade(const double x, const double x1, const double x2, const double y1, const double y2) { double X1 = x1, X2 = x2; if (x1 > x2) { std::cerr << "* Warning: chkfade; x2 > x1, swapping" << std::endl; X1 = x2; X2 = x1; } return ((x <= X1) ? y1 : (x > X2) ? y2 : fade(x, X1, X2, y1, y2)); } #endif // FADE_HH