10 #include "qwt_spline_basis.h" 
   11 #include "qwt_spline_parametrization.h" 
   12 #include <qpainterpath.h> 
   15 static QPolygonF qwtBasisUniformKnots( 
const QPolygonF& points )
 
   17     const int n = points.size();
 
   27     kx[n - 3] = 6.0 * points[n - 2].x() - points[n - 1].x();
 
   28     ky[n - 3] = 6.0 * points[n - 2].y() - points[n - 1].y();
 
   30     for ( 
int i = n - 4; i >= 0; i-- )
 
   32         u[i] = 4.0 - 1.0 / u[i + 1];
 
   33         kx[i] = 6.0 * points[i + 1].x() - kx[i + 1] / u[i + 1];
 
   34         ky[i] = 6.0 * points[i + 1].y() - ky[i + 1] / u[i + 1];
 
   41     for ( 
int i = 1; i < n - 1; i++ )
 
   43         knots[i].rx() = ( kx[i - 1] - knots[i - 1].x() ) / u[i - 1];
 
   44         knots[i].ry() = ( ky[i - 1] - knots[i - 1].y() ) / u[i - 1];
 
   47     knots[n - 1] = points[n - 1];
 
   55     const QPointF& p1, 
const QPointF& p2, 
const QPointF& p3, 
const QPointF& p4,
 
   56     QPointF& cp1, QPointF& cp2 )
 
   62     const double t123 = t1 + t2 + t3;
 
   64     cp1 = ( t2 + t3 ) / t123 * p2 + t1 / t123 * p3;
 
   65     cp2 = ( t3 * p2 + ( t1 + t2 ) * p3 ) / t123;
 
   69 static QPainterPath qwtSplineBasisPathUniform( 
const QPolygonF& points,
 
   72     const int n = points.size();
 
   73     const QPointF* pd = points.constData();
 
   77     QPointF cp1 = ( 2.0 * pd[0] + pd[1] ) / 3.0;;
 
   85         const QPointF cpN = ( pd[n - 1] + 2.0 * pd[0] ) / 3.0;
 
   86         path.moveTo( 0.5 * ( cpN + cp1 ) );
 
   89     for ( 
int i = 1; i < n - 1; i++ )
 
   91         const QPointF cp2 = ( pd[i - 1] + 2.0 * pd[i] ) / 3.0;
 
   92         const QPointF cp3 = ( 2.0 * pd[i] + pd[i + 1] ) / 3.0;
 
   94         path.cubicTo( cp1, cp2, 0.5 * ( cp2 + cp3 ) );
 
  101         const QPointF cp2 = ( pd[n - 2] + 2.0 * pd[n - 1] ) / 3.0;
 
  102         path.cubicTo( cp1, cp2, pd[n - 1] );
 
  106         const QPointF cp2 = ( pd[n - 2] + 2.0 * pd[n - 1] ) / 3.0;
 
  107         const QPointF cp3 = ( 2.0 * pd[n - 1] + pd[0] ) / 3.0;
 
  109         path.cubicTo( cp1, cp2, 0.5 * ( cp2 + cp3 ) );
 
  113             const QPointF cp4 = ( pd[n - 1] + 2.0 * pd[0] ) / 3.0;
 
  114             const QPointF cp5 = ( 2.0 * pd[0] + pd[1] ) / 3.0;
 
  116             path.cubicTo( cp3, cp4, 0.5 * ( cp4 + cp5 ) );
 
  123 static QPainterPath qwtSplineBasisPath( 
const QPolygonF& points,
 
  127     const int n = points.size();
 
  128     const QPointF* pd = points.constData();
 
  141     double t012 = t0 + t1 + t2;
 
  142     QPointF cp1 = ( ( t1 + t2 ) * pd[0] + t0 * pd[1] ) / t012;
 
  151         const QPointF cpN = ( t1 * pd[n - 1] + ( tN + t0 ) * pd[0] ) / ( tN + t0 + t1 );
 
  153         p0 = ( t1 * cpN + t0 * cp1 ) / ( t0 + t1 );
 
  159     for ( 
int i = 1; i < n - 2; i++ )
 
  162         const double t123 = t1 + t2 + t3;
 
  164         const QPointF cp2 = ( t2 * pd[i - 1] + ( t0 + t1 ) * pd[i] ) / t012;
 
  165         const QPointF cp3 = ( ( t2 + t3 ) * pd[i] + t1 * pd[i + 1] ) / t123;
 
  167         const QPointF p2 = ( t2 * cp2 + t1 * cp3 ) / ( t1 + t2 );
 
  169         path.cubicTo( cp1, cp2, p2 );
 
  186         const double t123 = t1 + t2 + t3;
 
  188         const QPointF cp2 = ( t2 * pd[n - 3] + ( t0 + t1 ) * pd[n - 2] ) / t012;
 
  189         const QPointF cp3 = ( ( t2 + t3 ) * pd[n - 2] + t1 * pd[n - 1] ) / t123;
 
  191         const QPointF p2 = ( t2 * cp2 + t1 * cp3 ) / ( t1 + t2 );
 
  193         path.cubicTo( cp1, cp2, p2 );
 
  203     const QPointF cp2 = ( t2 * pd[n - 2] + ( t0 + t1 ) * pd[n - 1] ) / t012;
 
  207         path.cubicTo( cp1, cp2, pd[n - 1] );
 
  212         const double t123 = t1 + t2 + t3;
 
  214         const QPointF cp3 = ( t2 + t3 ) / t123 * pd[n - 1] + t1 / t123 * pd[0];
 
  215         const QPointF cp4 = ( t3 * pd[n - 1] + ( t1 + t2 ) * pd[0] ) / t123;
 
  217         const QPointF pN = ( t2 * cp2 + t1 * cp3 ) / ( t1 + t2 );
 
  219         path.cubicTo( cp1, cp2, pN );
 
  220         path.cubicTo( cp3, cp4, p0 );
 
  251     if ( points.size() < 4 )
 
  252         return QPainterPath();
 
  260             path = qwtSplineBasisPathUniform( points, 
boundaryType() );
 
virtual uint locality() const override
The locality is always 2.
virtual ~QwtSplineBasis()
Destructor.
QwtSplineBasis()
Constructor.
virtual QPainterPath painterPath(const QPolygonF &) const override
const QwtSplineParametrization * parametrization() const
BoundaryType boundaryType() const
Curve parametrization used for a spline interpolation.
virtual double valueIncrement(const QPointF &, const QPointF &) const
Calculate the parameter value increment for 2 points.