00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef QWT_SCALE_MAP_H
00011 #define QWT_SCALE_MAP_H
00012
00013 #include "qwt_global.h"
00014 #include "qwt_math.h"
00015
00019 class QWT_EXPORT QwtScaleTransformation
00020 {
00021 public:
00022 QwtScaleTransformation();
00023 QwtScaleTransformation(
00024 double (*xForm)(double x, double s1, double s2, double p1, double p2),
00025 double (*invXForm)(double x, double p1, double p2, double s1, double s2)
00026 );
00027
00028 static double linearXForm(double x, double s1, double s2,
00029 double p1, double p2);
00030
00031 static double log10XForm(double x, double s1, double s2,
00032 double p1, double p2);
00033 static double log10InvXForm(double x, double p1, double p2,
00034 double s1, double s2);
00035
00036
00037 double (*xForm)(double x, double s1, double s2, double p1, double p2);
00038 double (*invXForm)(double y, double p1, double p2, double s1, double s2);
00039 };
00040
00047 class QWT_EXPORT QwtScaleMap
00048 {
00049 public:
00050 QwtScaleMap();
00051 QwtScaleMap(int i1, int i2, double d1, double d2);
00052 ~QwtScaleMap();
00053
00054 void setTransformation(bool logarithmic);
00055 void setTransformation(const QwtScaleTransformation& );
00056 const QwtScaleTransformation &transformation() const;
00057
00058 void setPaintInterval(int p1, int p2);
00059 void setPaintXInterval(double p1, double p2);
00060 void setScaleInterval(double s1, double s2);
00061
00062 int transform(double x) const;
00063 double invTransform(double i) const;
00064
00065 double xTransform(double x) const;
00066
00067 inline double p1() const;
00068 inline double p2() const;
00069
00070 inline double s1() const;
00071 inline double s2() const;
00072
00073 QT_STATIC_CONST double LogMin;
00074 QT_STATIC_CONST double LogMax;
00075
00076 private:
00077 void newFactor();
00078
00079 double d_s1, d_s2;
00080 double d_p1, d_p2;
00081
00082 double d_cnv;
00083
00084 QwtScaleTransformation d_transformation;
00085 };
00086
00090 inline double QwtScaleMap::s1() const
00091 {
00092 return d_s1;
00093 }
00094
00098 inline double QwtScaleMap::s2() const
00099 {
00100 return d_s2;
00101 }
00102
00106 inline double QwtScaleMap::p1() const
00107 {
00108 return d_p1;
00109 }
00110
00114 inline double QwtScaleMap::p2() const
00115 {
00116 return d_p2;
00117 }
00118
00123 inline double QwtScaleMap::xTransform(double x) const
00124 {
00125
00126
00127
00128 if ( d_transformation.xForm == QwtScaleTransformation::linearXForm )
00129 return d_p1 + (x - d_s1) * d_cnv;
00130
00131 if ( d_transformation.xForm == QwtScaleTransformation::log10XForm )
00132 return d_p1 + log(x / d_s1) * d_cnv;
00133
00134 return (*d_transformation.xForm)(x, d_s1, d_s2, d_p1, d_p2);
00135 }
00136
00141 inline double QwtScaleMap::invTransform(double y) const
00142 {
00143 return (*d_transformation.invXForm)(y, d_p1, d_p2, d_s1, d_s2);
00144 }
00145
00153 inline int QwtScaleMap::transform(double x) const
00154 {
00155 return qRound(xTransform(x));
00156 }
00157
00158 #endif