更新文档

master
feiyangqingyun 2022-06-02 09:41:24 +08:00
parent 1febf7b0fe
commit 5f36199829
11 changed files with 67358 additions and 62665 deletions

View File

@ -1,14 +1,15 @@

## 0 前言说明 ## 0 前言说明
1. **下载说明:由于可执行文件比较大,如有需要请到网盘下载。** 1. **下载说明:由于可执行文件比较大,如有需要请到网盘下载。**
2. **网店地址https://shop244026315.taobao.com/** 2. **网店地址https://shop244026315.taobao.com/**
3. **联系方式QQ517216493微信feiyangqingyun推荐加微信。** 3. **联系方式QQ517216493微信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编译。

View File

@ -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) {

View File

@ -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;
}

View File

@ -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