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 #ifndef QT_NO_DEBUG_STREAM
00016 #include <qdebug.h>
00017 #endif
00018
00019 class QRectF;
00020
00024 class QWT_EXPORT QwtScaleTransformation
00025 {
00026 public:
00037 enum Type
00038 {
00039 Linear,
00040 Log10,
00041
00042 Other
00043 };
00044
00045 QwtScaleTransformation( Type type );
00046 virtual ~QwtScaleTransformation();
00047
00048 virtual double xForm( double x, double s1, double s2,
00049 double p1, double p2 ) const;
00050 virtual double invXForm( double x, double s1, double s2,
00051 double p1, double p2 ) const;
00052
00053 Type type() const;
00054
00055 virtual QwtScaleTransformation *copy() const;
00056
00057 private:
00058 QwtScaleTransformation();
00059 QwtScaleTransformation &operator=( const QwtScaleTransformation );
00060
00061 const Type d_type;
00062 };
00063
00065 inline QwtScaleTransformation::Type QwtScaleTransformation::type() const
00066 {
00067 return d_type;
00068 }
00069
00076 class QWT_EXPORT QwtScaleMap
00077 {
00078 public:
00079 QwtScaleMap();
00080 QwtScaleMap( const QwtScaleMap& );
00081
00082 ~QwtScaleMap();
00083
00084 QwtScaleMap &operator=( const QwtScaleMap & );
00085
00086 void setTransformation( QwtScaleTransformation * );
00087 const QwtScaleTransformation *transformation() const;
00088
00089 void setPaintInterval( double p1, double p2 );
00090 void setScaleInterval( double s1, double s2 );
00091
00092 double transform( double s ) const;
00093 double invTransform( double p ) const;
00094
00095 double p1() const;
00096 double p2() const;
00097
00098 double s1() const;
00099 double s2() const;
00100
00101 double pDist() const;
00102 double sDist() const;
00103
00104 QT_STATIC_CONST double LogMin;
00105 QT_STATIC_CONST double LogMax;
00106
00107 static QRectF transform( const QwtScaleMap &,
00108 const QwtScaleMap &, const QRectF & );
00109 static QRectF invTransform( const QwtScaleMap &,
00110 const QwtScaleMap &, const QRectF & );
00111
00112 bool isInverting() const;
00113
00114 private:
00115 void newFactor();
00116
00117 double d_s1, d_s2;
00118 double d_p1, d_p2;
00119
00120 double d_cnv;
00121
00122 QwtScaleTransformation *d_transformation;
00123 };
00124
00128 inline double QwtScaleMap::s1() const
00129 {
00130 return d_s1;
00131 }
00132
00136 inline double QwtScaleMap::s2() const
00137 {
00138 return d_s2;
00139 }
00140
00144 inline double QwtScaleMap::p1() const
00145 {
00146 return d_p1;
00147 }
00148
00152 inline double QwtScaleMap::p2() const
00153 {
00154 return d_p2;
00155 }
00156
00160 inline double QwtScaleMap::pDist() const
00161 {
00162 return qAbs( d_p2 - d_p1 );
00163 }
00164
00168 inline double QwtScaleMap::sDist() const
00169 {
00170 return qAbs( d_s2 - d_s1 );
00171 }
00172
00179 inline double QwtScaleMap::transform( double s ) const
00180 {
00181
00182
00183 if ( d_transformation->type() == QwtScaleTransformation::Linear )
00184 return d_p1 + ( s - d_s1 ) * d_cnv;
00185
00186 if ( d_transformation->type() == QwtScaleTransformation::Log10 )
00187 return d_p1 + log( s / d_s1 ) * d_cnv;
00188
00189 return d_transformation->xForm( s, d_s1, d_s2, d_p1, d_p2 );
00190 }
00191
00199 inline double QwtScaleMap::invTransform( double p ) const
00200 {
00201 return d_transformation->invXForm( p, d_p1, d_p2, d_s1, d_s2 );
00202 }
00203
00205 inline bool QwtScaleMap::isInverting() const
00206 {
00207 return ( ( d_p1 < d_p2 ) != ( d_s1 < d_s2 ) );
00208 }
00209
00210 #ifndef QT_NO_DEBUG_STREAM
00211 QWT_EXPORT QDebug operator<<( QDebug, const QwtScaleMap & );
00212 #endif
00213
00214 #endif