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:
00054 enum Attribute
00055 {
00056 NoAttribute = 0,
00057 IncludeReference = 1,
00058 Symmetric = 2,
00059 Floating = 4,
00060 Inverted = 8
00061 };
00062
00063 explicit QwtScaleEngine();
00064 virtual ~QwtScaleEngine();
00065
00066 void setAttribute(Attribute, bool on = true);
00067 bool testAttribute(Attribute) const;
00068
00069 void setAttributes(int);
00070 int attributes() const;
00071
00072 void setReference(double reference);
00073 double reference() const;
00074
00075 void setMargins(double m1, double m2);
00076 double loMargin() const;
00077 double hiMargin() const;
00078
00087 virtual void autoScale(int maxNumSteps,
00088 double &x1, double &x2, double &stepSize) const = 0;
00089
00100 virtual QwtScaleDiv divideScale(double x1, double x2,
00101 int maxMajSteps, int maxMinSteps,
00102 double stepSize = 0.0) const = 0;
00103
00105 virtual QwtScaleTransformation *transformation() const = 0;
00106
00107 protected:
00108 bool contains(const QwtDoubleInterval &, double val) const;
00109 QwtValueList strip(const QwtValueList&, const QwtDoubleInterval &) const;
00110 double divideInterval(double interval, int numSteps) const;
00111
00112 QwtDoubleInterval buildInterval(double v) const;
00113
00114 private:
00115 class PrivateData;
00116 PrivateData *d_data;
00117 };
00118
00126 class QWT_EXPORT QwtLinearScaleEngine: public QwtScaleEngine
00127 {
00128 public:
00129 virtual void autoScale(int maxSteps,
00130 double &x1, double &x2, double &stepSize) const;
00131
00132 virtual QwtScaleDiv divideScale(double x1, double x2,
00133 int numMajorSteps, int numMinorSteps,
00134 double stepSize = 0.0) const;
00135
00136 virtual QwtScaleTransformation *transformation() const;
00137
00138 protected:
00139 QwtDoubleInterval align(const QwtDoubleInterval&,
00140 double stepSize) const;
00141
00142 private:
00143 void buildTicks(
00144 const QwtDoubleInterval &, double stepSize, int maxMinSteps,
00145 QwtValueList ticks[QwtScaleDiv::NTickTypes]) const;
00146
00147 void buildMinorTicks(
00148 const QwtValueList& majorTicks,
00149 int maxMinMark, double step,
00150 QwtValueList &, QwtValueList &) const;
00151
00152 QwtValueList buildMajorTicks(
00153 const QwtDoubleInterval &interval, double stepSize) const;
00154 };
00155
00167 class QWT_EXPORT QwtLog10ScaleEngine: public QwtScaleEngine
00168 {
00169 public:
00170 virtual void autoScale(int maxSteps,
00171 double &x1, double &x2, double &stepSize) const;
00172
00173 virtual QwtScaleDiv divideScale(double x1, double x2,
00174 int numMajorSteps, int numMinorSteps,
00175 double stepSize = 0.0) const;
00176
00177 virtual QwtScaleTransformation *transformation() const;
00178
00179 protected:
00180 QwtDoubleInterval log10(const QwtDoubleInterval&) const;
00181 QwtDoubleInterval pow10(const QwtDoubleInterval&) const;
00182
00183 private:
00184 QwtDoubleInterval align(const QwtDoubleInterval&,
00185 double stepSize) const;
00186
00187 void buildTicks(
00188 const QwtDoubleInterval &, double stepSize, int maxMinSteps,
00189 QwtValueList ticks[QwtScaleDiv::NTickTypes]) const;
00190
00191 QwtValueList buildMinorTicks(
00192 const QwtValueList& majorTicks,
00193 int maxMinMark, double step) const;
00194
00195 QwtValueList buildMajorTicks(
00196 const QwtDoubleInterval &interval, double stepSize) const;
00197 };
00198
00199 #endif