Main Page | Class Hierarchy | Alphabetical List | Compound List | File List | Compound Members | File Members | Related Pages

qwt_drange.cpp

Go to the documentation of this file.
00001 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
00002  * Qwt Widget Library
00003  * Copyright (C) 1997   Josef Wilgen
00004  * Copyright (C) 2002   Uwe Rathmann
00005  * 
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the Qwt License, Version 1.0
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     // Range check
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     // align to grid
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         // correct rounding error at the border
00106         if (fabs(d_value - d_maxValue) < MinEps * qwtAbs(d_step))
00107            d_value = d_maxValue;
00108 
00109         // correct rounding error if value = 0
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     // look if the step width has an acceptable 
00179     // value or otherwise change it.
00180     //
00181     setStep(vstep);
00182 
00183     //
00184     // limit page size
00185     //
00186     d_pageSize = qwtLim(pageSize,0, 
00187         int(qwtAbs((d_maxValue - d_minValue) / d_step))); 
00188     
00189     // 
00190     // If the value lies out of the range, it 
00191     // will be changed. Note that it will not be adjusted to 
00192     // the new step width.
00193     setNewValue(d_value,0);
00194     
00195     // call notifier after the step width has been 
00196     // adjusted.
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 }

Generated on Fri Nov 7 14:11:45 2003 for Qwt Developer's Guide by doxygen 1.3.2