qwt_curve_fitter.h 3.68 KB
Newer Older
pixhawk's avatar
pixhawk committed
1 2 3 4
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
 * Qwt Widget Library
 * Copyright (C) 1997   Josef Wilgen
 * Copyright (C) 2002   Uwe Rathmann
5
 *
pixhawk's avatar
pixhawk committed
6 7 8 9 10 11 12 13
 * 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_CURVE_FITTER_H
#define QWT_CURVE_FITTER_H

#include "qwt_global.h"
Bryant's avatar
Bryant committed
14 15
#include <qpolygon.h>
#include <qrect.h>
pixhawk's avatar
pixhawk committed
16 17 18 19 20 21 22 23 24 25 26

class QwtSpline;

/*!
  \brief Abstract base class for a curve fitter
*/
class QWT_EXPORT QwtCurveFitter
{
public:
    virtual ~QwtCurveFitter();

Bryant's avatar
Bryant committed
27 28 29 30 31 32 33
    /*!
        Find a curve which has the best fit to a series of data points

        \param polygon Series of data points
        \return Curve points
     */
    virtual QPolygonF fitCurve( const QPolygonF &polygon ) const = 0;
pixhawk's avatar
pixhawk committed
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

protected:
    QwtCurveFitter();

private:
    QwtCurveFitter( const QwtCurveFitter & );
    QwtCurveFitter &operator=( const QwtCurveFitter & );
};

/*!
  \brief A curve fitter using cubic splines
*/
class QWT_EXPORT QwtSplineCurveFitter: public QwtCurveFitter
{
public:
Bryant's avatar
Bryant committed
49 50 51 52 53 54 55 56 57 58 59 60
    /*!
      Spline type
      The default setting is Auto
      \sa setFitMode(), FitMode()
     */
    enum FitMode
    {
        /*!
          Use the default spline algorithm for polygons with
          increasing x values ( p[i-1] < p[i] ), otherwise use
          a parametric spline algorithm.
         */
pixhawk's avatar
pixhawk committed
61
        Auto,
Bryant's avatar
Bryant committed
62 63

        //! Use a default spline algorithm
pixhawk's avatar
pixhawk committed
64
        Spline,
Bryant's avatar
Bryant committed
65 66

        //! Use a parametric spline algorithm
pixhawk's avatar
pixhawk committed
67 68 69 70 71 72
        ParametricSpline
    };

    QwtSplineCurveFitter();
    virtual ~QwtSplineCurveFitter();

Bryant's avatar
Bryant committed
73
    void setFitMode( FitMode );
pixhawk's avatar
pixhawk committed
74 75
    FitMode fitMode() const;

Bryant's avatar
Bryant committed
76
    void setSpline( const QwtSpline& );
pixhawk's avatar
pixhawk committed
77 78 79
    const QwtSpline &spline() const;
    QwtSpline &spline();

Bryant's avatar
Bryant committed
80
    void setSplineSize( int size );
pixhawk's avatar
pixhawk committed
81 82
    int splineSize() const;

Bryant's avatar
Bryant committed
83
    virtual QPolygonF fitCurve( const QPolygonF & ) const;
pixhawk's avatar
pixhawk committed
84 85

private:
Bryant's avatar
Bryant committed
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
    QPolygonF fitSpline( const QPolygonF & ) const;
    QPolygonF fitParametric( const QPolygonF & ) const;

    class PrivateData;
    PrivateData *d_data;
};

/*!
  \brief A curve fitter implementing Douglas and Peucker algorithm

  The purpose of the Douglas and Peucker algorithm is that given a 'curve'
  composed of line segments to find a curve not too dissimilar but that
  has fewer points. The algorithm defines 'too dissimilar' based on the
  maximum distance (tolerance) between the original curve and the
  smoothed curve.

  The runtime of the algorithm increases non linear ( worst case O( n*n ) )
  and might be very slow for huge polygons. To avoid performance issues
  it might be useful to split the polygon ( setChunkSize() ) and to run the algorithm
  for these smaller parts. The disadvantage of having no interpolation
  at the borders is for most use cases irrelevant.

  The smoothed curve consists of a subset of the points that defined the
  original curve.

  In opposite to QwtSplineCurveFitter the Douglas and Peucker algorithm reduces
  the number of points. By adjusting the tolerance parameter according to the
  axis scales QwtSplineCurveFitter can be used to implement different
  level of details to speed up painting of curves of many points.
*/
class QWT_EXPORT QwtWeedingCurveFitter: public QwtCurveFitter
{
public:
    QwtWeedingCurveFitter( double tolerance = 1.0 );
    virtual ~QwtWeedingCurveFitter();

    void setTolerance( double );
    double tolerance() const;

    void setChunkSize( uint );
    uint chunkSize() const;

    virtual QPolygonF fitCurve( const QPolygonF & ) const;

private:
    virtual QPolygonF simplify( const QPolygonF & ) const;

    class Line;
134

pixhawk's avatar
pixhawk committed
135 136 137 138 139
    class PrivateData;
    PrivateData *d_data;
};

#endif