10#include "qwt_bezier.h" 
   26        inline BezierData( 
const QPointF& p1, 
const QPointF& cp1,
 
   27                const QPointF& cp2, 
const QPointF& p2 ):
 
   39        static inline double minFlatness( 
double tolerance )
 
   45            return 16 * ( tolerance * tolerance );
 
   48        inline double flatness()
 const 
   52            const double ux = 3.0 * m_cx1 - 2.0 * m_x1 - m_x2;
 
   53            const double uy = 3.0 * m_cy1 - 2.0 * m_y1 - m_y2;
 
   54            const double vx = 3.0 * m_cx2 - 2.0 * m_x2 - m_x1;
 
   55            const double vy = 3.0 * m_cy2 - 2.0 * m_y2 - m_y1;
 
   57            const double ux2 = ux * ux;
 
   58            const double uy2 = uy * uy;
 
   60            const double vx2 = vx * vx;
 
   61            const double vy2 = vy * vy;
 
   63            return qwtMaxF( ux2, vx2 ) + qwtMaxF( uy2, vy2 );
 
   66        inline BezierData subdivided()
 
   70            const double c1 = midValue( m_cx1, m_cx2 );
 
   72            bz.m_cx1 = midValue( m_x1, m_cx1 );
 
   73            m_cx2 = midValue( m_cx2, m_x2 );
 
   75            bz.m_cx2 = midValue( bz.m_cx1, c1 );
 
   76            m_cx1 = midValue( c1, m_cx2 );
 
   77            bz.m_x2 = m_x1 = midValue( bz.m_cx2, m_cx1 );
 
   79            const double c2 = midValue( m_cy1, m_cy2 );
 
   81            bz.m_cy1 = midValue( m_y1, m_cy1 );
 
   82            m_cy2 = midValue( m_cy2, m_y2 );
 
   84            bz.m_cy2 = midValue( bz.m_cy1, c2 );
 
   85            m_cy1 = midValue( m_cy2, c2 );
 
   86            bz.m_y2 = m_y1 = midValue( bz.m_cy2, m_cy1 );
 
   91        inline QPointF p2()
 const 
   93            return QPointF( m_x2, m_y2 );
 
   97        inline double midValue( 
double v1, 
double v2 )
 
   99            return 0.5 * ( v1 + v2 );
 
  117    : m_tolerance( qwtMaxF( tolerance, 0.0 ) )
 
  118    , m_flatness( BezierData::minFlatness( m_tolerance ) )
 
 
  144    m_flatness = BezierData::minFlatness( m_tolerance );
 
 
  158    const QPointF& cp1, 
const QPointF& cp2, 
const QPointF& p2 )
 const 
  162    if ( m_flatness > 0.0 )
 
 
  187    const QPointF& cp2, 
const QPointF& p2, QPolygonF& polygon )
 const 
  189    if ( m_flatness <= 0.0 )
 
  195    if ( polygon.isEmpty() || polygon.last() != p1 )
 
  203    stack.push( BezierData( p1, cp1, cp2, p2 ) );
 
  207        BezierData& bz = stack.top();
 
  209        if ( bz.flatness() < m_flatness )
 
  211            if ( stack.size() == 1 )
 
  222            stack.push( bz.subdivided() );
 
 
  240    const QPointF& cp1, 
const QPointF& cp2, 
const QPointF& p2, 
double t )
 
  242    const double d1 = 3.0 * t;
 
  243    const double d2 = 3.0 * t * t;
 
  244    const double d3 = t * t * t;
 
  245    const double s = 1.0 - t;
 
  247    const double x = ( ( s * p1.x() + d1 * cp1.x() ) * s + d2 * cp2.x() ) * s + d3 * p2.x();
 
  248    const double y = ( ( s * p1.y() + d1 * cp1.y() ) * s + d2 * cp2.y() ) * s + d3 * p2.y();
 
  250    return QPointF( x, y );
 
 
QPolygonF toPolygon(const QPointF &p1, const QPointF &cp1, const QPointF &cp2, const QPointF &p2) const
Interpolate a Bézier curve by a polygon.
void appendToPolygon(const QPointF &p1, const QPointF &cp1, const QPointF &cp2, const QPointF &p2, QPolygonF &polygon) const
Interpolate a Bézier curve by a polygon.
void setTolerance(double tolerance)
QwtBezier(double tolerance=0.5)
Constructor.
static QPointF pointAt(const QPointF &p1, const QPointF &cp1, const QPointF &cp2, const QPointF &p2, double t)