A class for spline interpolation. More...
#include <qwt_spline.h>
Classes | |
class | PrivateData |
Public Types | |
enum | SplineType { Natural, Periodic } |
Spline type. More... | |
Public Member Functions | |
QwtSpline () | |
Constructor. | |
QwtSpline (const QwtSpline &) | |
~QwtSpline () | |
Destructor. | |
QwtSpline & | operator= (const QwtSpline &) |
void | setSplineType (SplineType) |
SplineType | splineType () const |
bool | setPoints (const QMemArray< QwtDoublePoint > &points) |
Calculate the spline coefficients. | |
QMemArray< QwtDoublePoint > | points () const |
void | reset () |
Free allocated memory and set size to 0. | |
bool | isValid () const |
True if valid. | |
double | value (double x) const |
const QMemArray< double > & | coefficientsA () const |
const QMemArray< double > & | coefficientsB () const |
const QMemArray< double > & | coefficientsC () const |
Protected Member Functions | |
bool | buildNaturalSpline (const QMemArray< QwtDoublePoint > &) |
Determines the coefficients for a natural spline. | |
bool | buildPeriodicSpline (const QMemArray< QwtDoublePoint > &) |
Determines the coefficients for a periodic spline. | |
Protected Attributes | |
PrivateData * | d_data |
A class for spline interpolation.
The QwtSpline class is used for cubical spline interpolation. Two types of splines, natural and periodic, are supported.
#include <qwt_spline.h> QPolygonF interpolate(const QPolygonF& points, int numValues) { QwtSpline spline; if ( !spline.setPoints(points) ) return points; QPolygonF interpolatedPoints(numValues); const double delta = (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; }
Definition at line 77 of file qwt_spline.h.
Spline type.
Definition at line 81 of file qwt_spline.h.
QwtSpline::QwtSpline | ( | ) |
Constructor.
Definition at line 73 of file qwt_spline.cpp.
References d_data.
{ d_data = new PrivateData; }
QwtSpline::QwtSpline | ( | const QwtSpline & | other ) |
Copy constructor
other | Spline used for initilization |
Definition at line 82 of file qwt_spline.cpp.
References d_data.
QwtSpline::~QwtSpline | ( | ) |
bool QwtSpline::buildNaturalSpline | ( | const QMemArray< QwtDoublePoint > & | points ) | [protected] |
Determines the coefficients for a natural spline.
Definition at line 241 of file qwt_spline.cpp.
{ int i; #if QT_VERSION < 0x040000 const QwtDoublePoint *p = points.data(); #else const QPointF *p = points.data(); #endif const int size = points.size(); double *a = d_data->a.data(); double *b = d_data->b.data(); double *c = d_data->c.data(); // set up tridiagonal equation system; use coefficient // vectors as temporary buffers QwtArray<double> h(size-1); for (i = 0; i < size - 1; i++) { h[i] = p[i+1].x() - p[i].x(); if (h[i] <= 0) return false; } QwtArray<double> d(size-1); double dy1 = (p[1].y() - p[0].y()) / h[0]; for (i = 1; i < size - 1; i++) { b[i] = c[i] = h[i]; a[i] = 2.0 * (h[i-1] + h[i]); const double dy2 = (p[i+1].y() - p[i].y()) / h[i]; d[i] = 6.0 * ( dy1 - dy2); dy1 = dy2; } // // solve it // // L-U Factorization for(i = 1; i < size - 2;i++) { c[i] /= a[i]; a[i+1] -= b[i] * c[i]; } // forward elimination QwtArray<double> s(size); s[1] = d[1]; for ( i = 2; i < size - 1; i++) s[i] = d[i] - c[i-1] * s[i-1]; // backward elimination s[size - 2] = - s[size - 2] / a[size - 2]; for (i = size -3; i > 0; i--) s[i] = - (s[i] + b[i] * s[i+1]) / a[i]; s[size - 1] = s[0] = 0.0; // // Finally, determine the spline coefficients // for (i = 0; i < size - 1; i++) { a[i] = ( s[i+1] - s[i] ) / ( 6.0 * h[i]); b[i] = 0.5 * s[i]; c[i] = ( p[i+1].y() - p[i].y() ) / h[i] - (s[i+1] + 2.0 * s[i] ) * h[i] / 6.0; } return true; }
bool QwtSpline::buildPeriodicSpline | ( | const QMemArray< QwtDoublePoint > & | points ) | [protected] |
Determines the coefficients for a periodic spline.
Definition at line 323 of file qwt_spline.cpp.
References qwtSqr(), QuadProgPP::sqrt(), and QuadProgPP::sum().
{ int i; #if QT_VERSION < 0x040000 const QwtDoublePoint *p = points.data(); #else const QPointF *p = points.data(); #endif const int size = points.size(); double *a = d_data->a.data(); double *b = d_data->b.data(); double *c = d_data->c.data(); QwtArray<double> d(size-1); QwtArray<double> h(size-1); QwtArray<double> s(size); // // setup equation system; use coefficient // vectors as temporary buffers // for (i = 0; i < size - 1; i++) { h[i] = p[i+1].x() - p[i].x(); if (h[i] <= 0.0) return false; } const int imax = size - 2; double htmp = h[imax]; double dy1 = (p[0].y() - p[imax].y()) / htmp; for (i = 0; i <= imax; i++) { b[i] = c[i] = h[i]; a[i] = 2.0 * (htmp + h[i]); const double dy2 = (p[i+1].y() - p[i].y()) / h[i]; d[i] = 6.0 * ( dy1 - dy2); dy1 = dy2; htmp = h[i]; } // // solve it // // L-U Factorization a[0] = sqrt(a[0]); c[0] = h[imax] / a[0]; double sum = 0; for( i = 0; i < imax - 1; i++) { b[i] /= a[i]; if (i > 0) c[i] = - c[i-1] * b[i-1] / a[i]; a[i+1] = sqrt( a[i+1] - qwtSqr(b[i])); sum += qwtSqr(c[i]); } b[imax-1] = (b[imax-1] - c[imax-2] * b[imax-2]) / a[imax-1]; a[imax] = sqrt(a[imax] - qwtSqr(b[imax-1]) - sum); // forward elimination s[0] = d[0] / a[0]; sum = 0; for( i = 1; i < imax; i++) { s[i] = (d[i] - b[i-1] * s[i-1]) / a[i]; sum += c[i-1] * s[i-1]; } s[imax] = (d[imax] - b[imax-1] * s[imax-1] - sum) / a[imax]; // backward elimination s[imax] = - s[imax] / a[imax]; s[imax-1] = -(s[imax-1] + b[imax-1] * s[imax]) / a[imax-1]; for (i= imax - 2; i >= 0; i--) s[i] = - (s[i] + b[i] * s[i+1] + c[i] * s[imax]) / a[i]; // // Finally, determine the spline coefficients // s[size-1] = s[0]; for ( i=0; i < size-1; i++) { a[i] = ( s[i+1] - s[i] ) / ( 6.0 * h[i]); b[i] = 0.5 * s[i]; c[i] = ( p[i+1].y() - p[i].y() ) / h[i] - (s[i+1] + 2.0 * s[i] ) * h[i] / 6.0; } return true; }
const QMemArray< double > & QwtSpline::coefficientsA | ( | ) | const |
Definition at line 187 of file qwt_spline.cpp.
References QwtSpline::PrivateData::a, and d_data.
const QMemArray< double > & QwtSpline::coefficientsB | ( | ) | const |
Definition at line 193 of file qwt_spline.cpp.
References QwtSpline::PrivateData::b, and d_data.
const QMemArray< double > & QwtSpline::coefficientsC | ( | ) | const |
Definition at line 199 of file qwt_spline.cpp.
References QwtSpline::PrivateData::c, and d_data.
bool QwtSpline::isValid | ( | ) | const |
True if valid.
Definition at line 215 of file qwt_spline.cpp.
References QwtSpline::PrivateData::a, and d_data.
Assignment operator
other | Spline used for initilization |
Definition at line 91 of file qwt_spline.cpp.
References d_data.
QMemArray< QwtDoublePoint > QwtSpline::points | ( | ) | const |
Return points passed by setPoints
Definition at line 178 of file qwt_spline.cpp.
void QwtSpline::reset | ( | ) |
Free allocated memory and set size to 0.
Definition at line 206 of file qwt_spline.cpp.
References QwtSpline::PrivateData::a, QwtSpline::PrivateData::b, QwtSpline::PrivateData::c, d_data, and QwtSpline::PrivateData::points.
Referenced by QwtSplineCurveFitter::setSpline().
bool QwtSpline::setPoints | ( | const QMemArray< QwtDoublePoint > & | points ) |
Calculate the spline coefficients.
Depending on the value of periodic, this function will determine the coefficients for a natural or a periodic spline and store them internally.
x | |
y | points |
size | number of points |
periodic | if true, calculate periodic spline |
x[0] < x[1] < .... < x[n-1]
. If this is not the case, the function will return false Definition at line 140 of file qwt_spline.cpp.
{ const int size = points.size(); if (size <= 2) { reset(); return false; } #if QT_VERSION < 0x040000 d_data->points = points.copy(); // Qt3: deep copy #else d_data->points = points; #endif d_data->a.resize(size-1); d_data->b.resize(size-1); d_data->c.resize(size-1); bool ok; if ( d_data->splineType == Periodic ) ok = buildPeriodicSpline(points); else ok = buildNaturalSpline(points); if (!ok) reset(); return ok; }
void QwtSpline::setSplineType | ( | SplineType | splineType ) |
Select the algorithm used for calculating the spline
splineType | Spline type |
Definition at line 109 of file qwt_spline.cpp.
References d_data, splineType(), and QwtSpline::PrivateData::splineType.
{ d_data->splineType = splineType; }
QwtSpline::SplineType QwtSpline::splineType | ( | ) | const |
Definition at line 118 of file qwt_spline.cpp.
References d_data, and QwtSpline::PrivateData::splineType.
Referenced by setSplineType().
{ return d_data->splineType; }
double QwtSpline::value | ( | double | x ) | const |
Calculate the interpolated function value corresponding to a given argument x.
Definition at line 224 of file qwt_spline.cpp.
References QwtSpline::PrivateData::a, QwtSpline::PrivateData::b, QwtSpline::PrivateData::c, d_data, lookup(), and QwtSpline::PrivateData::points.
PrivateData* QwtSpline::d_data [protected] |
Definition at line 126 of file qwt_spline.h.
Referenced by coefficientsA(), coefficientsB(), coefficientsC(), QwtPolygonFData::copy(), QwtPolygonFData::data(), isValid(), operator=(), QwtPolygonFData::operator=(), QwtSpline(), reset(), setSplineType(), QwtPolygonFData::size(), splineType(), value(), QwtPolygonFData::x(), QwtPolygonFData::y(), and ~QwtSpline().