123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438 |
- /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
- * Qwt Widget Library
- * Copyright (C) 1997 Josef Wilgen
- * Copyright (C) 2002 Uwe Rathmann
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the Qwt License, Version 1.0
- *****************************************************************************/
- #ifndef QWT_SERIES_DATA_H
- #define QWT_SERIES_DATA_H 1
- #include "qwt_global.h"
- #include "qwt_interval.h"
- #include "qwt_point_3d.h"
- #include "qwt_point_polar.h"
- #include <qvector.h>
- #include <qrect.h>
- //! \brief A sample of the types (x1-x2, y) or (x, y1-y2)
- class QWT_EXPORT QwtIntervalSample
- {
- public:
- QwtIntervalSample();
- QwtIntervalSample( double, const QwtInterval & );
- QwtIntervalSample( double value, double min, double max );
- bool operator==( const QwtIntervalSample & ) const;
- bool operator!=( const QwtIntervalSample & ) const;
- //! Value
- double value;
- //! Interval
- QwtInterval interval;
- };
- /*!
- Constructor
- The value is set to 0.0, the interval is invalid
- */
- inline QwtIntervalSample::QwtIntervalSample():
- value( 0.0 )
- {
- }
- //! Constructor
- inline QwtIntervalSample::QwtIntervalSample(
- double v, const QwtInterval &intv ):
- value( v ),
- interval( intv )
- {
- }
- //! Constructor
- inline QwtIntervalSample::QwtIntervalSample(
- double v, double min, double max ):
- value( v ),
- interval( min, max )
- {
- }
- //! Compare operator
- inline bool QwtIntervalSample::operator==(
- const QwtIntervalSample &other ) const
- {
- return value == other.value && interval == other.interval;
- }
- //! Compare operator
- inline bool QwtIntervalSample::operator!=(
- const QwtIntervalSample &other ) const
- {
- return !( *this == other );
- }
- //! \brief A sample of the types (x1...xn, y) or (x, y1..yn)
- class QWT_EXPORT QwtSetSample
- {
- public:
- QwtSetSample();
- bool operator==( const QwtSetSample &other ) const;
- bool operator!=( const QwtSetSample &other ) const;
- //! value
- double value;
- //! Vector of values associated to value
- QVector<double> set;
- };
- /*!
- Constructor
- The value is set to 0.0
- */
- inline QwtSetSample::QwtSetSample():
- value( 0.0 )
- {
- }
- //! Compare operator
- inline bool QwtSetSample::operator==( const QwtSetSample &other ) const
- {
- return value == other.value && set == other.set;
- }
- //! Compare operator
- inline bool QwtSetSample::operator!=( const QwtSetSample &other ) const
- {
- return !( *this == other );
- }
- /*!
- \brief Abstract interface for iterating over samples
- Qwt offers several implementations of the QwtSeriesData API,
- but in situations, where data of an application specific format
- needs to be displayed, without having to copy it, it is recommended
- to implement an individual data access.
- */
- template <typename T>
- class QwtSeriesData
- {
- public:
- QwtSeriesData();
- virtual ~QwtSeriesData();
- //! \return Number of samples
- virtual size_t size() const = 0;
- /*!
- Return a sample
- \param i Index
- \return Sample at position i
- */
- virtual T sample( size_t i ) const = 0;
- /*!
- Calculate the bounding rect of all samples
- The bounding rect is necessary for autoscaling and can be used
- for a couple of painting optimizations.
- qwtBoundingRect(...) offers slow implementations iterating
- over the samples. For large sets it is recommended to implement
- something faster f.e. by caching the bounding rect.
- */
- virtual QRectF boundingRect() const = 0;
- virtual void setRectOfInterest( const QRectF & );
- protected:
- //! Can be used to cache a calculated bounding rectangle
- mutable QRectF d_boundingRect;
- private:
- QwtSeriesData<T> &operator=( const QwtSeriesData<T> & );
- };
- //! Constructor
- template <typename T>
- QwtSeriesData<T>::QwtSeriesData():
- d_boundingRect( 0.0, 0.0, -1.0, -1.0 )
- {
- }
- //! Destructor
- template <typename T>
- QwtSeriesData<T>::~QwtSeriesData()
- {
- }
- /*!
- Set a the "rect of interest"
- QwtPlotSeriesItem defines the current area of the plot canvas
- as "rect of interest" ( QwtPlotSeriesItem::updateScaleDiv() ).
- It can be used to implement different levels of details.
- The default implementation does nothing.
- */
- template <typename T>
- void QwtSeriesData<T>::setRectOfInterest( const QRectF & )
- {
- }
- /*!
- \brief Template class for data, that is organized as QVector
- QVector uses implicit data sharing and can be
- passed around as argument efficiently.
- */
- template <typename T>
- class QwtArraySeriesData: public QwtSeriesData<T>
- {
- public:
- QwtArraySeriesData();
- QwtArraySeriesData( const QVector<T> & );
- void setSamples( const QVector<T> & );
- const QVector<T> samples() const;
- virtual size_t size() const;
- virtual T sample( size_t ) const;
- protected:
- //! Vector of samples
- QVector<T> d_samples;
- };
- //! Constructor
- template <typename T>
- QwtArraySeriesData<T>::QwtArraySeriesData()
- {
- }
- /*!
- Constructor
- \param samples Array of samples
- */
- template <typename T>
- QwtArraySeriesData<T>::QwtArraySeriesData( const QVector<T> &samples ):
- d_samples( samples )
- {
- }
- /*!
- Assign an array of samples
- \param samples Array of samples
- */
- template <typename T>
- void QwtArraySeriesData<T>::setSamples( const QVector<T> &samples )
- {
- QwtSeriesData<T>::d_boundingRect = QRectF( 0.0, 0.0, -1.0, -1.0 );
- d_samples = samples;
- }
- //! \return Array of samples
- template <typename T>
- const QVector<T> QwtArraySeriesData<T>::samples() const
- {
- return d_samples;
- }
- //! \return Number of samples
- template <typename T>
- size_t QwtArraySeriesData<T>::size() const
- {
- return d_samples.size();
- }
- /*!
- Return a sample
- \param i Index
- \return Sample at position i
- */
- template <typename T>
- T QwtArraySeriesData<T>::sample( size_t i ) const
- {
- return d_samples[i];
- }
- //! Interface for iterating over an array of points
- class QWT_EXPORT QwtPointSeriesData: public QwtArraySeriesData<QPointF>
- {
- public:
- QwtPointSeriesData(
- const QVector<QPointF> & = QVector<QPointF>() );
- virtual QRectF boundingRect() const;
- };
- //! Interface for iterating over an array of 3D points
- class QWT_EXPORT QwtPoint3DSeriesData: public QwtArraySeriesData<QwtPoint3D>
- {
- public:
- QwtPoint3DSeriesData(
- const QVector<QwtPoint3D> & = QVector<QwtPoint3D>() );
- virtual QRectF boundingRect() const;
- };
- //! Interface for iterating over an array of intervals
- class QWT_EXPORT QwtIntervalSeriesData: public QwtArraySeriesData<QwtIntervalSample>
- {
- public:
- QwtIntervalSeriesData(
- const QVector<QwtIntervalSample> & = QVector<QwtIntervalSample>() );
- virtual QRectF boundingRect() const;
- };
- //! Interface for iterating over an array of samples
- class QWT_EXPORT QwtSetSeriesData: public QwtArraySeriesData<QwtSetSample>
- {
- public:
- QwtSetSeriesData(
- const QVector<QwtSetSample> & = QVector<QwtSetSample>() );
- virtual QRectF boundingRect() const;
- };
- /*!
- \brief Interface for iterating over two QVector<double> objects.
- */
- class QWT_EXPORT QwtPointArrayData: public QwtSeriesData<QPointF>
- {
- public:
- QwtPointArrayData( const QVector<double> &x, const QVector<double> &y );
- QwtPointArrayData( const double *x, const double *y, size_t size );
- virtual QRectF boundingRect() const;
- virtual size_t size() const;
- virtual QPointF sample( size_t i ) const;
- const QVector<double> &xData() const;
- const QVector<double> &yData() const;
- private:
- QVector<double> d_x;
- QVector<double> d_y;
- };
- /*!
- \brief Data class containing two pointers to memory blocks of doubles.
- */
- class QWT_EXPORT QwtCPointerData: public QwtSeriesData<QPointF>
- {
- public:
- QwtCPointerData( const double *x, const double *y, size_t size );
- virtual QRectF boundingRect() const;
- virtual size_t size() const;
- virtual QPointF sample( size_t i ) const;
- const double *xData() const;
- const double *yData() const;
- private:
- const double *d_x;
- const double *d_y;
- size_t d_size;
- };
- /*!
- \brief Synthetic point data
- QwtSyntheticPointData provides a fixed number of points for an interval.
- The points are calculated in equidistant steps in x-direction.
- If the interval is invalid, the points are calculated for
- the "rect of interest", what normally is the displayed area on the
- plot canvas. In this mode you get different levels of detail, when
- zooming in/out.
- \par Example
- The following example shows how to implement a sinus curve.
- \verbatim
- #include <cmath>
- #include <qwt_series_data.h>
- #include <qwt_plot_curve.h>
- #include <qwt_plot.h>
- #include <qapplication.h>
- class SinusData: public QwtSyntheticPointData
- {
- public:
- SinusData():
- QwtSyntheticPointData(100)
- {
- }
- virtual double y(double x) const
- {
- return qSin(x);
- }
- };
- int main(int argc, char **argv)
- {
- QApplication a(argc, argv);
- QwtPlot plot;
- plot.setAxisScale(QwtPlot::xBottom, 0.0, 10.0);
- plot.setAxisScale(QwtPlot::yLeft, -1.0, 1.0);
- QwtPlotCurve *curve = new QwtPlotCurve("y = sin(x)");
- curve->setData(SinusData());
- curve->attach(&plot);
- plot.show();
- return a.exec();
- }
- \endverbatim
- */
- class QWT_EXPORT QwtSyntheticPointData: public QwtSeriesData<QPointF>
- {
- public:
- QwtSyntheticPointData( size_t size,
- const QwtInterval & = QwtInterval() );
- void setSize( size_t size );
- size_t size() const;
- void setInterval( const QwtInterval& );
- QwtInterval interval() const;
- virtual QRectF boundingRect() const;
- virtual QPointF sample( size_t i ) const;
- /*!
- Calculate a y value for a x value
- \param x x value
- \return Corresponding y value
- */
- virtual double y( double x ) const = 0;
- virtual double x( uint index ) const;
- virtual void setRectOfInterest( const QRectF & );
- QRectF rectOfInterest() const;
- private:
- size_t d_size;
- QwtInterval d_interval;
- QRectF d_rectOfInterest;
- QwtInterval d_intervalOfInterest;
- };
- QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData<QPointF> & );
- QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData<QwtPoint3D> & );
- QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData<QwtPointPolar> & );
- QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData<QwtIntervalSample> & );
- QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData<QwtSetSample> & );
- #endif
|