1 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
2  * Qwt Widget Library
3  * Copyright (C) 1997   Josef Wilgen
4  * Copyright (C) 2002   Uwe Rathmann
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the Qwt License, Version 1.0
8  *****************************************************************************/
9 
10 #ifndef QWT_MATH_H
11 #define QWT_MATH_H
12 
13 #include <math.h>
14 #include <qpoint.h>
15 #include "qwt_global.h"
16 #include "qwt_double_rect.h"
17 
18 #if QT_VERSION < 0x040000
19 
20 #define qwtMax QMAX
21 #define qwtMin QMIN
22 #define qwtAbs QABS
23 
24 #else // QT_VERSION >= 0x040000
25 
26 #define qwtMax qMax
27 #define qwtMin qMin
28 #define qwtAbs qAbs
29 
30 #endif
31 
32 #ifndef LOG10_2
33 #define LOG10_2     0.30102999566398119802  /* log10(2) */
34 #endif
35 
36 #ifndef LOG10_3
37 #define LOG10_3     0.47712125471966243540  /* log10(3) */
38 #endif
39 
40 #ifndef LOG10_5
41 #define LOG10_5     0.69897000433601885749  /* log10(5) */
42 #endif
43 
44 #ifndef M_2PI
45 #define M_2PI       6.28318530717958623200  /* 2 pi */
46 #endif
47 
48 #ifndef LOG_MIN
49 //! Mininum value for logarithmic scales
50 #define LOG_MIN 1.0e-100
51 #endif
52 
53 #ifndef LOG_MAX
54 //! Maximum value for logarithmic scales
55 #define LOG_MAX 1.0e100
56 #endif
57 
58 #ifndef M_E
59 #define M_E            2.7182818284590452354   /* e */
60 #endif
61 
62 #ifndef M_LOG2E
63 #define M_LOG2E 1.4426950408889634074   /* log_2 e */
64 #endif
65 
66 #ifndef M_LOG10E
67 #define M_LOG10E    0.43429448190325182765  /* log_10 e */
68 #endif
69 
70 #ifndef M_LN2
71 #define M_LN2       0.69314718055994530942  /* log_e 2 */
72 #endif
73 
74 #ifndef M_LN10
75 #define M_LN10         2.30258509299404568402  /* log_e 10 */
76 #endif
77 
78 #ifndef M_PI
79 #define M_PI        3.14159265358979323846  /* pi */
80 #endif
81 
82 #ifndef M_PI_2
83 #define M_PI_2      1.57079632679489661923  /* pi/2 */
84 #endif
85 
86 #ifndef M_PI_4
87 #define M_PI_4      0.78539816339744830962  /* pi/4 */
88 #endif
89 
90 #ifndef M_1_PI
91 #define M_1_PI      0.31830988618379067154  /* 1/pi */
92 #endif
93 
94 #ifndef M_2_PI
95 #define M_2_PI      0.63661977236758134308  /* 2/pi */
96 #endif
97 
98 #ifndef M_2_SQRTPI
99 #define M_2_SQRTPI  1.12837916709551257390  /* 2/sqrt(pi) */
100 #endif
101 
102 #ifndef M_SQRT2
103 #define M_SQRT2 1.41421356237309504880  /* sqrt(2) */
104 #endif
105 
106 #ifndef M_SQRT1_2
107 #define M_SQRT1_2   0.70710678118654752440  /* 1/sqrt(2) */
108 #endif
109 
110 QWT_EXPORT double qwtGetMin(const double *array, int size);
111 QWT_EXPORT double qwtGetMax(const double *array, int size);
112 
113 
114 //! Return the sign
qwtSign(double x)115 inline int qwtSign(double x)
116 {
117     if (x > 0.0)
118        return 1;
119     else if (x < 0.0)
120        return (-1);
121     else
122        return 0;
123 }
124 
125 //! Return the square of a number
qwtSqr(const double x)126 inline double qwtSqr(const double x)
127 {
128     return x*x;
129 }
130 
131 /*!
132   \brief Limit a value to fit into a specified interval
133   \param x Input value
134   \param x1 First interval boundary
135   \param x2 Second interval boundary
136 */
137 template <class T>
qwtLim(const T & x,const T & x1,const T & x2)138 T qwtLim(const T& x, const T& x1, const T& x2)
139 {
140     T rv;
141     T xmin, xmax;
142 
143     xmin = qwtMin(x1, x2);
144     xmax = qwtMax(x1, x2);
145 
146     if ( x < xmin )
147        rv = xmin;
148     else if ( x > xmax )
149        rv = xmax;
150     else
151        rv = x;
152 
153     return rv;
154 }
155 
qwtPolar2Pos(const QPoint & pole,double radius,double angle)156 inline QPoint qwtPolar2Pos(const QPoint &pole,
157     double radius, double angle)
158 {
159     const double x = pole.x() + radius * ::cos(angle);
160     const double y = pole.y() - radius * ::sin(angle);
161 
162     return QPoint(qRound(x), qRound(y));
163 }
164 
qwtDegree2Pos(const QPoint & pole,double radius,double angle)165 inline QPoint qwtDegree2Pos(const QPoint &pole,
166     double radius, double angle)
167 {
168     return qwtPolar2Pos(pole, radius, angle / 180.0 * M_PI);
169 }
170 
qwtPolar2Pos(const QwtDoublePoint & pole,double radius,double angle)171 inline QwtDoublePoint qwtPolar2Pos(const QwtDoublePoint &pole,
172     double radius, double angle)
173 {
174     const double x = pole.x() + radius * ::cos(angle);
175     const double y = pole.y() - radius * ::sin(angle);
176 
177     return QPoint(qRound(x), qRound(y));
178 }
179 
qwtDegree2Pos(const QwtDoublePoint & pole,double radius,double angle)180 inline QwtDoublePoint qwtDegree2Pos(const QwtDoublePoint &pole,
181     double radius, double angle)
182 {
183     return qwtPolar2Pos(pole, radius, angle / 180.0 * M_PI);
184 }
185 
186 //! Rounding of doubles, like qRound for integers
qwtRound(double value)187 inline double qwtRound(double value)
188 {
189     return ::floor(value + 0.5); // MSVC has no ::round().
190 }
191 
192 #endif
193