summaryrefslogtreecommitdiff
path: root/muse2/muse/widgets/mmath.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'muse2/muse/widgets/mmath.cpp')
-rw-r--r--muse2/muse/widgets/mmath.cpp300
1 files changed, 300 insertions, 0 deletions
diff --git a/muse2/muse/widgets/mmath.cpp b/muse2/muse/widgets/mmath.cpp
new file mode 100644
index 00000000..acc8e25a
--- /dev/null
+++ b/muse2/muse/widgets/mmath.cpp
@@ -0,0 +1,300 @@
+#include <cmath>
+#include "mmath.h"
+
+// QwtMath - a set of mathematical routines
+//
+// qwtGetMin -- Find the smallest value in an array
+// qwtGetMax -- Find the largest value in an array
+// qwtTwistArray -- invert the order of an array
+// qwtFloor125 -- Find the largest value fitting in a 1-2-5 pattern
+// qwtCeil125 -- Find the smallest value fitting in a 1-2-5 pattern
+// qwtChkMono -- Check for monotony
+// qwtLinSpace -- construct an array of equally spaced values
+// qwtLogSpace -- construct an array of logarithmically equally spaced values
+// qwtMax -- Return the largest of two values
+// qwtMin -- Return the smallest of two values
+// qwtAbs -- return the absolute value
+// qwtSign -- Return the sign of a number
+// qwtSqr -- Return the square of a number
+// qwtCopyArray -- Copy an array into another
+// qwtShiftArray -- Shift an array
+// qwtSwap -- Swap two values
+// qwtSort (1) -- Sort two values
+// qwtSort (2) -- Sort two values
+// qwtInt -- Return nearest integer
+// qwtLim -- Limit a values
+
+
+//------------------------------------------------------------
+//.F qwtGetMin
+// Find the smallest value in an array
+//
+//.u Syntax
+//.f double qwtGetMin(double *array, int size)
+//
+//.u Parameters
+//.p double *array, int size
+//
+//------------------------------------------------------------
+
+double qwtGetMin(double *array, int size)
+{
+ double rv;
+ int i;
+
+ if (size > 0)
+ {
+ rv = array[0];
+ for (i=1; i< size; i++)
+ rv = qwtMin(rv, array[i]);
+ return rv;
+ }
+ else
+ return 0.0;
+
+}
+
+
+//------------------------------------------------------------
+//
+//.F qwtGetMax
+// Find the largest value in an array
+//
+//.u Syntax
+//.f double qwtGetMax(double *array, int size)
+//
+//.u Parameters
+//.p double *array, int size
+//
+//------------------------------------------------------------
+double qwtGetMax(double *array, int size)
+{
+ double rv;
+ int i;
+
+ if (size > 0)
+ {
+ rv = array[0];
+ for (i=1; i< size; i++)
+ rv = qwtMax(rv, array[i]);
+ return rv;
+ }
+ else
+ return 0.0;
+
+}
+
+
+//------------------------------------------------------------
+//
+//.F qwtCeil125
+// Find the smallest value out of {1,2,5}*10^n with an integer number n
+// which is greater than or equal to x
+//
+//.u Syntax
+//.f double qwtCeil125(double x)
+//
+//.u Parameters
+//.p double x
+//
+//------------------------------------------------------------
+double qwtCeil125( double x)
+{
+ double lx, rv;
+ double p10, fr;
+ double sign = ( x > 0) ? 1.0 : -1.0;
+
+ if (x == 0.0) return 0.0;
+
+ lx = log10(fabs(x));
+ p10 = floor(lx);
+ fr = pow(10.0,lx - p10);
+ if (fr <=1.0)
+ fr = 1.0;
+ else if (fr <= 2.0)
+ fr = 2.0;
+ else if (fr <= 5.0)
+ fr = 5.0;
+ else
+ fr = 10.0;
+ rv = fr * pow(10.0,p10);
+ return sign * rv;
+}
+
+
+//------------------------------------------------------------
+//
+//.F qwtFloor125
+// Find the largest value out of {1,2,5}*10^n with an integer number n
+// which is smaller than or equal to x
+//
+//.u Syntax
+//.f double qwtFloor125(double x)
+//
+//.u Parameters
+//.p double x
+//
+//------------------------------------------------------------
+double qwtFloor125( double x)
+{
+ double lx, rv;
+ double p10, fr;
+ double sign = ( x > 0) ? 1.0 : -1.0;
+
+ if (x == 0.0) return 0.0;
+
+ lx = log10(fabs(x));
+ p10 = floor(lx);
+ fr = pow(10.0,lx - p10);
+ if (fr >= 10.0)
+ fr = 10.0;
+ else if (fr >= 5.0)
+ fr = 5.0;
+ else if (fr >= 2.0)
+ fr = 2.0;
+ else
+ fr = 1.0;
+ rv = fr * pow(10.0,p10);
+ return sign * rv;
+}
+
+
+//------------------------------------------------------------
+//
+//.F qwtChkMono
+// Checks if an array is a strictly monotonic sequence
+//
+//.u Syntax
+//.f int qwtChkMono(double *array, int size)
+//
+//.u Parameters
+//.p double *array -- pointer to a double array
+// int size -- size of the array
+//
+//.u Return Value
+//.t 0 -- sequence is not strictly monotonic
+// 1 -- sequence is strictly monotonically increasing
+// -1 -- sequence is strictly monotonically decreasing
+//
+//------------------------------------------------------------
+int qwtChkMono(double *array, int size)
+{
+ int rv, i;
+
+ if (size < 2) return 0;
+
+ rv = qwtSign(array[1] - array[0]);
+ for (i=1;i<size-1;i++)
+ {
+ if ( qwtSign(array[i+1] - array[i]) != rv )
+ {
+ rv = 0;
+ break;
+ }
+ }
+ return rv;
+
+}
+
+//------------------------------------------------------------
+//
+//.F qwtTwistArray
+// Invert the order of array elements
+//
+//.u Syntax
+//.f void qwtTwistArray(double *array, int size)
+//
+//.u Parameters
+//.p double *array, int size
+//
+//------------------------------------------------------------
+void qwtTwistArray(double *array, int size)
+{
+ int itmp;
+ int i, s2;
+ double dtmp;
+
+ s2 = size / 2;
+
+ for (i=0; i < s2; i++)
+ {
+ itmp = size - 1 - i;
+ dtmp = array[i];
+ array[i] = array[itmp];
+ array[itmp] = dtmp;
+ }
+
+}
+
+
+//------------------------------------------------------------
+//
+//.F qwtLinSpace
+// Create an array of equally spaced values
+//
+//.u Syntax
+//.f void qwtLinSpace(double *array, int size, double xmin, double xmax)
+//
+//.u Parameters
+//.p double *array -- where to put the values
+// int size -- size of the array
+// double xmin -- value associated with index 0
+// double xmax -- value associated with index (size-1)
+//
+//------------------------------------------------------------
+void qwtLinSpace(double *array, int size, double xmin, double xmax)
+{
+ int i, imax;
+ imax = size -1;
+ double step;
+
+ if (size > 0)
+ {
+ array[0] = xmin;
+ array[imax] = xmax;
+ step = (xmax - xmin) / double(imax);
+
+ for (i=1;i<imax;i++)
+ array[i] = xmin + double(i) * step;
+ }
+
+}
+
+
+//------------------------------------------------------------
+//
+//.F qwtLogSpace
+// Create an array of logarithmically equally spaced values
+//
+//.u Syntax
+//.f void qwtLogSpace(double *array, int size, double xmin, double xmax)
+//
+//.u Parameters
+//.p double *array -- where to put the values
+// int size -- size of the array
+// double xmin -- value associated with index 0
+// double xmax -- value associated with index (size-1)
+//------------------------------------------------------------
+void qwtLogSpace(double *array, int size, double xmin, double xmax)
+{
+ int i, imax;
+
+ double lxmin,lxmax;
+ double lstep;
+
+ imax = size -1;
+
+ if ((xmin <= 0.0) || (xmax <= 0.0) || (size <= 0))
+ return;
+
+ array[0] = xmin;
+ array[imax] = xmax;
+ lxmin = log(xmin);
+ lxmax = log(xmax);
+
+ lstep = (lxmax - lxmin) / double(imax);
+
+ for (i=1; i<imax;i++)
+ array[i] = exp(lxmin + double(i) * lstep);
+
+}