#include "bezierline.h"BezierLine::BezierLine(QWidget *parent)
{this->setParent(parent);/*阶数 : 公式order = 2: P = (1-t)^2*P0 + 2(1-t)*t*P1 + t^2*P2order = 3: P = (1-t)^3*P0 + 3(1-t)^2*t*P1 + 3(1-t)*t^2*P2 + t^3*P3order = 4: P = (1-t)^4*P0 + 4(1-t)^3*t*P1 + 6(1-t)^2*t^2*P2 + 4(1-t)*t^3*P3 + t^4*P4order = 5: P = (1-t)^5*P0 + 5(1-t)^4*t*P1 + 10(1-t)^3*t^2*P2 + 10(1-t)^2*t^3*P3 + 5(1-t)*t^4*P4 + t^5*P5order = 6: P = (1-t)^6*P0 + 6(1-t)^5*t*P1 + 15(1-t)^4*t^2*P2 + 20(1-t)^3*t^3*P3 + 15(1-t)^2*t^4*P4 + 6(1-t)*t^5*P5 + t^6*P6系数 杨辉三角O=0: 1O=1: 1 1O=2: 1 2 1O=3: 1 3 3 1O=4: 1 4 6 4 1O=5: 1 5 10 10 5 1O=6: 1 6 15 20 15 6 1
*/
}void BezierLine::paintEvent(QPaintEvent *event)
{if(event->type() != QEvent::Paint){qDebug() << __FILE__ << __LINE__ << event->type();return;}QPainter painter(this);// bezierOrder2(painter);
// bezierOrder3(painter);
// bezierOrder4(painter);bezierOrder6(painter);
}void BezierLine::bezierOrder2(QPainter & painter)
{double t = 0;int number = 100;double step = 1.0 / number;QVector2D V1(100,100),V2(100,50),V3(150,50);QVector2D Q1;QPointF * arr;arr = new QPointF[number+1];int i = 0;for(i=0; i <= number; i++){t = i * step;Q1 = (1-t)*(1-t)*V1 + 2* t* (1-t) * V2+ t*t*V3;arr[i].setX(Q1.x());arr[i].setY(Q1.y());}painter.drawPolyline(arr,number);delete []arr;
}void BezierLine::bezierOrder3(QPainter & painter)
{double t = 0;int number = 100;double step = 1.0 / number;QVector2D V1(100,100),V2(100,50),V3(150,50),V4(150,100);QVector2D Q1;QPointF * arr;arr = new QPointF[number+1];int i = 0;for(i=0; i <= number; i++){t = i * step;Q1 = (1-t)*(1-t)*(1-t)*V1 + 3* (1-t) * (1-t) * t * V2+ 3*(1-t) *t*t *V3 + t*t*t*V4;arr[i].setX(Q1.x());arr[i].setY(Q1.y());}painter.drawPolyline(arr,number);delete []arr;
}void BezierLine::bezierOrder4(QPainter & painter)
{double t = 0;int number = 100;double step = 1.0 / number;QVector2D V1(100,100);QVector2D V2(100,50);QVector2D V3(150,50);QVector2D V4(150,100);QVector2D V5(125,75);QVector2D Q1;QPointF * arr;arr = new QPointF[number+1];int i = 0;for(i=0; i <= number; i++){t = i * step;Q1 = (1-t)*(1-t)*(1-t)*(1-t)*V1 + 4*(1-t)*(1-t)*(1-t)*t*V2+ 6*(1-t)*(1-t) *t*t *V3 + 4*(1-t)* t*t*t*V4 + t*t*t*t *V5;arr[i].setX(Q1.x());arr[i].setY(Q1.y());}painter.drawPolyline(arr,number);delete []arr;
}void BezierLine::bezierOrder6(QPainter & painter)
{double t = 0;int number = 100;double step = 1.0 / number;QVector2D V1(100,100);QVector2D V2(100, 50);QVector2D V3(150, 50);QVector2D V4(200, 150);QVector2D V5(250, 50);QVector2D V6(300, 50);QVector2D V7(300, 100);QVector2D Q1;QPointF * arr;arr = new QPointF[number+1];int i = 0;for(i=0; i <= number; i++){t = i * step;Q1 = (1-t)*(1-t)*(1-t)*(1-t)*(1-t)*(1-t)*V1 + \6*(1-t)*(1-t)*(1-t)*(1-t)*(1-t)*t*V2 + \15*(1-t)*(1-t)*(1-t)*(1-t)*t*t*V3 + \20*(1-t)*(1-t)*(1-t)*t*t*t*V4 + \15*(1-t)*(1-t)*t*t*t*t*V5 + \6*(1-t)*t*t*t*t*t*V6 + \t*t*t*t*t*t*V7;arr[i].setX(Q1.x());arr[i].setY(Q1.y());}painter.drawPolyline(arr,number);delete []arr;
}