00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <qglobal.h>
00011 #if QT_VERSION >= 0x040000
00012 #include <qalgorithms.h>
00013 #else
00014 #include <qtl.h>
00015 #endif
00016
00017 #include "qwt_math.h"
00018 #include "qwt_double_interval.h"
00019
00028 QwtDoubleInterval QwtDoubleInterval::normalized() const
00029 {
00030 if ( !isValid() )
00031 {
00032 return QwtDoubleInterval(d_maxValue, d_minValue);
00033 }
00034 else
00035 return *this;
00036 }
00037
00043 QwtDoubleInterval QwtDoubleInterval::inverted() const
00044 {
00045 return QwtDoubleInterval(d_maxValue, d_minValue);
00046 }
00047
00054 bool QwtDoubleInterval::contains(double value) const
00055 {
00056 if ( !isValid() )
00057 return false;
00058
00059 return (value >= d_minValue) && (value <= d_maxValue);
00060 }
00061
00063 QwtDoubleInterval QwtDoubleInterval::unite(
00064 const QwtDoubleInterval &interval) const
00065 {
00066 if ( !isValid() )
00067 {
00068 if ( !interval.isValid() )
00069 return QwtDoubleInterval();
00070 else
00071 return interval;
00072 }
00073 if ( !interval.isValid() )
00074 return *this;
00075
00076 const double minValue = qwtMin(d_minValue, interval.minValue());
00077 const double maxValue = qwtMax(d_maxValue, interval.maxValue());
00078
00079 return QwtDoubleInterval(minValue, maxValue);
00080 }
00081
00083 QwtDoubleInterval QwtDoubleInterval::intersect(
00084 const QwtDoubleInterval &interval) const
00085 {
00086 if ( !interval.isValid() || !isValid() )
00087 return QwtDoubleInterval();
00088
00089 QwtDoubleInterval i1 = *this;
00090 QwtDoubleInterval i2 = interval;
00091
00092 if ( i1.minValue() > i2.minValue() )
00093 qSwap(i1, i2);
00094
00095 if ( i1.maxValue() < i2.minValue() )
00096 return QwtDoubleInterval();
00097
00098 return QwtDoubleInterval(i2.minValue(),
00099 qwtMin(i1.maxValue(), i2.maxValue()));
00100 }
00101
00102 QwtDoubleInterval& QwtDoubleInterval::operator|=(
00103 const QwtDoubleInterval &interval)
00104 {
00105 *this = *this | interval;
00106 return *this;
00107 }
00108
00109 QwtDoubleInterval& QwtDoubleInterval::operator&=(
00110 const QwtDoubleInterval &interval)
00111 {
00112 *this = *this & interval;
00113 return *this;
00114 }
00115
00119 bool QwtDoubleInterval::intersects(const QwtDoubleInterval &interval) const
00120 {
00121 if ( !isValid() || !interval.isValid() )
00122 return false;
00123
00124 QwtDoubleInterval i1 = *this;
00125 QwtDoubleInterval i2 = interval;
00126
00127 if ( i1.minValue() > i2.minValue() )
00128 qSwap(i1, i2);
00129
00130 return i1.maxValue() >= i2.minValue();
00131 }
00132
00140 QwtDoubleInterval QwtDoubleInterval::symmetrize(double value) const
00141 {
00142 if ( !isValid() )
00143 return *this;
00144
00145 const double delta =
00146 qwtMax(qwtAbs(value - d_maxValue), qwtAbs(value - d_minValue));
00147
00148 return QwtDoubleInterval(value - delta, value + delta);
00149 }
00150
00159 QwtDoubleInterval QwtDoubleInterval::limited(
00160 double lBound, double hBound) const
00161 {
00162 if ( !isValid() || lBound > hBound )
00163 return QwtDoubleInterval();
00164
00165 double minValue = qwtMax(d_minValue, lBound);
00166 minValue = qwtMin(minValue, hBound);
00167
00168 double maxValue = qwtMax(d_maxValue, lBound);
00169 maxValue = qwtMin(maxValue, hBound);
00170
00171 return QwtDoubleInterval(minValue, maxValue);
00172 }
00173
00185 QwtDoubleInterval QwtDoubleInterval::extend(double value) const
00186 {
00187 if ( !isValid() )
00188 return *this;
00189
00190 return QwtDoubleInterval(
00191 qwtMin(value, d_minValue), qwtMax(value, d_maxValue) );
00192 }
00193
00194 QwtDoubleInterval& QwtDoubleInterval::operator|=(double value)
00195 {
00196 *this = *this | value;
00197 return *this;
00198 }