+static double mitchell_tap(double x)
+{
+ const double b = 1.0 / 3.0;
+ const double c = 1.0 / 3.0;
+ const double p0 = ( 6.0 - 2.0*b ) / 6.0;
+ const double p2 = (-18.0 + 12.0*b + 6.0*c) / 6.0;
+ const double p3 = ( 12.0 - 9.0*b - 6.0*c) / 6.0;
+ const double q0 = ( 8.0*b + 24.0*c) / 6.0;
+ const double q1 = ( - 12.0*b - 48.0*c) / 6.0;
+ const double q2 = ( 6.0*b + 30.0*c) / 6.0;
+ const double q3 = ( - b - 6.0*c) / 6.0;
+
+ if (x < -2.0) {
+ return 0.0;
+ } else if (x < -1.0) {
+ return q0 - x * (q1 - x * (q2 - x * q3));
+ } else if (x < 0.0) {
+ return p0 + x * x * (p2 - x * p3);
+ } else if (x < 1.0) {
+ return p0 + x * x * (p2 + x * p3);
+ } else if (x < 2.0) {
+ return q0 + x * (q1 + x * (q2 + x * q3));
+ } else {
+ return 0.0;
+ }
+}
+