00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef QWT_SCALE_ENGINE_H
00011 #define QWT_SCALE_ENGINE_H
00012
00013 #include "qwt_global.h"
00014 #include "qwt_scale_div.h"
00015 #include "qwt_interval.h"
00016
00017 class QwtScaleTransformation;
00018
00022 class QWT_EXPORT QwtScaleArithmetic
00023 {
00024 public:
00025 static double ceilEps( double value, double intervalSize );
00026 static double floorEps( double value, double intervalSize );
00027
00028 static double divideEps( double interval, double steps );
00029
00030 static double ceil125( double x );
00031 static double floor125( double x );
00032 };
00033
00047 class QWT_EXPORT QwtScaleEngine
00048 {
00049 public:
00066 enum Attribute
00067 {
00068 NoAttribute = 0,
00069 IncludeReference = 1,
00070 Symmetric = 2,
00071 Floating = 4,
00072 Inverted = 8
00073 };
00074
00075 explicit QwtScaleEngine();
00076 virtual ~QwtScaleEngine();
00077
00078 void setAttribute( Attribute, bool on = true );
00079 bool testAttribute( Attribute ) const;
00080
00081 void setAttributes( int );
00082 int attributes() const;
00083
00084 void setReference( double reference );
00085 double reference() const;
00086
00087 void setMargins( double lower, double upper );
00088 double lowerMargin() const;
00089 double upperMargin() const;
00090
00099 virtual void autoScale( int maxNumSteps,
00100 double &x1, double &x2, double &stepSize ) const = 0;
00101
00112 virtual QwtScaleDiv divideScale( double x1, double x2,
00113 int maxMajSteps, int maxMinSteps,
00114 double stepSize = 0.0 ) const = 0;
00115
00117 virtual QwtScaleTransformation *transformation() const = 0;
00118
00119 protected:
00120 bool contains( const QwtInterval &, double val ) const;
00121 QList<double> strip( const QList<double>&, const QwtInterval & ) const;
00122 double divideInterval( double interval, int numSteps ) const;
00123
00124 QwtInterval buildInterval( double v ) const;
00125
00126 private:
00127 class PrivateData;
00128 PrivateData *d_data;
00129 };
00130
00138 class QWT_EXPORT QwtLinearScaleEngine: public QwtScaleEngine
00139 {
00140 public:
00141 virtual void autoScale( int maxSteps,
00142 double &x1, double &x2, double &stepSize ) const;
00143
00144 virtual QwtScaleDiv divideScale( double x1, double x2,
00145 int numMajorSteps, int numMinorSteps,
00146 double stepSize = 0.0 ) const;
00147
00148 virtual QwtScaleTransformation *transformation() const;
00149
00150 protected:
00151 QwtInterval align( const QwtInterval&, double stepSize ) const;
00152
00153 void buildTicks(
00154 const QwtInterval &, double stepSize, int maxMinSteps,
00155 QList<double> ticks[QwtScaleDiv::NTickTypes] ) const;
00156
00157 QList<double> buildMajorTicks(
00158 const QwtInterval &interval, double stepSize ) const;
00159
00160 void buildMinorTicks(
00161 const QList<double>& majorTicks,
00162 int maxMinMark, double step,
00163 QList<double> &, QList<double> & ) const;
00164 };
00165
00177 class QWT_EXPORT QwtLog10ScaleEngine: public QwtScaleEngine
00178 {
00179 public:
00180 virtual void autoScale( int maxSteps,
00181 double &x1, double &x2, double &stepSize ) const;
00182
00183 virtual QwtScaleDiv divideScale( double x1, double x2,
00184 int numMajorSteps, int numMinorSteps,
00185 double stepSize = 0.0 ) const;
00186
00187 virtual QwtScaleTransformation *transformation() const;
00188
00189 protected:
00190 QwtInterval log10( const QwtInterval& ) const;
00191 QwtInterval pow10( const QwtInterval& ) const;
00192
00193 QwtInterval align( const QwtInterval&, double stepSize ) const;
00194
00195 void buildTicks(
00196 const QwtInterval &, double stepSize, int maxMinSteps,
00197 QList<double> ticks[QwtScaleDiv::NTickTypes] ) const;
00198
00199 QList<double> buildMajorTicks(
00200 const QwtInterval &interval, double stepSize ) const;
00201
00202 QList<double> buildMinorTicks(
00203 const QList<double>& majorTicks,
00204 int maxMinMark, double step ) const;
00205 };
00206
00207 #endif