00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "qwt_scale_map.h"
00011
00012 QT_STATIC_CONST_IMPL double QwtScaleMap::LogMin = 1.0e-150;
00013 QT_STATIC_CONST_IMPL double QwtScaleMap::LogMax = 1.0e150;
00014
00015 QwtScaleTransformation::QwtScaleTransformation():
00016 xForm(linearXForm),
00017 invXForm(linearXForm)
00018 {
00019 }
00020
00021 QwtScaleTransformation::QwtScaleTransformation(
00022 double (*xf)(double x, double s1, double s2,
00023 double p1, double p2),
00024 double (*invxf)(double y, double p1, double p2,
00025 double s1, double s2) ):
00026 xForm(xf),
00027 invXForm(invxf)
00028 {
00029 }
00030
00045 double QwtScaleTransformation::linearXForm(
00046 double x, double x1, double x2, double y1, double y2)
00047 {
00048 const double ratio = (y2 - y1) / (x2 - x1);
00049 return y1 + (x - x1) * ratio;
00050 }
00051
00067 double QwtScaleTransformation::log10XForm(double x, double s1, double s2,
00068 double p1, double p2)
00069 {
00070 #if 0
00071
00072 #endif
00073 return p1 + (p2 - p1) / log(s2 / s1) * log(x / s1);
00074 }
00075
00090 double QwtScaleTransformation::log10InvXForm(double x, double p1, double p2,
00091 double s1, double s2)
00092 {
00093 #if 0
00094
00095 #endif
00096 return exp((x - p1) / (p2 - p1) * log(s2 / s1)) * s1;
00097 }
00098
00104 QwtScaleMap::QwtScaleMap():
00105 d_s1(0.0),
00106 d_s2(1.0),
00107 d_p1(0.0),
00108 d_p2(1.0),
00109 d_cnv(1.0)
00110 {
00111 }
00112
00113
00125 QwtScaleMap::QwtScaleMap(int p1, int p2, double s1, double s2)
00126 {
00127 d_p1 = p1;
00128 d_p2 = p2;
00129 setScaleInterval(s1, s2);
00130 }
00131
00135 QwtScaleMap::~QwtScaleMap()
00136 {
00137 }
00138
00139 void QwtScaleMap::setTransformation(bool logarithmic)
00140 {
00141 QwtScaleTransformation transformation;
00142 if ( logarithmic )
00143 {
00144 transformation.xForm = QwtScaleTransformation::log10XForm;
00145 transformation.invXForm = QwtScaleTransformation::log10InvXForm;
00146 }
00147 else
00148 {
00149 transformation.xForm = QwtScaleTransformation::linearXForm;
00150 transformation.invXForm = QwtScaleTransformation::linearXForm;
00151 }
00152 setTransformation(transformation);
00153 }
00154
00155 void QwtScaleMap::setTransformation(const QwtScaleTransformation &transformation)
00156 {
00157 d_transformation = transformation;
00158 }
00159
00160 const QwtScaleTransformation &QwtScaleMap::transformation() const
00161 {
00162 return d_transformation;
00163 }
00164
00171 void QwtScaleMap::setScaleInterval(double s1, double s2)
00172 {
00173 if (d_transformation.xForm == QwtScaleTransformation::log10XForm)
00174 {
00175 if (s1 < LogMin)
00176 s1 = LogMin;
00177 else if (s1 > LogMax)
00178 s1 = LogMax;
00179
00180 if (s2 < LogMin)
00181 s2 = LogMin;
00182 else if (s2 > LogMax)
00183 s2 = LogMax;
00184 }
00185
00186 d_s1 = s1;
00187 d_s2 = s2;
00188
00189 newFactor();
00190 }
00191
00197 void QwtScaleMap::setPaintInterval(int p1, int p2)
00198 {
00199 d_p1 = p1;
00200 d_p2 = p2;
00201 newFactor();
00202 }
00203
00209 void QwtScaleMap::setPaintXInterval(double p1, double p2)
00210 {
00211 d_p1 = p1;
00212 d_p2 = p2;
00213 newFactor();
00214 }
00215
00219 void QwtScaleMap::newFactor()
00220 {
00221 d_cnv = 0.0;
00222 #if 1
00223 if (d_s2 == d_s1)
00224 return;
00225
00226 #endif
00227 if (d_transformation.xForm == QwtScaleTransformation::linearXForm)
00228 d_cnv = (d_p2 - d_p1) / (d_s2 - d_s1);
00229 else if (d_transformation.xForm == QwtScaleTransformation::log10XForm)
00230 d_cnv = (d_p2 - d_p1) / log(d_s2 / d_s1);
00231 }