37#include "qwt_global.h"
46#ifndef _USE_MATH_DEFINES
47#define _USE_MATH_DEFINES
48#define undef_USE_MATH_DEFINES
53#ifdef undef_USE_MATH_DEFINES
54#undef _USE_MATH_DEFINES
55#undef undef_USE_MATH_DEFINES
59#define M_E (2.7182818284590452354)
63#define M_LOG2E (1.4426950408889634074)
67#define M_LOG10E (0.43429448190325182765)
71#define M_LN2 (0.69314718055994530942)
75#define M_LN10 (2.30258509299404568402)
79#define M_PI (3.14159265358979323846)
83#define M_PI_2 (1.57079632679489661923)
87#define M_PI_4 (0.78539816339744830962)
91#define M_1_PI (0.31830988618379067154)
95#define M_2_PI (0.63661977236758134308)
99#define M_2_SQRTPI (1.12837916709551257390)
103#define M_SQRT2 (1.41421356237309504880)
107#define M_SQRT1_2 (0.70710678118654752440)
110#if defined(QT_WARNING_PUSH)
116QT_WARNING_DISABLE_CLANG(
"-Wdouble-promotion")
117QT_WARNING_DISABLE_GCC("-Wdouble-promotion")
126constexpr inline float qwtMinF(
float a,
float b)
128 return (a < b) ? a : b;
132constexpr inline double qwtMinF(
double a,
double b)
134 return (a < b) ? a : b;
138constexpr inline qreal qwtMinF(
float a,
double b)
140 return (a < b) ? a : b;
144constexpr inline qreal qwtMinF(
double a,
float b)
146 return (a < b) ? a : b;
150constexpr inline float qwtMaxF(
float a,
float b)
152 return (a < b) ? b : a;
156constexpr inline double qwtMaxF(
double a,
double b)
158 return (a < b) ? b : a;
162constexpr inline qreal qwtMaxF(
float a,
double b)
164 return (a < b) ? b : a;
168constexpr inline qreal qwtMaxF(
double a,
float b)
170 return (a < b) ? b : a;
173#if defined(QT_WARNING_POP)
177QWT_EXPORT
double qwtNormalizeRadians(
double radians);
178QWT_EXPORT
double qwtNormalizeDegrees(
double degrees);
179QWT_EXPORT quint32 qwtRand();
200inline int qwtFuzzyCompare(
double value1,
double value2,
double intervalSize)
202 const double eps = qAbs(1.0e-6 * intervalSize);
204 if (value2 - value1 > eps)
207 if (value1 - value2 > eps)
214inline int qwtSign(
double x)
225inline double qwtSqr(
double x)
231inline double qwtFastAtan(
double x)
234 return -M_PI_2 - x / (x * x + 0.28);
237 return M_PI_2 - x / (x * x + 0.28);
239 return x / (1.0 + x * x * 0.28);
243inline double qwtFastAtan2(
double y,
double x)
246 return qwtFastAtan(y / x);
249 const double d = qwtFastAtan(y / x);
250 return (y >= 0) ? d + M_PI : d - M_PI;
282inline double qwtCubicPolynomial(
double x,
double a,
double b,
double c,
double d)
284 return (((a * x) + b) * x + c) * x + d;
288inline double qwtRadians(
double degrees)
290 return degrees * M_PI / 180.0;
294inline double qwtDegrees(
double degrees)
296 return degrees * 180.0 / M_PI;
309inline int qwtCeil(qreal value)
312 return int(ceil(value));
324inline int qwtFloor(qreal value)
327 return int(floor(value));
352inline int qwtVerifyRange(
int size,
int& i1,
int& i2)
357 i1 = qBound(0, i1, size - 1);
358 i2 = qBound(0, i2, size - 1);
363 return (i2 - i1 + 1);
380inline double qwtDistance(
const QPointF& p1,
const QPointF& p2)
382 double dx = p2.x() - p1.x();
383 double dy = p2.y() - p1.y();
384 return qSqrt(dx * dx + dy * dy);
411template<
typename T >
412inline typename std::enable_if< std::is_floating_point< T >::value,
bool >::type qwt_is_nan_or_inf(
const T& value)
414 return !std::isfinite(value);
435inline bool qwt_is_nan_or_inf(
const QPointF& point)
437 return !std::isfinite(point.x()) || !std::isfinite(point.y());
451template<
typename T >
452typename std::enable_if< !std::is_floating_point< T >::value && !std::is_same< T, QPointF >::value,
453 bool >::type
inline qwt_is_nan_or_inf(
const T& )
478template<
typename InputIt >
479inline bool qwtContainsNanOrInf(InputIt first, InputIt last)
482 for (InputIt it = first; it != last; ++it) {
483 if (qwt_is_nan_or_inf(*it)) {
508template<
typename Container >
509inline std::size_t qwtRemoveNanOrInf(Container& container)
512 auto new_end = std::remove_if(container.begin(), container.end(), [](
const typename Container::value_type& value) {
513 return qwt_is_nan_or_inf(value);
517 std::size_t removed_count = std::distance(new_end, container.end());
520 if (removed_count > 0) {
521 container.erase(new_end, container.end());
524 return removed_count;
543template<
typename Container >
544inline Container qwtRemoveNanOrInfCopy(
const Container& container)
547 result.reserve(container.size());
550 std::copy_if(container.begin(),
552 std::back_inserter(result),
553 [](
const typename Container::value_type& value) { return !qwt_is_nan_or_inf(value); });
592template<
typename It1,
typename It2 >
593bool fuzzyRangeEqual(It1 first1, It1 last1, It2 first2, It2 last2)
596 if (std::distance(first1, last1) != std::distance(first2, last2))
600 for (; first1 != last1; ++first1, ++first2) {
601 if (!qFuzzyCompare(*first1, *first2))