更新文档
parent
1febf7b0fe
commit
5f36199829
15
README.md
15
README.md
|
@ -1,14 +1,15 @@
|
||||||
|
|
||||||
## 0 前言说明
|
## 0 前言说明
|
||||||
1. **下载说明:由于可执行文件比较大,如有需要请到网盘下载。**
|
1. **下载说明:由于可执行文件比较大,如有需要请到网盘下载。**
|
||||||
2. **网店地址:https://shop244026315.taobao.com/**
|
2. **网店地址:https://shop244026315.taobao.com/**
|
||||||
3. **联系方式:QQ(517216493)微信(feiyangqingyun)推荐加微信。**
|
3. **联系方式:QQ(517216493)微信(feiyangqingyun)推荐加微信。**
|
||||||
4. **以下项目已经全部支持Qt4/5/6所有版本以及后续版本**
|
4. **以下项目已经全部支持Qt4/5/6所有版本以及后续版本。**
|
||||||
5. 监控作品体验:[https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g](https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g) 提取码:01jf
|
5. 项目作品大全:[https://blog.csdn.net/feiyangqingyun/article/details/97565652](https://blog.csdn.net/feiyangqingyun/article/details/97565652)
|
||||||
6. 其他作品体验:[https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A](https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A) 提取码:o05q
|
6. 监控作品体验:[https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g](https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g) 提取码:01jf
|
||||||
7. 监控系统在线文档:[https://feiyangqingyun.gitee.io/QWidgetDemo/video_system/](https://feiyangqingyun.gitee.io/QWidgetDemo/video_system/)
|
7. 其他作品体验:[https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A](https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A) 提取码:o05q
|
||||||
8. 大屏系统在线文档:[https://feiyangqingyun.gitee.io/QWidgetDemo/bigscreen/](https://feiyangqingyun.gitee.io/QWidgetDemo/bigscreen/)
|
8. 监控系统在线文档:[https://feiyangqingyun.gitee.io/QWidgetDemo/video_system/](https://feiyangqingyun.gitee.io/QWidgetDemo/video_system/)
|
||||||
9. 物联网系统在线文档:[https://feiyangqingyun.gitee.io/QWidgetDemo/iotsystem/](https://feiyangqingyun.gitee.io/QWidgetDemo/iotsystem/)
|
9. 大屏系统在线文档:[https://feiyangqingyun.gitee.io/QWidgetDemo/bigscreen/](https://feiyangqingyun.gitee.io/QWidgetDemo/bigscreen/)
|
||||||
|
10. 物联网系统在线文档:[https://feiyangqingyun.gitee.io/QWidgetDemo/iotsystem/](https://feiyangqingyun.gitee.io/QWidgetDemo/iotsystem/)
|
||||||
|
|
||||||
## 1 特别说明
|
## 1 特别说明
|
||||||
1. 可以选择打开QWidgetDemo.pro一次性编译所有的,也可以到目录下打开pro编译。
|
1. 可以选择打开QWidgetDemo.pro一次性编译所有的,也可以到目录下打开pro编译。
|
||||||
|
|
|
@ -2,6 +2,10 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += printsupport
|
||||||
greaterThan(QT_MAJOR_VERSION, 4): CONFIG += c++11
|
greaterThan(QT_MAJOR_VERSION, 4): CONFIG += c++11
|
||||||
#lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++11
|
#lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++11
|
||||||
|
|
||||||
|
#引入平滑曲线类
|
||||||
|
HEADERS += $$PWD/smoothcurve.h
|
||||||
|
SOURCES += $$PWD/smoothcurve.cpp
|
||||||
|
|
||||||
#没有定义任何版本则默认采用2.0
|
#没有定义任何版本则默认采用2.0
|
||||||
!contains(DEFINES, qcustomplot_v1_3) {
|
!contains(DEFINES, qcustomplot_v1_3) {
|
||||||
!contains(DEFINES, qcustomplot_v2_0) {
|
!contains(DEFINES, qcustomplot_v2_0) {
|
||||||
|
|
|
@ -0,0 +1,120 @@
|
||||||
|
#include "smoothcurve.h"
|
||||||
|
#include "qdebug.h"
|
||||||
|
|
||||||
|
QPainterPath SmoothCurve::createSmoothCurve(const QVector<QPointF> &points)
|
||||||
|
{
|
||||||
|
QPainterPath path;
|
||||||
|
int len = points.size();
|
||||||
|
if (len < 2) {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVector<QPointF> firstControlPoints;
|
||||||
|
QVector<QPointF> secondControlPoints;
|
||||||
|
calculateControlPoints(points, &firstControlPoints, &secondControlPoints);
|
||||||
|
path.moveTo(points[0].x(), points[0].y());
|
||||||
|
|
||||||
|
for (int i = 0; i < len - 1; ++i) {
|
||||||
|
path.cubicTo(firstControlPoints[i], secondControlPoints[i], points[i + 1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPainterPath SmoothCurve::createSmoothCurve2(const QVector<QPointF> &points)
|
||||||
|
{
|
||||||
|
//采用Qt原生方法不做任何处理
|
||||||
|
int count = points.count();
|
||||||
|
if (count == 0) {
|
||||||
|
return QPainterPath();
|
||||||
|
}
|
||||||
|
|
||||||
|
QPainterPath path(points.at(0));
|
||||||
|
for (int i = 0; i < count - 1; ++i) {
|
||||||
|
//控制点的 x 坐标为 sp 与 ep 的 x 坐标和的一半
|
||||||
|
//第一个控制点 c1 的 y 坐标为起始点 sp 的 y 坐标
|
||||||
|
//第二个控制点 c2 的 y 坐标为结束点 ep 的 y 坐标
|
||||||
|
QPointF sp = points.at(i);
|
||||||
|
QPointF ep = points.at(i + 1);
|
||||||
|
QPointF c1 = QPointF((sp.x() + ep.x()) / 2, sp.y());
|
||||||
|
QPointF c2 = QPointF((sp.x() + ep.x()) / 2, ep.y());
|
||||||
|
path.cubicTo(c1, c2, ep);
|
||||||
|
}
|
||||||
|
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SmoothCurve::calculateFirstControlPoints(double *&result, const double *rhs, int n)
|
||||||
|
{
|
||||||
|
result = new double[n];
|
||||||
|
double *tmp = new double[n];
|
||||||
|
double b = 2.0;
|
||||||
|
result[0] = rhs[0] / b;
|
||||||
|
|
||||||
|
for (int i = 1; i < n; ++i) {
|
||||||
|
tmp[i] = 1 / b;
|
||||||
|
b = (i < n - 1 ? 4.0 : 3.5) - tmp[i];
|
||||||
|
result[i] = (rhs[i] - result[i - 1]) / b;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 1; i < n; ++i) {
|
||||||
|
result[n - i - 1] -= tmp[n - i] * result[n - i];
|
||||||
|
}
|
||||||
|
|
||||||
|
delete tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SmoothCurve::calculateControlPoints(const QVector<QPointF> &datas,
|
||||||
|
QVector<QPointF> *firstControlPoints,
|
||||||
|
QVector<QPointF> *secondControlPoints)
|
||||||
|
{
|
||||||
|
int n = datas.size() - 1;
|
||||||
|
for (int i = 0; i < n; ++i) {
|
||||||
|
firstControlPoints->append(QPointF());
|
||||||
|
secondControlPoints->append(QPointF());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n == 1) {
|
||||||
|
(*firstControlPoints)[0].rx() = (2 * datas[0].x() + datas[1].x()) / 3;
|
||||||
|
(*firstControlPoints)[0].ry() = (2 * datas[0].y() + datas[1].y()) / 3;
|
||||||
|
(*secondControlPoints)[0].rx() = 2 * (*firstControlPoints)[0].x() - datas[0].x();
|
||||||
|
(*secondControlPoints)[0].ry() = 2 * (*firstControlPoints)[0].y() - datas[0].y();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
double *xs = 0;
|
||||||
|
double *ys = 0;
|
||||||
|
double *rhsx = new double[n];
|
||||||
|
double *rhsy = new double[n];
|
||||||
|
|
||||||
|
for (int i = 1; i < n - 1; ++i) {
|
||||||
|
rhsx[i] = 4 * datas[i].x() + 2 * datas[i + 1].x();
|
||||||
|
rhsy[i] = 4 * datas[i].y() + 2 * datas[i + 1].y();
|
||||||
|
}
|
||||||
|
|
||||||
|
rhsx[0] = datas[0].x() + 2 * datas[1].x();
|
||||||
|
rhsx[n - 1] = (8 * datas[n - 1].x() + datas[n].x()) / 2.0;
|
||||||
|
rhsy[0] = datas[0].y() + 2 * datas[1].y();
|
||||||
|
rhsy[n - 1] = (8 * datas[n - 1].y() + datas[n].y()) / 2.0;
|
||||||
|
|
||||||
|
calculateFirstControlPoints(xs, rhsx, n);
|
||||||
|
calculateFirstControlPoints(ys, rhsy, n);
|
||||||
|
|
||||||
|
for (int i = 0; i < n; ++i) {
|
||||||
|
(*firstControlPoints)[i].rx() = xs[i];
|
||||||
|
(*firstControlPoints)[i].ry() = ys[i];
|
||||||
|
|
||||||
|
if (i < n - 1) {
|
||||||
|
(*secondControlPoints)[i].rx() = 2 * datas[i + 1].x() - xs[i + 1];
|
||||||
|
(*secondControlPoints)[i].ry() = 2 * datas[i + 1].y() - ys[i + 1];
|
||||||
|
} else {
|
||||||
|
(*secondControlPoints)[i].rx() = (datas[n].x() + xs[n - 1]) / 2;
|
||||||
|
(*secondControlPoints)[i].ry() = (datas[n].y() + ys[n - 1]) / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete xs;
|
||||||
|
delete ys;
|
||||||
|
delete rhsx;
|
||||||
|
delete rhsy;
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
#ifndef SMOOTHCURVE_H
|
||||||
|
#define SMOOTHCURVE_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QVector>
|
||||||
|
#include <QPointF>
|
||||||
|
#include <QPainterPath>
|
||||||
|
|
||||||
|
#ifdef quc
|
||||||
|
class Q_DECL_EXPORT SmoothCurve
|
||||||
|
#else
|
||||||
|
class SmoothCurve
|
||||||
|
#endif
|
||||||
|
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//创建平滑曲线路径
|
||||||
|
static QPainterPath createSmoothCurve(const QVector<QPointF> &points);
|
||||||
|
static QPainterPath createSmoothCurve2(const QVector<QPointF> &points);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static void calculateFirstControlPoints(double *&result, const double *rhs, int n);
|
||||||
|
static void calculateControlPoints(const QVector<QPointF> &datas,
|
||||||
|
QVector<QPointF> *firstControlPoints,
|
||||||
|
QVector<QPointF> *secondControlPoints);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SMOOTHCURVE_H
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue