#include "bezierline.h"
BezierLine::BezierLine(QWidget *parent)
{
this->setParent(parent);
/*
阶数 : 公式
order = 2: P = (1-t)^2*P0 + 2(1-t)*t*P1 + t^2*P2
order = 3: P = (1-t)^3*P0 + 3(1-t)^2*t*P1 + 3(1-t)*t^2*P2 + t^3*P3
order = 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*P4
order = 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*P5
order = 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: 1
O=1: 1 1
O=2: 1 2 1
O=3: 1 3 3 1
O=4: 1 4 6 4 1
O=5: 1 5 10 10 5 1
O=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;
}