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,
00025 double p1, double p2, void *),
00026 double (*invXForm)(double x, double p1, double p2,
00027 double s1, double s2, void *)
00028 );
00029
00030 static double linearXForm(double x, double s1, double s2,
00031 double p1, double p2, void *);
00032
00033 static double log10XForm(double x, double s1, double s2,
00034 double p1, double p2, void *);
00035 static double log10InvXForm(double x, double p1, double p2,
00036 double s1, double s2, void *);
00037
00038 double (*xForm)(double x, double s1, double s2,
00039 double p1, double p2, void *);
00040 double (*invXForm)(double y, double p1, double p2,
00041 double s1, double s2, void *);
00042 };
00043
00050 class QWT_EXPORT QwtScaleMap
00051 {
00052 public:
00053 QwtScaleMap();
00054 QwtScaleMap(int i1, int i2, double d1, double d2);
00055 ~QwtScaleMap();
00056
00057 void setTransformation(bool logarithmic);
00058 void setTransformation(const QwtScaleTransformation& );
00059 const QwtScaleTransformation &transformation() const;
00060
00061 void setPaintInterval(int p1, int p2);
00062 void setPaintXInterval(double p1, double p2);
00063 void setScaleInterval(double s1, double s2);
00064
00065 void setTransformationData(void *);
00066 void *transformationData() const;
00067
00068 int transform(double x) const;
00069 double invTransform(double i) const;
00070
00071 double xTransform(double x) const;
00072
00073 inline double p1() const;
00074 inline double p2() const;
00075
00076 inline double s1() const;
00077 inline double s2() const;
00078
00079 QT_STATIC_CONST double LogMin;
00080 QT_STATIC_CONST double LogMax;
00081
00082 private:
00083 void newFactor();
00084
00085 double d_s1, d_s2;
00086 double d_p1, d_p2;
00087
00088 double d_cnv;
00089 void *d_transformationData;
00090
00091 QwtScaleTransformation d_transformation;
00092 };
00093
00097 inline double QwtScaleMap::s1() const
00098 {
00099 return d_s1;
00100 }
00101
00105 inline double QwtScaleMap::s2() const
00106 {
00107 return d_s2;
00108 }
00109
00113 inline double QwtScaleMap::p1() const
00114 {
00115 return d_p1;
00116 }
00117
00121 inline double QwtScaleMap::p2() const
00122 {
00123 return d_p2;
00124 }
00125
00130 inline double QwtScaleMap::xTransform(double x) const
00131 {
00132
00133
00134
00135 if ( d_transformation.xForm == QwtScaleTransformation::linearXForm )
00136 return d_p1 + (x - d_s1) * d_cnv;
00137
00138 if ( d_transformation.xForm == QwtScaleTransformation::log10XForm )
00139 return d_p1 + log(x / d_s1) * d_cnv;
00140
00141 return (*d_transformation.xForm)(x, d_s1, d_s2,
00142 d_p1, d_p2, d_transformationData );
00143 }
00144
00149 inline double QwtScaleMap::invTransform(double y) const
00150 {
00151 return (*d_transformation.invXForm)(y, d_p1, d_p2,
00152 d_s1, d_s2, d_transformationData);
00153 }
00154
00162 inline int QwtScaleMap::transform(double x) const
00163 {
00164 return qRound(xTransform(x));
00165 }
00166
00167 #endif