00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "qwt_dimap.h"
00011
00012 QT_STATIC_CONST_IMPL double QwtDiMap::LogMin = 1.0e-150;
00013 QT_STATIC_CONST_IMPL double QwtDiMap::LogMax = 1.0e150;
00014
00020 QwtDiMap::QwtDiMap():
00021 d_x1(0.0),
00022 d_x2(1.0),
00023 d_y1(0),
00024 d_y2(1),
00025 d_cnv(1.0),
00026 d_log(FALSE)
00027 {
00028 }
00029
00030
00043 QwtDiMap::QwtDiMap(int i1, int i2, double d1, double d2, bool logarithmic)
00044 {
00045
00046 d_y1 = i1;
00047 d_y2 = i2;
00048 setDblRange(d1, d2, logarithmic);
00049 }
00050
00054 QwtDiMap::~QwtDiMap()
00055 {
00056 }
00057
00063 bool QwtDiMap::contains(double x) const
00064 {
00065 return ( (x >= QMIN(d_x1, d_x2)) && (x <= QMAX(d_x1, d_x2)));
00066 }
00067
00073 bool QwtDiMap::contains(int x) const
00074 {
00075 return ( (x >= QMIN(d_y1, d_y2)) && (x <= QMAX(d_y1, d_y2)));
00076 }
00077
00084 void QwtDiMap::setDblRange(double d1, double d2, bool lg)
00085 {
00086 if (lg)
00087 {
00088 d_log = TRUE;
00089 if (d1 < LogMin)
00090 d1 = LogMin;
00091 else if (d1 > LogMax)
00092 d1 = LogMax;
00093
00094 if (d2 < LogMin)
00095 d2 = LogMin;
00096 else if (d2 > LogMax)
00097 d2 = LogMax;
00098
00099 d_x1 = log(d1);
00100 d_x2 = log(d2);
00101 }
00102 else
00103 {
00104 d_log = FALSE;
00105 d_x1 = d1;
00106 d_x2 = d2;
00107 }
00108 newFactor();
00109 }
00110
00116 void QwtDiMap::setIntRange(int i1, int i2)
00117 {
00118 d_y1 = i1;
00119 d_y2 = i2;
00120 newFactor();
00121 }
00122
00132 double QwtDiMap::invTransform(int y) const
00133 {
00134 if (d_cnv == 0.0)
00135 return 0.0;
00136 else
00137 {
00138 if(d_log)
00139 return exp(d_x1 + double(y - d_y1) / d_cnv );
00140 else
00141 return ( d_x1 + double(y - d_y1) / d_cnv );
00142 }
00143 }
00144
00155 int QwtDiMap::limTransform(double x) const
00156 {
00157 if (d_log) {
00158 if (x > LogMax)
00159 x = LogMax;
00160 else if (x < LogMin)
00161 x = LogMin;
00162 x = log(x);
00163 }
00164
00165 if ( x > qwtMax(d_x1, d_x2) )
00166 x = qwtMax(d_x1, d_x2);
00167 else if ( x < qwtMin(d_x1, d_x2))
00168 x = qwtMin(d_x1, d_x2);
00169
00170 return d_log ? transform(exp(x)) : transform(x);
00171 }
00172
00185 double QwtDiMap::xTransform(double x) const
00186 {
00187 double rv;
00188
00189 if (d_log)
00190 rv = double(d_y1) + (log(x) - d_x1) * d_cnv;
00191 else
00192 rv = double(d_y1) + (x - d_x1) * d_cnv;
00193
00194 return rv;
00195 }
00196
00197
00201 void QwtDiMap::newFactor()
00202 {
00203 if (d_x2 != d_x1)
00204 d_cnv = double(d_y2 - d_y1) / (d_x2 - d_x1);
00205 else
00206 d_cnv = 0.0;
00207 }