Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

qwt_scale_map.cpp

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 #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     // range checks ???
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     // range checks ???
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 }

Generated on Wed Aug 31 23:02:30 2005 for Qwt User's Guide by  doxygen 1.4.1