Go to the documentation of this file.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 ( d_minValue > d_maxValue )
00031 {
00032 return inverted();
00033 }
00034 if ( d_minValue == d_maxValue && d_borderFlags == ExcludeMinimum )
00035 {
00036 return inverted();
00037 }
00038
00039 return *this;
00040 }
00041
00047 QwtDoubleInterval QwtDoubleInterval::inverted() const
00048 {
00049 int borderFlags = 0;
00050 if ( d_borderFlags & ExcludeMinimum )
00051 borderFlags |= ExcludeMaximum;
00052 if ( d_borderFlags & ExcludeMaximum )
00053 borderFlags |= ExcludeMinimum;
00054
00055 return QwtDoubleInterval(d_maxValue, d_minValue, borderFlags);
00056 }
00057
00064 bool QwtDoubleInterval::contains(double value) const
00065 {
00066 if ( !isValid() )
00067 return false;
00068
00069 if ( value < d_minValue || value > d_maxValue )
00070 return false;
00071
00072 if ( value == d_minValue && d_borderFlags & ExcludeMinimum )
00073 return false;
00074
00075 if ( value == d_maxValue && d_borderFlags & ExcludeMaximum )
00076 return false;
00077
00078 return true;
00079 }
00080
00082 QwtDoubleInterval QwtDoubleInterval::unite(
00083 const QwtDoubleInterval &other) const
00084 {
00085
00086
00087
00088
00089 if ( !isValid() )
00090 {
00091 if ( !other.isValid() )
00092 return QwtDoubleInterval();
00093 else
00094 return other;
00095 }
00096 if ( !other.isValid() )
00097 return *this;
00098
00099 QwtDoubleInterval united;
00100 int flags = 0;
00101
00102
00103 if ( d_minValue < other.minValue() )
00104 {
00105 united.setMinValue(d_minValue);
00106 flags &= d_borderFlags & ExcludeMinimum;
00107 }
00108 else if ( other.minValue() < d_minValue )
00109 {
00110 united.setMinValue(other.minValue());
00111 flags &= other.borderFlags() & ExcludeMinimum;
00112 }
00113 else
00114 {
00115 united.setMinValue(d_minValue);
00116 flags &= (d_borderFlags & other.borderFlags()) & ExcludeMinimum;
00117 }
00118
00119
00120 if ( d_maxValue > other.maxValue() )
00121 {
00122 united.setMaxValue(d_maxValue);
00123 flags &= d_borderFlags & ExcludeMaximum;
00124 }
00125 else if ( other.maxValue() > d_maxValue )
00126 {
00127 united.setMaxValue(other.maxValue());
00128 flags &= other.borderFlags() & ExcludeMaximum;
00129 }
00130 else
00131 {
00132 united.setMaxValue(d_maxValue);
00133 flags &= d_borderFlags & other.borderFlags() & ExcludeMaximum;
00134 }
00135
00136 united.setBorderFlags(flags);
00137 return united;
00138 }
00139
00141 QwtDoubleInterval QwtDoubleInterval::intersect(
00142 const QwtDoubleInterval &other) const
00143 {
00144 if ( !other.isValid() || !isValid() )
00145 return QwtDoubleInterval();
00146
00147 QwtDoubleInterval i1 = *this;
00148 QwtDoubleInterval i2 = other;
00149
00150
00151
00152
00153 if ( i1.minValue() > i2.minValue() )
00154 {
00155 qSwap(i1, i2);
00156 }
00157 else if ( i1.minValue() == i2.minValue() )
00158 {
00159 if ( i1.borderFlags() & ExcludeMinimum )
00160 qSwap(i1, i2);
00161 }
00162
00163 if ( i1.maxValue() < i2.minValue() )
00164 {
00165 return QwtDoubleInterval();
00166 }
00167
00168 if ( i1.maxValue() == i2.minValue() )
00169 {
00170 if ( i1.borderFlags() & ExcludeMaximum ||
00171 i2.borderFlags() & ExcludeMinimum )
00172 {
00173 return QwtDoubleInterval();
00174 }
00175 }
00176
00177 QwtDoubleInterval intersected;
00178 int flags = 0;
00179
00180 intersected.setMinValue(i2.minValue());
00181 flags |= i2.borderFlags() & ExcludeMinimum;
00182
00183 if ( i1.maxValue() < i2.maxValue() )
00184 {
00185 intersected.setMaxValue(i1.maxValue());
00186 flags |= i1.borderFlags() & ExcludeMaximum;
00187 }
00188 else if ( i2.maxValue() < i1.maxValue() )
00189 {
00190 intersected.setMaxValue(i2.maxValue());
00191 flags |= i2.borderFlags() & ExcludeMaximum;
00192 }
00193 else
00194 {
00195 intersected.setMaxValue(i1.maxValue() );
00196 flags |= i1.borderFlags() & i2.borderFlags() & ExcludeMaximum;
00197 }
00198
00199 intersected.setBorderFlags(flags);
00200 return intersected;
00201 }
00202
00204 QwtDoubleInterval& QwtDoubleInterval::operator|=(
00205 const QwtDoubleInterval &interval)
00206 {
00207 *this = *this | interval;
00208 return *this;
00209 }
00210
00212 QwtDoubleInterval& QwtDoubleInterval::operator&=(
00213 const QwtDoubleInterval &interval)
00214 {
00215 *this = *this & interval;
00216 return *this;
00217 }
00218
00222 bool QwtDoubleInterval::intersects(const QwtDoubleInterval &other) const
00223 {
00224 if ( !isValid() || !other.isValid() )
00225 return false;
00226
00227 QwtDoubleInterval i1 = *this;
00228 QwtDoubleInterval i2 = other;
00229
00230
00231
00232
00233 if ( i1.minValue() > i2.minValue() )
00234 {
00235 qSwap(i1, i2);
00236 }
00237 else if ( i1.minValue() == i2.minValue() &&
00238 i1.borderFlags() & ExcludeMinimum )
00239 {
00240 qSwap(i1, i2);
00241 }
00242
00243 if ( i1.maxValue() > i2.minValue() )
00244 {
00245 return true;
00246 }
00247 if ( i1.maxValue() == i2.minValue() )
00248 {
00249 return !( (i1.borderFlags() & ExcludeMaximum) ||
00250 (i2.borderFlags() & ExcludeMinimum) );
00251 }
00252 return false;
00253 }
00254
00262 QwtDoubleInterval QwtDoubleInterval::symmetrize(double value) const
00263 {
00264 if ( !isValid() )
00265 return *this;
00266
00267 const double delta =
00268 qwtMax(qwtAbs(value - d_maxValue), qwtAbs(value - d_minValue));
00269
00270 return QwtDoubleInterval(value - delta, value + delta);
00271 }
00272
00281 QwtDoubleInterval QwtDoubleInterval::limited(
00282 double lowerBound, double upperBound) const
00283 {
00284 if ( !isValid() || lowerBound > upperBound )
00285 return QwtDoubleInterval();
00286
00287 double minValue = qwtMax(d_minValue, lowerBound);
00288 minValue = qwtMin(minValue, upperBound);
00289
00290 double maxValue = qwtMax(d_maxValue, lowerBound);
00291 maxValue = qwtMin(maxValue, upperBound);
00292
00293 return QwtDoubleInterval(minValue, maxValue, d_borderFlags);
00294 }
00295
00307 QwtDoubleInterval QwtDoubleInterval::extend(double value) const
00308 {
00309 if ( !isValid() )
00310 return *this;
00311
00312 return QwtDoubleInterval( qwtMin(value, d_minValue),
00313 qwtMax(value, d_maxValue), d_borderFlags );
00314 }
00315
00316 QwtDoubleInterval& QwtDoubleInterval::operator|=(double value)
00317 {
00318 *this = *this | value;
00319 return *this;
00320 }