00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "qwt_math.h"
00011 #include "qwt_data.h"
00012
00014 QwtData::QwtData()
00015 {
00016 }
00017
00019 QwtData::~QwtData()
00020 {
00021 }
00022
00034 QwtDoubleRect QwtData::boundingRect() const
00035 {
00036 const size_t sz = size();
00037
00038 if ( sz <= 0 )
00039 return QwtDoubleRect(1.0, 1.0, -2.0, -2.0);
00040
00041 double minX, maxX, minY, maxY;
00042 minX = maxX = x(0);
00043 minY = maxY = y(0);
00044
00045 for ( size_t i = 1; i < sz; i++ )
00046 {
00047 const double xv = x(i);
00048 if ( xv < minX )
00049 minX = xv;
00050 if ( xv > maxX )
00051 maxX = xv;
00052
00053 const double yv = y(i);
00054 if ( yv < minY )
00055 minY = yv;
00056 if ( yv > maxY )
00057 maxY = yv;
00058 }
00059 return QwtDoubleRect(minX, minY, maxX - minX, maxY - minY);
00060 }
00061
00068 #if QT_VERSION >= 0x040000
00069 QwtPolygonFData::QwtPolygonFData(const QPolygonF &polygon):
00070 #else
00071 QwtPolygonFData::QwtPolygonFData(const QwtArray<QwtDoublePoint> &polygon):
00072 #endif
00073 d_data(polygon)
00074 {
00075 }
00076
00078 QwtPolygonFData& QwtPolygonFData::operator=(
00079 const QwtPolygonFData &data)
00080 {
00081 if (this != &data)
00082 {
00083 d_data = data.d_data;
00084 }
00085 return *this;
00086 }
00087
00089 size_t QwtPolygonFData::size() const
00090 {
00091 return d_data.size();
00092 }
00093
00100 double QwtPolygonFData::x(size_t i) const
00101 {
00102 return d_data[int(i)].x();
00103 }
00104
00111 double QwtPolygonFData::y(size_t i) const
00112 {
00113 return d_data[int(i)].y();
00114 }
00115
00117 #if QT_VERSION >= 0x040000
00118 const QPolygonF &QwtPolygonFData::data() const
00119 #else
00120 const QwtArray<QwtDoublePoint> &QwtPolygonFData::data() const
00121 #endif
00122 {
00123 return d_data;
00124 }
00125
00129 QwtData *QwtPolygonFData::copy() const
00130 {
00131 return new QwtPolygonFData(d_data);
00132 }
00133
00142 QwtArrayData::QwtArrayData(
00143 const QwtArray<double> &x, const QwtArray<double> &y):
00144 d_x(x),
00145 d_y(y)
00146 {
00147 }
00148
00157 QwtArrayData::QwtArrayData(const double *x, const double *y, size_t size)
00158 {
00159 #if QT_VERSION >= 0x040000
00160 d_x.resize(size);
00161 qMemCopy(d_x.data(), x, size * sizeof(double));
00162
00163 d_y.resize(size);
00164 qMemCopy(d_y.data(), y, size * sizeof(double));
00165 #else
00166 d_x.detach();
00167 d_x.duplicate(x, size);
00168
00169 d_y.detach();
00170 d_y.duplicate(y, size);
00171 #endif
00172 }
00173
00175 QwtArrayData& QwtArrayData::operator=(const QwtArrayData &data)
00176 {
00177 if (this != &data)
00178 {
00179 d_x = data.d_x;
00180 d_y = data.d_y;
00181 }
00182 return *this;
00183 }
00184
00186 size_t QwtArrayData::size() const
00187 {
00188 return qwtMin(d_x.size(), d_y.size());
00189 }
00190
00197 double QwtArrayData::x(size_t i) const
00198 {
00199 return d_x[int(i)];
00200 }
00201
00208 double QwtArrayData::y(size_t i) const
00209 {
00210 return d_y[int(i)];
00211 }
00212
00214 const QwtArray<double> &QwtArrayData::xData() const
00215 {
00216 return d_x;
00217 }
00218
00220 const QwtArray<double> &QwtArrayData::yData() const
00221 {
00222 return d_y;
00223 }
00224
00228 QwtData *QwtArrayData::copy() const
00229 {
00230 return new QwtArrayData(d_x, d_y);
00231 }
00232
00238 QwtDoubleRect QwtArrayData::boundingRect() const
00239 {
00240 const size_t sz = size();
00241
00242 if ( sz <= 0 )
00243 return QwtDoubleRect(1.0, 1.0, -2.0, -2.0);
00244
00245 double minX, maxX, minY, maxY;
00246 QwtArray<double>::ConstIterator xIt = d_x.begin();
00247 QwtArray<double>::ConstIterator yIt = d_y.begin();
00248 QwtArray<double>::ConstIterator end = d_x.begin() + sz;
00249 minX = maxX = *xIt++;
00250 minY = maxY = *yIt++;
00251
00252 while ( xIt < end )
00253 {
00254 const double xv = *xIt++;
00255 if ( xv < minX )
00256 minX = xv;
00257 if ( xv > maxX )
00258 maxX = xv;
00259
00260 const double yv = *yIt++;
00261 if ( yv < minY )
00262 minY = yv;
00263 if ( yv > maxY )
00264 maxY = yv;
00265 }
00266 return QwtDoubleRect(minX, minY, maxX - minX, maxY - minY);
00267 }
00268
00282 QwtCPointerData::QwtCPointerData(
00283 const double *x, const double *y, size_t size):
00284 d_x(x),
00285 d_y(y),
00286 d_size(size)
00287 {
00288 }
00289
00291 QwtCPointerData& QwtCPointerData::operator=(const QwtCPointerData &data)
00292 {
00293 if (this != &data)
00294 {
00295 d_x = data.d_x;
00296 d_y = data.d_y;
00297 d_size = data.d_size;
00298 }
00299 return *this;
00300 }
00301
00303 size_t QwtCPointerData::size() const
00304 {
00305 return d_size;
00306 }
00307
00314 double QwtCPointerData::x(size_t i) const
00315 {
00316 return d_x[int(i)];
00317 }
00318
00325 double QwtCPointerData::y(size_t i) const
00326 {
00327 return d_y[int(i)];
00328 }
00329
00331 const double *QwtCPointerData::xData() const
00332 {
00333 return d_x;
00334 }
00335
00337 const double *QwtCPointerData::yData() const
00338 {
00339 return d_y;
00340 }
00341
00345 QwtData *QwtCPointerData::copy() const
00346 {
00347 return new QwtCPointerData(d_x, d_y, d_size);
00348 }
00349
00355 QwtDoubleRect QwtCPointerData::boundingRect() const
00356 {
00357 const size_t sz = size();
00358
00359 if ( sz <= 0 )
00360 return QwtDoubleRect(1.0, 1.0, -2.0, -2.0);
00361
00362 double minX, maxX, minY, maxY;
00363 const double *xIt = d_x;
00364 const double *yIt = d_y;
00365 const double *end = d_x + sz;
00366 minX = maxX = *xIt++;
00367 minY = maxY = *yIt++;
00368
00369 while ( xIt < end )
00370 {
00371 const double xv = *xIt++;
00372 if ( xv < minX )
00373 minX = xv;
00374 if ( xv > maxX )
00375 maxX = xv;
00376
00377 const double yv = *yIt++;
00378 if ( yv < minY )
00379 minY = yv;
00380 if ( yv > maxY )
00381 maxY = yv;
00382 }
00383 return QwtDoubleRect(minX, minY, maxX - minX, maxY - minY);
00384 }