qwt_spline.h 2.81 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 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
 * 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_SPLINE_H
#define QWT_SPLINE_H

#include "qwt_global.h"
#include "qwt_double_rect.h"

#if QT_VERSION >= 0x040000
#include <QPolygonF>
#else
#include "qwt_array.h"
#endif

// MOC_SKIP_BEGIN

#if defined(QWT_TEMPLATEDLL)

#if QT_VERSION < 0x040000
#ifndef QWTARRAY_TEMPLATE_QWTDOUBLEPOINT // by mjo3
#define QWTARRAY_TEMPLATE_QWTDOUBLEPOINT
template class QWT_EXPORT QwtArray<QwtDoublePoint>;
#endif //end of QWTARRAY_TEMPLATE_QWTDOUBLEPOINT
#endif

#endif

// MOC_SKIP_END

/*!
  \brief A class for spline interpolation

  The QwtSpline class is used for cubical spline interpolation.
  Two types of splines, natural and periodic, are supported.
42

pixhawk's avatar
pixhawk committed
43 44
  \par Usage:
  <ol>
45
  <li>First call setPoints() to determine the spline coefficients
pixhawk's avatar
pixhawk committed
46 47
      for a tabulated function y(x).
  <li>After the coefficients have been set up, the interpolated
48
      function value for an argument x can be determined by calling
pixhawk's avatar
pixhawk committed
49 50 51 52 53 54 55 56 57 58
      QwtSpline::value().
  </ol>

  \par Example:
  \code
#include <qwt_spline.h>

QPolygonF interpolate(const QPolygonF& points, int numValues)
{
    QwtSpline spline;
59
    if ( !spline.setPoints(points) )
pixhawk's avatar
pixhawk committed
60 61 62 63
        return points;

    QPolygonF interpolatedPoints(numValues);

64
    const double delta =
pixhawk's avatar
pixhawk committed
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
        (points[numPoints - 1].x() - points[0].x()) / (points.size() - 1);
    for(i = 0; i < points.size(); i++)  / interpolate
    {
        const double x = points[0].x() + i * delta;
        interpolatedPoints[i].setX(x);
        interpolatedPoints[i].setY(spline.value(x));
    }
    return interpolatedPoints;
}
  \endcode
*/

class QWT_EXPORT QwtSpline
{
public:
80
    enum SplineType {
pixhawk's avatar
pixhawk committed
81 82 83 84 85 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
        Natural,
        Periodic
    };

    QwtSpline();
    QwtSpline( const QwtSpline & );

    ~QwtSpline();

    QwtSpline &operator=( const QwtSpline & );

    void setSplineType(SplineType);
    SplineType splineType() const;

#if QT_VERSION < 0x040000
    bool setPoints(const QwtArray<QwtDoublePoint>& points);
    QwtArray<QwtDoublePoint> points() const;
#else
    bool setPoints(const QPolygonF& points);
    QPolygonF points() const;
#endif

    void reset();

    bool isValid() const;
    double value(double x) const;

protected:

#if QT_VERSION < 0x040000
    bool buildNaturalSpline(
        const QwtArray<QwtDoublePoint> &);
    bool buildPeriodicSpline(
        const QwtArray<QwtDoublePoint> &);
#else
    bool buildNaturalSpline(const QPolygonF &);
    bool buildPeriodicSpline(const QPolygonF &);
#endif

    class PrivateData;
    PrivateData *d_data;
};

#endif