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
00079 virtual void autoScale(int maxSteps,
00080 double &x1, double &x2, double &stepSize) const = 0;
00081
00082 virtual QwtScaleDiv divideScale(double x1, double x2,
00083 int numMajorSteps, int numMinorSteps,
00084 double stepSize = 0.0) const = 0;
00085
00086 virtual QwtScaleTransformation transformation() const = 0;
00087
00088 protected:
00089 bool contains(const QwtDoubleInterval &, double val) const;
00090 QwtTickList strip(const QwtTickList&, const QwtDoubleInterval &) const;
00091 double divideInterval(double interval, int numSteps) const;
00092
00093 QwtDoubleInterval buildInterval(double v) const;
00094
00095 private:
00096 class PrivateData;
00097 PrivateData *d_data;
00098 };
00099
00107 class QWT_EXPORT QwtLinearScaleEngine: public QwtScaleEngine
00108 {
00109 public:
00110 virtual void autoScale(int maxSteps,
00111 double &x1, double &x2, double &stepSize) const;
00112
00113 virtual QwtScaleDiv divideScale(double x1, double x2,
00114 int numMajorSteps, int numMinorSteps,
00115 double stepSize = 0.0) const;
00116
00117 virtual QwtScaleTransformation transformation() const;
00118
00119 protected:
00120 QwtDoubleInterval align(const QwtDoubleInterval&,
00121 double stepSize) const;
00122
00123 private:
00124 void buildTicks(
00125 const QwtDoubleInterval &, double stepSize, int maxMinSteps,
00126 QwtTickList ticks[QwtScaleDiv::NTickTypes]) const;
00127
00128 void buildMinorTicks(
00129 const QwtTickList& majorTicks,
00130 int maxMinMark, double step,
00131 QwtTickList &, QwtTickList &) const;
00132
00133 QwtTickList buildMajorTicks(
00134 const QwtDoubleInterval &interval, double stepSize) const;
00135 };
00136
00148 class QWT_EXPORT QwtLog10ScaleEngine: public QwtScaleEngine
00149 {
00150 public:
00151 virtual void autoScale(int maxSteps,
00152 double &x1, double &x2, double &stepSize) const;
00153
00154 virtual QwtScaleDiv divideScale(double x1, double x2,
00155 int numMajorSteps, int numMinorSteps,
00156 double stepSize = 0.0) const;
00157
00158 virtual QwtScaleTransformation transformation() const;
00159
00160 protected:
00161 QwtDoubleInterval log10(const QwtDoubleInterval&) const;
00162 QwtDoubleInterval pow10(const QwtDoubleInterval&) const;
00163
00164 private:
00165 QwtDoubleInterval align(const QwtDoubleInterval&,
00166 double stepSize) const;
00167
00168 void buildTicks(
00169 const QwtDoubleInterval &, double stepSize, int maxMinSteps,
00170 QwtTickList ticks[QwtScaleDiv::NTickTypes]) const;
00171
00172 QwtTickList buildMinorTicks(
00173 const QwtTickList& majorTicks,
00174 int maxMinMark, double step) const;
00175
00176 QwtTickList buildMajorTicks(
00177 const QwtDoubleInterval &interval, double stepSize) const;
00178 };
00179
00180 #endif