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_double_interval.h"
00016
00017 class QwtScaleTransformation;
00018
00022 class QWT_EXPORT QwtScaleArithmetic
00023 {
00024 public:
00025 static int compareEps(
00026 double value1, double value2, double intervalSize);
00027
00028 static double ceilEps(double value, double intervalSize);
00029 static double floorEps(double value, double intervalSize);
00030
00031 static double divideEps(double interval, double steps);
00032
00033 static double ceil125(double x);
00034 static double floor125(double x);
00035 };
00036
00050 class QWT_EXPORT QwtScaleEngine
00051 {
00052 public:
00069 enum Attribute
00070 {
00071 NoAttribute = 0,
00072 IncludeReference = 1,
00073 Symmetric = 2,
00074 Floating = 4,
00075 Inverted = 8
00076 };
00077
00078 explicit QwtScaleEngine();
00079 virtual ~QwtScaleEngine();
00080
00081 void setAttribute(Attribute, bool on = true);
00082 bool testAttribute(Attribute) const;
00083
00084 void setAttributes(int);
00085 int attributes() const;
00086
00087 void setReference(double reference);
00088 double reference() const;
00089
00090 void setMargins(double lower, double upper);
00091 double lowerMargin() const;
00092 double upperMargin() const;
00093
00102 virtual void autoScale(int maxNumSteps,
00103 double &x1, double &x2, double &stepSize) const = 0;
00104
00115 virtual QwtScaleDiv divideScale(double x1, double x2,
00116 int maxMajSteps, int maxMinSteps,
00117 double stepSize = 0.0) const = 0;
00118
00120 virtual QwtScaleTransformation *transformation() const = 0;
00121
00122 protected:
00123 bool contains(const QwtDoubleInterval &, double val) const;
00124 QwtValueList strip(const QwtValueList&, const QwtDoubleInterval &) const;
00125 double divideInterval(double interval, int numSteps) const;
00126
00127 QwtDoubleInterval buildInterval(double v) const;
00128
00129 private:
00130 class PrivateData;
00131 PrivateData *d_data;
00132 };
00133
00141 class QWT_EXPORT QwtLinearScaleEngine: public QwtScaleEngine
00142 {
00143 public:
00144 virtual void autoScale(int maxSteps,
00145 double &x1, double &x2, double &stepSize) const;
00146
00147 virtual QwtScaleDiv divideScale(double x1, double x2,
00148 int numMajorSteps, int numMinorSteps,
00149 double stepSize = 0.0) const;
00150
00151 virtual QwtScaleTransformation *transformation() const;
00152
00153 protected:
00154 QwtDoubleInterval align(const QwtDoubleInterval&,
00155 double stepSize) const;
00156
00157 private:
00158 void buildTicks(
00159 const QwtDoubleInterval &, double stepSize, int maxMinSteps,
00160 QwtValueList ticks[QwtScaleDiv::NTickTypes]) const;
00161
00162 void buildMinorTicks(
00163 const QwtValueList& majorTicks,
00164 int maxMinMark, double step,
00165 QwtValueList &, QwtValueList &) const;
00166
00167 QwtValueList buildMajorTicks(
00168 const QwtDoubleInterval &interval, double stepSize) const;
00169 };
00170
00182 class QWT_EXPORT QwtLog10ScaleEngine: public QwtScaleEngine
00183 {
00184 public:
00185 virtual void autoScale(int maxSteps,
00186 double &x1, double &x2, double &stepSize) const;
00187
00188 virtual QwtScaleDiv divideScale(double x1, double x2,
00189 int numMajorSteps, int numMinorSteps,
00190 double stepSize = 0.0) const;
00191
00192 virtual QwtScaleTransformation *transformation() const;
00193
00194 protected:
00195 QwtDoubleInterval log10(const QwtDoubleInterval&) const;
00196 QwtDoubleInterval pow10(const QwtDoubleInterval&) const;
00197
00198 private:
00199 QwtDoubleInterval align(const QwtDoubleInterval&,
00200 double stepSize) const;
00201
00202 void buildTicks(
00203 const QwtDoubleInterval &, double stepSize, int maxMinSteps,
00204 QwtValueList ticks[QwtScaleDiv::NTickTypes]) const;
00205
00206 QwtValueList buildMinorTicks(
00207 const QwtValueList& majorTicks,
00208 int maxMinMark, double step) const;
00209
00210 QwtValueList buildMajorTicks(
00211 const QwtDoubleInterval &interval, double stepSize) const;
00212 };
00213
00214 #endif