| 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 ){}//! Constructorinline QwtIntervalSample::QwtIntervalSample(        double v, const QwtInterval &intv ):    value( v ),    interval( intv ){}//! Constructorinline QwtIntervalSample::QwtIntervalSample(        double v, double min, double max ):    value( v ),    interval( min, max ){}//! Compare operatorinline bool QwtIntervalSample::operator==(     const QwtIntervalSample &other ) const{    return value == other.value && interval == other.interval;}//! Compare operatorinline 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 operatorinline bool QwtSetSample::operator==( const QwtSetSample &other ) const{    return value == other.value && set == other.set;}//! Compare operatorinline 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> & );};//! Constructortemplate <typename T>QwtSeriesData<T>::QwtSeriesData():    d_boundingRect( 0.0, 0.0, -1.0, -1.0 ){}//! Destructortemplate <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;};//! Constructortemplate <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 samplestemplate <typename T>const QVector<T> QwtArraySeriesData<T>::samples() const{    return d_samples;}//! \return Number of samplestemplate <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 pointsclass 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 pointsclass QWT_EXPORT QwtPoint3DSeriesData: public QwtArraySeriesData<QwtPoint3D>{public:    QwtPoint3DSeriesData(        const QVector<QwtPoint3D> & = QVector<QwtPoint3D>() );    virtual QRectF boundingRect() const;};//! Interface for iterating over an array of intervalsclass QWT_EXPORT QwtIntervalSeriesData: public QwtArraySeriesData<QwtIntervalSample>{public:    QwtIntervalSeriesData(        const QVector<QwtIntervalSample> & = QVector<QwtIntervalSample>() );    virtual QRectF boundingRect() const;};//! Interface for iterating over an array of samplesclass 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 
 |