B样曲线绘制代码。头文件中vector分别储存着控制点和B样曲线的点
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QMouseEvent>
#include <iostream>
#include <cmath>
using namespace std;
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
void paintEvent(QPaintEvent *event);
void mousePressEvent(QMouseEvent *event);
private:
vector<QPointF> ctrlPoint;
vector<QPointF> curverPoint;
};
#endif // WIDGET_H
//源文件包含对控制点的绘制和B样曲线的绘制
#include "widget.h"
#include <QPainter>
#include <QPen>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
}
void Widget::paintEvent(QPaintEvent *event)
{
int i = 0;
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
painter.setBrush(Qt::green);
for(i=0; i<(int)ctrlPoint.size(); i++)
{
QPointF p = ctrlPoint[i];
painter.drawRect(p.x()-5,p.y()-5,10,10);
}
QPen pen;
pen.setStyle(Qt::DashDotLine);
pen.setColor(Qt::red);
painter.setPen(pen);
for(int i=0; i<(int)ctrlPoint.size()-1; i++)
{
painter.drawLine(ctrlPoint[i],ctrlPoint[i+1]);
}
painter.setPen(Qt::black);
for(int j=0; j<(int)curverPoint.size()-1; j++)
{
painter.drawLine(curverPoint[j],curverPoint[j+1]);
}
}
void Widget::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
ctrlPoint.push_back(event->pos());
update();
curverPoint.clear();
for(int i=0; i<(int)ctrlPoint.size()-3; i++)
{
for(double j=0; j<=1; j+=0.02)
{
//相邻四个点可以绘制一条B样曲线,确定相邻的四个点,那么这四个点的曲线参数方程式也相应确定.
QPointF p = 1/6.0*(-j*j*j+3*j*j-3*j+1)*ctrlPoint[i]+1/6.0*(3*j*j*j-6*j*j+4)*ctrlPoint[i+1]+1/6.0*(-3*j*j*j+3*j*j+3*j+1)*ctrlPoint[i+2]+1/6.0*(j*j*j)*ctrlPoint[i+3];
curverPoint.push_back(p);
}
}
}
}
Widget::~Widget()
{
}