Skip to content
qwt_plot_curve.h 10.1 KiB
Newer Older
pixhawk's avatar
pixhawk committed
/* -*- 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_PLOT_CURVE_H
#define QWT_PLOT_CURVE_H

#include "qwt_global.h"
Bryant's avatar
Bryant committed
#include "qwt_plot_seriesitem.h"
#include "qwt_series_data.h"
pixhawk's avatar
pixhawk committed
#include "qwt_text.h"
Bryant's avatar
Bryant committed
#include <qpen.h>
#include <qstring.h>
pixhawk's avatar
pixhawk committed

class QPainter;
Bryant's avatar
Bryant committed
class QPolygonF;
pixhawk's avatar
pixhawk committed
class QwtScaleMap;
class QwtSymbol;
class QwtCurveFitter;

/*!
Bryant's avatar
Bryant committed
  \brief A plot item, that represents a series of points
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
  A curve is the representation of a series of points in the x-y plane.
  It supports different display styles, interpolation ( f.e. spline )
  and symbols.
pixhawk's avatar
pixhawk committed

  \par Usage
Bryant's avatar
Bryant committed
  <dl><dt>a) Assign curve properties</dt>
pixhawk's avatar
pixhawk committed
  <dd>When a curve is created, it is configured to draw black solid lines
Bryant's avatar
Bryant committed
  with in QwtPlotCurve::Lines style and no symbols. 
  You can change this by calling
pixhawk's avatar
pixhawk committed
  setPen(), setStyle() and setSymbol().</dd>
Bryant's avatar
Bryant committed
  <dt>b) Connect/Assign data.</dt>
  <dd>QwtPlotCurve gets its points using a QwtSeriesData object offering
  a bridge to the real storage of the points ( like QAbstractItemModel ).
  There are several convenience classes derived from QwtSeriesData, that also store
  the points inside ( like QStandardItemModel ). QwtPlotCurve also offers
  a couple of variations of setSamples(), that build QwtSeriesData objects from
  arrays internally.</dd>
  <dt>c) Attach the curve to a plot</dt>
  <dd>See QwtPlotItem::attach()
pixhawk's avatar
pixhawk committed
  </dd></dl>

  \par Example:
Bryant's avatar
Bryant committed
  see examples/bode
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
  \sa QwtPointSeriesData, QwtSymbol, QwtScaleMap
pixhawk's avatar
pixhawk committed
*/
Bryant's avatar
Bryant committed
class QWT_EXPORT QwtPlotCurve: 
    public QwtPlotSeriesItem, public QwtSeriesStore<QPointF>
pixhawk's avatar
pixhawk committed
{
public:
    /*!
        Curve styles.
Bryant's avatar
Bryant committed
        \sa setStyle(), style()
pixhawk's avatar
pixhawk committed
    */
Bryant's avatar
Bryant committed
    enum CurveStyle
    {
        /*!
           Don't draw a curve. Note: This doesn't affect the symbols.
        */
        NoCurve = -1,

        /*!
           Connect the points with straight lines. The lines might
           be interpolated depending on the 'Fitted' attribute. Curve
           fitting can be configured using setCurveFitter().
        */
pixhawk's avatar
pixhawk committed
        Lines,
Bryant's avatar
Bryant committed

        /*!
           Draw vertical or horizontal sticks ( depending on the 
           orientation() ) from a baseline which is defined by setBaseline().
        */
pixhawk's avatar
pixhawk committed
        Sticks,
Bryant's avatar
Bryant committed

        /*!
           Connect the points with a step function. The step function
           is drawn from the left to the right or vice versa,
           depending on the QwtPlotCurve::Inverted attribute.
        */
pixhawk's avatar
pixhawk committed
        Steps,
Bryant's avatar
Bryant committed

        /*!
           Draw dots at the locations of the data points. Note:
           This is different from a dotted line (see setPen()), and faster
           as a curve in QwtPlotCurve::NoStyle style and a symbol 
           painting a point.
        */
pixhawk's avatar
pixhawk committed
        Dots,

Bryant's avatar
Bryant committed
        /*!
           Styles >= QwtPlotCurve::UserCurve are reserved for derived
           classes of QwtPlotCurve that overload drawCurve() with
           additional application specific curve types.
        */
pixhawk's avatar
pixhawk committed
        UserCurve = 100
    };

Bryant's avatar
Bryant committed
      Attribute for drawing the curve
      \sa setCurveAttribute(), testCurveAttribute(), curveFitter()
pixhawk's avatar
pixhawk committed
    */
Bryant's avatar
Bryant committed
    enum CurveAttribute
    {
        /*!
           For QwtPlotCurve::Steps only. 
           Draws a step function from the right to the left.
         */
        Inverted = 0x01,

        /*!
          Only in combination with QwtPlotCurve::Lines
          A QwtCurveFitter tries to
          interpolate/smooth the curve, before it is painted.

          \note Curve fitting requires temporary memory
          for calculating coefficients and additional points.
          If painting in QwtPlotCurve::Fitted mode is slow it might be better
          to fit the points, before they are passed to QwtPlotCurve.
         */
        Fitted = 0x02
pixhawk's avatar
pixhawk committed
    };

Bryant's avatar
Bryant committed
    //! Curve attributes
    typedef QFlags<CurveAttribute> CurveAttributes;

Bryant's avatar
Bryant committed
        Attributes how to represent the curve on the legend

        \sa setLegendAttribute(), testLegendAttribute(),
            QwtPlotItem::legendData(), legendIcon()
     */

    enum LegendAttribute
    {
        /*!
          QwtPlotCurve tries to find a color representing the curve 
          and paints a rectangle with it.
         */
        LegendNoAttribute = 0x00,

        /*!
          If the style() is not QwtPlotCurve::NoCurve a line 
          is painted with the curve pen().
         */
        LegendShowLine = 0x01,

        /*!
          If the curve has a valid symbol it is painted.
         */
        LegendShowSymbol = 0x02,

        /*!
          If the curve has a brush a rectangle filled with the
          curve brush() is painted.
         */
        LegendShowBrush = 0x04
    };

    //! Legend attributes
    typedef QFlags<LegendAttribute> LegendAttributes;

    /*!
        Attributes to modify the drawing algorithm.
        The default setting enables ClipPolygons | FilterPoints

        \sa setPaintAttribute(), testPaintAttribute()
pixhawk's avatar
pixhawk committed
    */
Bryant's avatar
Bryant committed
    enum PaintAttribute
    {
        /*!
          Clip polygons before painting them. In situations, where points
          are far outside the visible area (f.e when zooming deep) this
          might be a substantial improvement for the painting performance
         */
        ClipPolygons = 0x01,

        /*!
          Tries to reduce the data that has to be painted, by sorting out
          duplicates, or paintings outside the visible area. Might have a
          notable impact on curves with many close points.
          Only a couple of very basic filtering algorithms are implemented.
         */
        FilterPoints = 0x02,

        /*!
          Minimize memory usage that is temporarily needed for the 
          translated points, before they get painted.
          This might slow down the performance of painting 
         */
        MinimizeMemory = 0x04,

        /*!
          Render the points to a temporary image and paint the image.
          This is a very special optimization for Dots style, when
          having a huge amount of points. 
          With a reasonable number of points QPainter::drawPoints()
          will be faster.
         */
        ImageBuffer = 0x08
pixhawk's avatar
pixhawk committed
    };

Bryant's avatar
Bryant committed
    //! Paint attributes
    typedef QFlags<PaintAttribute> PaintAttributes;

    explicit QwtPlotCurve( const QString &title = QString::null );
    explicit QwtPlotCurve( const QwtText &title );
pixhawk's avatar
pixhawk committed

    virtual ~QwtPlotCurve();

    virtual int rtti() const;

Bryant's avatar
Bryant committed
    void setPaintAttribute( PaintAttribute, bool on = true );
    bool testPaintAttribute( PaintAttribute ) const;
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
    void setLegendAttribute( LegendAttribute, bool on = true );
    bool testLegendAttribute( LegendAttribute ) const;
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
#ifndef QWT_NO_COMPAT
    void setRawSamples( const double *xData, const double *yData, int size );
    void setSamples( const double *xData, const double *yData, int size );
    void setSamples( const QVector<double> &xData, const QVector<double> &yData );
pixhawk's avatar
pixhawk committed
#endif
Bryant's avatar
Bryant committed
    void setSamples( const QVector<QPointF> & );
    void setSamples( QwtSeriesData<QPointF> * );

    int closestPoint( const QPoint &pos, double *dist = NULL ) const;

    double minXValue() const;
    double maxXValue() const;
    double minYValue() const;
    double maxYValue() const;

    void setCurveAttribute( CurveAttribute, bool on = true );
    bool testCurveAttribute( CurveAttribute ) const;

    void setPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine );
    void setPen( const QPen & );
pixhawk's avatar
pixhawk committed
    const QPen &pen() const;

Bryant's avatar
Bryant committed
    void setBrush( const QBrush & );
pixhawk's avatar
pixhawk committed
    const QBrush &brush() const;

Bryant's avatar
Bryant committed
    void setBaseline( double );
pixhawk's avatar
pixhawk committed
    double baseline() const;

Bryant's avatar
Bryant committed
    void setStyle( CurveStyle style );
pixhawk's avatar
pixhawk committed
    CurveStyle style() const;

Bryant's avatar
Bryant committed
    void setSymbol( QwtSymbol * );
    const QwtSymbol *symbol() const;
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
    void setCurveFitter( QwtCurveFitter * );
pixhawk's avatar
pixhawk committed
    QwtCurveFitter *curveFitter() const;

Bryant's avatar
Bryant committed
    virtual void drawSeries( QPainter *,
        const QwtScaleMap &xMap, const QwtScaleMap &yMap,
        const QRectF &canvasRect, int from, int to ) const;
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
    virtual QwtGraphic legendIcon( int index, const QSizeF & ) const;
pixhawk's avatar
pixhawk committed

protected:

    void init();

Bryant's avatar
Bryant committed
    virtual void drawCurve( QPainter *p, int style,
        const QwtScaleMap &xMap, const QwtScaleMap &yMap,
        const QRectF &canvasRect, int from, int to ) const;
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
    virtual void drawSymbols( QPainter *p, const QwtSymbol &,
        const QwtScaleMap &xMap, const QwtScaleMap &yMap,
        const QRectF &canvasRect, int from, int to ) const;

    virtual void drawLines( QPainter *p,
        const QwtScaleMap &xMap, const QwtScaleMap &yMap,
        const QRectF &canvasRect, int from, int to ) const;

    virtual void drawSticks( QPainter *p,
        const QwtScaleMap &xMap, const QwtScaleMap &yMap,
        const QRectF &canvasRect, int from, int to ) const;

    virtual void drawDots( QPainter *p,
        const QwtScaleMap &xMap, const QwtScaleMap &yMap,
        const QRectF &canvasRect, int from, int to ) const;
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
    virtual void drawSteps( QPainter *p,
        const QwtScaleMap &xMap, const QwtScaleMap &yMap,
        const QRectF &canvasRect, int from, int to ) const;

    virtual void fillCurve( QPainter *,
        const QwtScaleMap &, const QwtScaleMap &, 
        const QRectF &canvasRect, QPolygonF & ) const;

    void closePolyline( QPainter *,
        const QwtScaleMap &, const QwtScaleMap &, QPolygonF & ) const;

private:
pixhawk's avatar
pixhawk committed
    class PrivateData;
    PrivateData *d_data;
};

Bryant's avatar
Bryant committed
//! boundingRect().left()
inline double QwtPlotCurve::minXValue() const
pixhawk's avatar
pixhawk committed
{
Bryant's avatar
Bryant committed
    return boundingRect().left();
pixhawk's avatar
pixhawk committed
}

Bryant's avatar
Bryant committed
//! boundingRect().right()
inline double QwtPlotCurve::maxXValue() const
pixhawk's avatar
pixhawk committed
{
Bryant's avatar
Bryant committed
    return boundingRect().right();
pixhawk's avatar
pixhawk committed
}

Bryant's avatar
Bryant committed
//! boundingRect().top()
inline double QwtPlotCurve::minYValue() const
Bryant's avatar
Bryant committed
    return boundingRect().top();
pixhawk's avatar
pixhawk committed
}

Bryant's avatar
Bryant committed
//! boundingRect().bottom()
inline double QwtPlotCurve::maxYValue() const
Bryant's avatar
Bryant committed
    return boundingRect().bottom();
pixhawk's avatar
pixhawk committed
}

Bryant's avatar
Bryant committed
Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotCurve::PaintAttributes )
Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotCurve::LegendAttributes )
Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotCurve::CurveAttributes )

pixhawk's avatar
pixhawk committed
#endif