贝塞尔曲线的几个步骤
1、起始点
2、控制点
3、控制点
4、结束点
附上下图(网上找的)
利用QT绘制曲线然后通过定时器遍历整条曲线,先看一下效果:
实现代码:
#pragma once
#include <QPainter>
#include <QPoint>
#include <QRect>
#include <QtWidgets/QMainWindow>
#include "ui_PathLine.h"
class PathLine : public QMainWindow {
Q_OBJECT
public:
PathLine(QWidget *parent = Q_NULLPTR);
void paintEvent(QPaintEvent *event)override;
void mousePressEvent(QMouseEvent *event)override;
void mouseMoveEvent(QMouseEvent *event)override;
void mouseReleaseEvent(QMouseEvent *event)override;
private:
void drawBeser(QPainter&painter);
private slots:
void slotTimeOut();
private:
Ui::PathLineClass ui;
bool _leftDown = false;//鼠标左键按下
int _penWidth = 2;
QPoint* startPoint = nullptr;
QRect* startRect = nullptr;
QPoint* endPoint = nullptr;
QRect* endRect = nullptr;
QPoint* c1 = nullptr;
QRect* c1Rect = nullptr;
QPoint* c2 = nullptr;
QRect* c2Rect = nullptr;
QPainterPath _pathTest;
bool _selected = false;//是否选中点
QPoint* _selectPoint = nullptr;
QPointF pointPercent;//百分之比的点
QTimer* _timer = nullptr;
double _percent = 0.0;
};
#include <QMouseEvent>
#include <QPaintEvent>
#include <QTimer>
#include "PathLine.h"
PathLine::PathLine(QWidget *parent)
: QMainWindow(parent) {
ui.setupUi(this);
startPoint = new QPoint(100, 100);
startRect = new QRect(QPoint(95, 95), QPoint(105, 105));
endPoint = new QPoint(200, 200);
endRect = new QRect(QPoint(195, 195), QPoint(205, 205));
c1 = new QPoint(180, 50);
c1Rect = new QRect(QPoint(175, 45), QPoint(185, 55));
c2 = new QPoint(120, 250);
c2Rect = new QRect(QPoint(115, 245), QPoint(125, 255));
ui.centralWidget->setMouseTracking(true);
this->setMouseTracking(true);
_timer = new QTimer(this);
_timer->setTimerType(Qt::PreciseTimer);//设置定时器的精度,精确到毫秒
connect(_timer, SIGNAL(timeout()), this, SLOT(slotTimeOut()));
_timer->start(500);
}
void PathLine::paintEvent(QPaintEvent *event) {
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
QPen pen;
pen.setColor(QColor(255, 0, 0));
pen.setWidth(_penWidth);
pen.setStyle(Qt::SolidLine);
painter.setPen(pen);
drawBeser(painter);
}
void PathLine::mousePressEvent(QMouseEvent *event) {
if (event->button() == Qt::LeftButton) {
_leftDown = true;
}
update();
}
void PathLine::mouseMoveEvent(QMouseEvent *event) {
QPoint pos = event->pos();
if (_leftDown){//左键按下
if (_selected){//并且选中点
_selectPoint->setX(pos.x());
_selectPoint->setY(pos.y());
}
} else {
if (startRect->contains(pos)) {
_penWidth = 4;
_selected = true;
_selectPoint = startPoint;
} else if (endRect->contains(pos)) {
_penWidth = 4;
_selected = true;
_selectPoint = endPoint;
} else if (c1Rect->contains(pos)) {
_penWidth = 4;
_selected = true;
_selectPoint = c1;
} else if (c2Rect->contains(pos)) {
_penWidth = 4;
_selected = true;
_selectPoint = c2;
} else {
_selected = false;
_penWidth = 2;
_selectPoint = nullptr;
}
}
update();
}
void PathLine::mouseReleaseEvent(QMouseEvent *event) {
if (event->button() == Qt::LeftButton) {
_leftDown = false;
} else if (event->button() == Qt::RightButton) {
}
update();
}
void PathLine::drawBeser(QPainter&painter) {
QPainterPath pathTest;
painter.drawEllipse(*startPoint, 2, 2);
painter.drawEllipse(*endPoint, 2, 2);
painter.drawEllipse(*c1, 2, 2);
painter.drawEllipse(*c2, 2, 2);
pathTest.moveTo(*startPoint);
pathTest.cubicTo(*c1, *c2, *endPoint);
pointPercent = pathTest.pointAtPercent(_percent);
painter.drawEllipse(pointPercent, 5, 5);
painter.drawPath(pathTest);
}
void PathLine::slotTimeOut() {
_percent += 0.01;
update();
}
源码下载
aaa