QPaint绘制频谱图基础原理(使用QImage)

振幅周期固定,产生相应数据

周期固定,振幅随机,产生相应数据

 使用模拟随机数据

 核心代码如下:

 1 #include "thspectrum.h"
 2 
 3 #include <math.h>
 4 
 5 ThSpectrum::ThSpectrum(QObject *parent) : QThread(parent)
 6 {
 7     m_thFlag = true;
 8     m_img = nullptr;
 9 }
10 
11 ThSpectrum::~ThSpectrum()
12 {
13     m_thFlag = false;
14     this->wait();
15     this->quit();
16 }
17 
18 void ThSpectrum::setImg(QImage *in_img)
19 {
20     m_img = in_img;
21 }
22 
23 void ThSpectrum::run()
24 {
25     QPainter in_painter;
26 
27     m_currentTime.start();
28 
29     while (m_thFlag)
30     {
31         if (nullptr==m_img)
32         {
33             QThread::msleep(1);
34         }
35 
36         QImage in_img = *m_img;
37         in_img.fill(Qt::black);
38 
39         in_painter.begin(&in_img);
40 
41         int in_pointsNum = 200;
42         qreal in_offsetVal = 0;
43         qreal in_stepVal = in_img.width()*1.0 / in_pointsNum;
44 
45         QPolygonF in_polygon;
46         in_offsetVal = in_img.height()/2;
47         int in_realRange = 20;
48         in_offsetVal -= in_realRange/2;
49 
50         for (qreal in_wVal = 0; in_wVal<in_img.width(); )
51         {
52             // 随机产生频谱数据
53             //auto in_hVal = qrand()%in_realRange;
54             // 正弦函数
55             auto m_period = 20;  //周期
56             auto m_radius = qrand()%in_realRange; // 振幅
57             double in_angle = (double) in_wVal / m_period * 2 * 3.1415926;
58             double in_hVal = m_radius * sin(in_angle);
59             in_hVal += in_offsetVal;
60             in_polygon << QPointF(in_wVal, in_hVal);
61 
62             in_wVal += in_stepVal;
63         }
64 
65         in_painter.setPen(QColor("#1F94A1"));
66         in_painter.drawPolyline(in_polygon);
67 
68         in_painter.end();
69 
70         if (m_currentTime.elapsed()>20)
71         {
72             // 通知界面刷新
73             emit sglUpUiImage(in_img);
74             // 时间间隙重置
75             m_currentTime.restart();
76         }
77         else
78         {
79             QThread::msleep(1);
80         }
81     }
82 }

附加:模拟产生数据,即一系列的点

1.老方法

qDebug()<<qrand()%10;

2. Qt5.10之后新增该类

//生成一个0和10之间的整数

qDebug()<<QRandomGenerator::global()->bounded(10); 

 //生成一个0和10.123之间的浮点数
qDebug()<<QRandomGenerator::global()->bounded(10.123);

//生成一个10和15之间的整数
qDebug()<<QRandomGenerator::global()->bounded(10, 15); 

posted @ 2023-02-24 11:50  李涛贤贤  阅读(196)  评论(0编辑  收藏  举报