00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "qwt_drange.h"
00011 #include "qwt_math.h"
00012
00013 static double MinRelStep = 1.0e-10;
00014 static double DefaultRelStep = 1.0e-2;
00015 static double MinEps = 1.0e-10;
00016
00021 QwtDblRange::QwtDblRange():
00022 d_minValue(0.0),
00023 d_maxValue(100.0),
00024 d_step(1.0),
00025 d_pageSize(1),
00026 d_isValid(FALSE),
00027 d_value(0.0),
00028 d_exactValue(0.0),
00029 d_exactPrevValue(0.0),
00030 d_prevValue(0.0),
00031 d_periodic(FALSE)
00032 {
00033 }
00034
00036 QwtDblRange::~QwtDblRange()
00037 {
00038 }
00039
00040 void QwtDblRange::setValid(bool isValid)
00041 {
00042 if ( isValid != d_isValid )
00043 {
00044 d_isValid = isValid;
00045 valueChange();
00046 }
00047 }
00048
00049 bool QwtDblRange::isValid() const
00050 {
00051 return d_isValid;
00052 }
00053
00062 void QwtDblRange::setNewValue(double x, int align)
00063 {
00064 double vmin,vmax;
00065
00066 d_prevValue = d_value;
00067
00068 vmin = qwtMin(d_minValue, d_maxValue);
00069 vmax = qwtMax(d_minValue, d_maxValue);
00070
00071
00072
00073
00074 if (x < vmin)
00075 {
00076 if ((d_periodic) && (vmin != vmax))
00077 d_value = x + ceil( (vmin - x) / (vmax - vmin ) )
00078 * (vmax - vmin);
00079 else
00080 d_value = vmin;
00081 }
00082 else if (x > vmax)
00083 {
00084 if ((d_periodic) && (vmin != vmax))
00085 d_value = x - ceil( ( x - vmax) / (vmax - vmin ))
00086 * (vmax - vmin);
00087 else
00088 d_value = vmax;
00089 }
00090 else
00091 d_value = x;
00092
00093 d_exactPrevValue = d_exactValue;
00094 d_exactValue = d_value;
00095
00096
00097 if (align)
00098 {
00099 if (d_step != 0.0)
00100 d_value = d_minValue +
00101 floor ((d_value - d_minValue) / d_step + 0.5) * d_step;
00102 else
00103 d_value = d_minValue;
00104
00105
00106 if (fabs(d_value - d_maxValue) < MinEps * qwtAbs(d_step))
00107 d_value = d_maxValue;
00108
00109
00110 if (fabs(d_value) < MinEps * qwtAbs(d_step))
00111 d_value = 0.0;
00112 }
00113
00114 if (!d_isValid || d_prevValue != d_value)
00115 {
00116 d_isValid = TRUE;
00117 valueChange();
00118 }
00119 }
00120
00130 void QwtDblRange::fitValue(double x)
00131 {
00132 setNewValue(x,1);
00133 }
00134
00135
00145 void QwtDblRange::setValue(double x)
00146 {
00147 setNewValue(x,0);
00148 }
00149
00167 void QwtDblRange::setRange(double vmin, double vmax, double vstep, int pageSize)
00168 {
00169 int rchg = ((d_maxValue != vmax) || (d_minValue != vmin));
00170
00171 if (rchg)
00172 {
00173 d_minValue = vmin;
00174 d_maxValue = vmax;
00175 }
00176
00177
00178
00179
00180
00181 setStep(vstep);
00182
00183
00184
00185
00186 d_pageSize = qwtLim(pageSize,0,
00187 int(qwtAbs((d_maxValue - d_minValue) / d_step)));
00188
00189
00190
00191
00192
00193 setNewValue(d_value,0);
00194
00195
00196
00197 if (rchg)
00198 rangeChange();
00199 }
00200
00206 void QwtDblRange::setStep(double vstep)
00207 {
00208 double intv = d_maxValue - d_minValue;
00209
00210 double newStep;
00211 if (vstep == 0.0)
00212 newStep = intv * DefaultRelStep;
00213 else
00214 {
00215 if ((intv > 0) && (vstep < 0) || (intv < 0) && (vstep > 0))
00216 newStep = -vstep;
00217 else
00218 newStep = vstep;
00219
00220 if ( fabs(newStep) < fabs(MinRelStep * intv) )
00221 newStep = MinRelStep * intv;
00222 }
00223
00224 if (newStep != d_step)
00225 {
00226 d_step = newStep;
00227 stepChange();
00228 }
00229 }
00230
00231
00246 void QwtDblRange::setPeriodic(bool tf)
00247 {
00248 d_periodic = tf;
00249 }
00250
00257 void QwtDblRange::incValue(int nSteps)
00258 {
00259 if ( isValid() )
00260 setNewValue(d_value + double(nSteps) * d_step,1);
00261 }
00262
00269 void QwtDblRange::incPages(int nPages)
00270 {
00271 if ( isValid() )
00272 setNewValue(d_value + double(nPages) * double(d_pageSize) * d_step,1);
00273 }
00274
00281 void QwtDblRange::valueChange()
00282 {
00283 }
00284
00285
00292 void QwtDblRange::rangeChange()
00293 {
00294 }
00295
00296
00303 void QwtDblRange::stepChange()
00304 {
00305 }
00306
00311 double QwtDblRange::step() const
00312 {
00313 return qwtAbs(d_step);
00314 }
00315
00324 double QwtDblRange::maxValue() const
00325 {
00326 return d_maxValue;
00327 }
00328
00337 double QwtDblRange::minValue() const
00338 {
00339 return d_minValue;
00340 }
00341
00346 bool QwtDblRange::periodic() const
00347 {
00348 return d_periodic;
00349 }
00350
00352 int QwtDblRange::pageSize() const
00353 {
00354 return d_pageSize;
00355 }
00356
00358 double QwtDblRange::value() const
00359 {
00360 return d_value;
00361 }
00362
00372 double QwtDblRange::exactValue() const
00373 {
00374 return d_exactValue;
00375 }
00376
00378 double QwtDblRange::exactPrevValue() const
00379 {
00380 return d_exactPrevValue;
00381 }
00382
00384 double QwtDblRange::prevValue() const
00385 {
00386 return d_prevValue;
00387 }