Qwt User's Guide 5.2.2
|
00001 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** 00002 * Qwt Widget Library 00003 * Copyright (C) 1997 Josef Wilgen 00004 * Copyright (C) 2002 Uwe Rathmann 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the Qwt License, Version 1.0 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 enum Type 00023 { 00024 Linear, 00025 Log10, 00026 00027 Other 00028 }; 00029 00030 QwtScaleTransformation(Type type); 00031 virtual ~QwtScaleTransformation(); 00032 00033 virtual double xForm(double x, double s1, double s2, 00034 double p1, double p2) const; 00035 virtual double invXForm(double x, double p1, double p2, 00036 double s1, double s2) const; 00037 00038 Type type() const; 00039 00040 virtual QwtScaleTransformation *copy() const; 00041 00042 private: 00043 QwtScaleTransformation(); 00044 QwtScaleTransformation &operator=( const QwtScaleTransformation); 00045 00046 const Type d_type; 00047 }; 00048 00050 inline QwtScaleTransformation::Type QwtScaleTransformation::type() const 00051 { 00052 return d_type; 00053 } 00054 00061 class QWT_EXPORT QwtScaleMap 00062 { 00063 public: 00064 QwtScaleMap(); 00065 QwtScaleMap(const QwtScaleMap&); 00066 00067 ~QwtScaleMap(); 00068 00069 QwtScaleMap &operator=(const QwtScaleMap &); 00070 00071 void setTransformation(QwtScaleTransformation * ); 00072 const QwtScaleTransformation *transformation() const; 00073 00074 void setPaintInterval(int p1, int p2); 00075 void setPaintXInterval(double p1, double p2); 00076 void setScaleInterval(double s1, double s2); 00077 00078 int transform(double x) const; 00079 double invTransform(double i) const; 00080 00081 double xTransform(double x) const; 00082 00083 double p1() const; 00084 double p2() const; 00085 00086 double s1() const; 00087 double s2() const; 00088 00089 double pDist() const; 00090 double sDist() const; 00091 00092 QT_STATIC_CONST double LogMin; 00093 QT_STATIC_CONST double LogMax; 00094 00095 private: 00096 void newFactor(); 00097 00098 double d_s1, d_s2; // scale interval boundaries 00099 double d_p1, d_p2; // paint device interval boundaries 00100 00101 double d_cnv; // conversion factor 00102 00103 QwtScaleTransformation *d_transformation; 00104 }; 00105 00109 inline double QwtScaleMap::s1() const 00110 { 00111 return d_s1; 00112 } 00113 00117 inline double QwtScaleMap::s2() const 00118 { 00119 return d_s2; 00120 } 00121 00125 inline double QwtScaleMap::p1() const 00126 { 00127 return d_p1; 00128 } 00129 00133 inline double QwtScaleMap::p2() const 00134 { 00135 return d_p2; 00136 } 00137 00141 inline double QwtScaleMap::pDist() const 00142 { 00143 return qwtAbs(d_p2 - d_p1); 00144 } 00145 00149 inline double QwtScaleMap::sDist() const 00150 { 00151 return qwtAbs(d_s2 - d_s1); 00152 } 00153 00160 inline double QwtScaleMap::xTransform(double s) const 00161 { 00162 // try to inline code from QwtScaleTransformation 00163 00164 if ( d_transformation->type() == QwtScaleTransformation::Linear ) 00165 return d_p1 + (s - d_s1) * d_cnv; 00166 00167 if ( d_transformation->type() == QwtScaleTransformation::Log10 ) 00168 return d_p1 + log(s / d_s1) * d_cnv; 00169 00170 return d_transformation->xForm(s, d_s1, d_s2, d_p1, d_p2 ); 00171 } 00172 00180 inline double QwtScaleMap::invTransform(double p) const 00181 { 00182 return d_transformation->invXForm(p, d_p1, d_p2, d_s1, d_s2 ); 00183 } 00184 00193 inline int QwtScaleMap::transform(double s) const 00194 { 00195 return qRound(xTransform(s)); 00196 } 00197 00198 #endif