refactor(*):03LaserCut_V00.00.01,Spark100项目发货前功能提取

This commit is contained in:
adminwu
2024-03-14 14:21:18 +08:00
parent 1dda4f24ad
commit d045ed5fd8
46 changed files with 3457 additions and 938 deletions

817
device/rms_dll.cpp Normal file
View File

@@ -0,0 +1,817 @@
#include "rms_dll.h"
#include "QString"
#define SIZE 15 //迭代次数
#define MATSIZE 201 //总宽高
#define EDGE 40 //边
#define HALFMATSIZE 101
#include <QFile>
#include <QFileDialog>
#include <QPainter>
double biggest;
double smallest;
QImage image(450, 450, QImage::Format_RGB32); // 创建一个450x400的QImage对象
QImage imageRGB(MATSIZE,MATSIZE,QImage::Format_RGB32);
QImage imageRGBS(242,242,QImage::Format_RGB32);
int bos = 60;
RMS_Dll::RMS_Dll()
{
_Socket = new QTcpSocket();
}
RMS_Dll::add(int a, int b)
{
return a+b;
}
//实现接口连接探头,返回是否连接成功
bool RMS_Dll::RMS_Connect(QString IP, quint16 Port)
{
//return 1;
bool ret = false;
//取消已有的连接
_Socket->abort();
//连接服务器
_Socket->connectToHost(IP, Port);
bool isconnect = _Socket->waitForConnected();//等待直到连接成功
//如果连接成功
if (isconnect)
{
ret = true;
//接收缓冲区(服务器)信息
//connect(_Socket, &QTcpSocket::readyRead, this, &TCPIPClient::ReadData);
}
return ret;
}
void RMS_Dll::RMS_Disconnect()
{
_Socket->disconnectFromHost();
}
bool RMS_Dll::RMS_Read_Empty()
{
dataInsert.clear();
x.clear();
biggest = 0;
smallest = 0;
ave = 0;
modeImage = 0;
stdDev = 0;
image.fill(0);
imageRGB.fill(0);
imageRGBS.fill(0);
QString Cmd = "EQINT,\rMRPMS,1,\r\n";
bool ret = false;
QByteArray data = Cmd.toLatin1();
_Socket->write(data);
//判断是否写入成功
bool isWrite = _Socket->waitForBytesWritten();
if (isWrite)
{
//写入成功
ret = true;
}else
{
return 0;
}
if(ret == true)
{
QString Str;
bool isRead = _Socket->waitForReadyRead();
if(isRead)
{
QByteArray Buff = _Socket->readAll();
if (!Buff.isEmpty())
{
Str = QString(Buff);
}
}
return 1;
}else
{
return 0;
}
}
double RMS_Dll::RMS_Read_Single()
{
QString Cmd = "EQINT,\rMRPMS,1,\r\n";
bool ret = false;
QByteArray data = Cmd.toLatin1();
_Socket->write(data);
//判断是否写入成功
bool isWrite = _Socket->waitForBytesWritten();
if (isWrite)
{
//写入成功
ret = true;
}else
{
return 0;
}
if(ret == true)
{
QString Str;
bool isRead = _Socket->waitForReadyRead();
if(isRead)
{
QByteArray Buff = _Socket->readAll();
if (!Buff.isEmpty())
{
Str = QString(Buff);
}
}
Str.chop(3);
int StartIndex = Str.lastIndexOf(",");
int StopIndex = Str.count() - 1;
QString DisPlayStr = Str.mid(StartIndex + 1, StopIndex);
return DisPlayStr.toDouble();
}
}
//实现接口进行读取,并返回是否读取成功
bool RMS_Dll::RMS_Read(int cx, int cy)
{
QString Cmd = "EQINT,\rMRPMS,1,\r\n";
bool ret = false;
QByteArray data = Cmd.toLatin1();
_Socket->write(data);
//判断是否写入成功
bool isWrite = _Socket->waitForBytesWritten();
if (isWrite)
{
//写入成功
ret = true;
}else
{
return 0;
}
if(ret == true)
{
QString Str;
bool isRead = _Socket->waitForReadyRead();
if(isRead)
{
QByteArray Buff = _Socket->readAll();
if (!Buff.isEmpty())
{
Str = QString(Buff);
}
}
Str.chop(3);
int StartIndex = Str.lastIndexOf(",");
int StopIndex = Str.count() - 1;
QString DisPlayStr = Str.mid(StartIndex + 1, StopIndex);
double A;
A = DisPlayStr.toDouble();
//存储所有点
x.append(A);///QVector<double> x;
QStringList fields;
fields.append("1");
fields.append(QString::number(cx,10));
fields.append(QString::number(cy,10));
fields.append(DisPlayStr);
dataInsert.append(fields);
return 1;
}else
{
return 0;
}
}
//所有点读取完成,调用此接口,进行最大最小值计算并返回
void RMS_Dll::RMS_ACQ(double *max,double *min,double *med,double *mode)
{
auto max1 = std::max_element(std::begin(x), std::end(x));//最小值表示
auto min1 = std::min_element(std::begin(x), std::end(x));//直接赋值表示
*max = *max1;
*min = *min1;
int size = x.size();
std::sort(x.begin(), x.end()); // 对QVector进行排序
if (size % 2 == 0)
{
*med = (x[size / 2 - 1] + x[size / 2]) / 2; // 如果QVector长度为偶数则返回中间两个数的平均值
} else {
*med = x[size / 2]; // 如果QVector长度为奇数则返回中间的数
}
QMap<double, int> countMap;
int maxCount = 0;
// 统计每个元素出现的次数
for (int i = 0; i < x.size(); i++) {
double key = x.at(i);
if (countMap.contains(key)) {
countMap[key]++;
} else {
countMap.insert(key, 1);
}
}
// 找出出现次数最多的元素
QMapIterator<double, int> iter(countMap);
while (iter.hasNext()) {
iter.next();
if (iter.value() > maxCount) {
maxCount = iter.value();
*mode = iter.key();
modeImage = *mode;
}
}
return;
}
#include "cmath"
void RMS_Dll::RMS_P(double mode,double *Pt,double *Ps,double Pm,double Po)
{
double t1 = 0.59;
double t2 = 59.49;
double s1 = 1.48;
double s2 = 0.47;
*Pt = Pm*(t1*exp(t2/(mode*1000))) + Po;
*Ps = s1*(*Pt)+s2;
}
void trans(float arr[][MATSIZE][MATSIZE])//按真实值排序,范围界定真实值
{
std::vector<float> seg;
for (int i = EDGE; i < MATSIZE-EDGE; ++i)
{
for (int j = EDGE; j < MATSIZE-EDGE; ++j)
{
seg.push_back(arr[SIZE%2][i][j]);
}
}
sort(seg.begin(), seg.end());//按升序排序
#if 1
float small = (float)smallest;
float big = (float)biggest;
#else if
float small = seg[0];
float big = seg[seg.size()-1];
#endif
float eighth = (big - small)/8;
//qDebug()<< "small:"<<small<<"biggest:"<<big;
for (int ix = EDGE; ix < MATSIZE-EDGE; ix++)
{
for (int iy = EDGE; iy < MATSIZE-EDGE; iy++)
{
if (arr[SIZE%2][ix][iy] >= small && arr[SIZE%2][ix][iy]< small+eighth)
{
//qDebug() <<"blue";
imageRGB.setPixel(iy,ix,qRgb(23,8,255));
imageRGBS.setPixel((iy-40)*2,(ix-40)*2,qRgb(23,8,255));
imageRGBS.setPixel((iy-40)*2+1,(ix-40)*2,qRgb(23,8,255));
imageRGBS.setPixel((iy-40)*2,(ix-40)*2+1,qRgb(23,8,255));
imageRGBS.setPixel((iy-40)*2+1,(ix-40)*2+1,qRgb(23,8,255));
}
else if (arr[SIZE%2][ix][iy] >= small+eighth && arr[SIZE%2][ix][iy]<small+eighth*2)
{
imageRGB.setPixel(iy,ix,qRgb(80,90,255));
imageRGBS.setPixel((iy-40)*2,(ix-40)*2,qRgb(80,90,255));
imageRGBS.setPixel((iy-40)*2+1,(ix-40)*2,qRgb(80,90,255));
imageRGBS.setPixel((iy-40)*2,(ix-40)*2+1,qRgb(80,90,255));
imageRGBS.setPixel((iy-40)*2+1,(ix-40)*2+1,qRgb(80,90,255));
}
else if (arr[SIZE%2][ix][iy] >= small+eighth*2 && arr[SIZE%2][ix][iy]<small+eighth*3)
{
imageRGB.setPixel(iy,ix,qRgb(98,162,255));
imageRGBS.setPixel((iy-40)*2,(ix-40)*2,qRgb(98,162,255));
imageRGBS.setPixel((iy-40)*2+1,(ix-40)*2,qRgb(98,162,255));
imageRGBS.setPixel((iy-40)*2,(ix-40)*2+1,qRgb(98,162,255));
imageRGBS.setPixel((iy-40)*2+1,(ix-40)*2+1,qRgb(98,162,255));
}
else if (arr[SIZE%2][ix][iy] >= small+eighth*3 && arr[SIZE%2][ix][iy]<small+eighth*4)
{
imageRGB.setPixel(iy,ix,qRgb(73, 255, 173));
imageRGBS.setPixel((iy-40)*2,(ix-40)*2,qRgb(73, 255, 173));
imageRGBS.setPixel((iy-40)*2+1,(ix-40)*2,qRgb(73, 255, 173));
imageRGBS.setPixel((iy-40)*2,(ix-40)*2+1,qRgb(73, 255, 173));
imageRGBS.setPixel((iy-40)*2+1,(ix-40)*2+1,qRgb(73, 255, 173));
}
else if (arr[SIZE%2][ix][iy] >= small+eighth*4 && arr[SIZE%2][ix][iy]<small+eighth*5)
{
imageRGB.setPixel(iy,ix,qRgb(177, 255, 70));
imageRGBS.setPixel((iy-40)*2,(ix-40)*2,qRgb(177, 255, 70));
imageRGBS.setPixel((iy-40)*2+1,(ix-40)*2,qRgb(177, 255, 70));
imageRGBS.setPixel((iy-40)*2,(ix-40)*2+1,qRgb(177, 255, 70));
imageRGBS.setPixel((iy-40)*2+1,(ix-40)*2+1,qRgb(177, 255, 70));
}
else if (arr[SIZE%2][ix][iy] >= small+eighth*5 && arr[SIZE%2][ix][iy]<small+eighth*6)
{
imageRGB.setPixel(iy,ix,qRgb(255, 208, 0));
imageRGBS.setPixel((iy-40)*2,(ix-40)*2,qRgb(255, 208, 0));
imageRGBS.setPixel((iy-40)*2+1,(ix-40)*2,qRgb(255, 208, 0));
imageRGBS.setPixel((iy-40)*2,(ix-40)*2+1,qRgb(255, 208, 0));
imageRGBS.setPixel((iy-40)*2+1,(ix-40)*2+1,qRgb(255, 208, 0));
}
else if (arr[SIZE%2][ix][iy] >= small+eighth*6 && arr[SIZE%2][ix][iy]<small+eighth*7)
{
imageRGB.setPixel(iy,ix,qRgb(255, 89, 0));
imageRGBS.setPixel((iy-40)*2,(ix-40)*2,qRgb(255, 89, 0));
imageRGBS.setPixel((iy-40)*2+1,(ix-40)*2,qRgb(255, 89, 0));
imageRGBS.setPixel((iy-40)*2,(ix-40)*2+1,qRgb(255, 89, 0));
imageRGBS.setPixel((iy-40)*2+1,(ix-40)*2+1,qRgb(255, 89, 0));
}
else// if (arr[SIZE%2][ix][iy] >= small+eighth*7 && arr[SIZE%2][ix][iy]<=big)
{
imageRGB.setPixel(iy,ix,qRgb(196, 0, 0));
imageRGBS.setPixel((iy-40)*2,(ix-40)*2,qRgb(196, 0, 0));
imageRGBS.setPixel((iy-40)*2+1,(ix-40)*2,qRgb(196, 0, 0));
imageRGBS.setPixel((iy-40)*2,(ix-40)*2+1,qRgb(196, 0, 0));
imageRGBS.setPixel((iy-40)*2+1,(ix-40)*2+1,qRgb(196, 0, 0));
}
}
}
}
//基函数
float bpline_w_f(float x)//函数返回权重W(d)
{
if (x <= 1)//x是d
{
return 2.0/3.0 - (1.0 - x/2.0)*x*x;
}
else if (x > 1 && x <= 2)
{
return (2.0 - x) * (2.0 - x) * (2.0 - x) / 6.0;
}
return 0.0;
}
//计算权重系数
void cal_bpline_coeff(float x, float y, float* coeff)//旧float传入
{
float u = x - floor(x) + 1;//留小数部分+1
float v = y - floor(y) + 1;
float A[4];//计算出四个绝对值4个d得出x方向权重保存在数组A
A[0] = bpline_w_f(abs(u));//传入距离,传出权重
A[1] = bpline_w_f(abs(u - 1));
A[2] = bpline_w_f(abs(u - 2));
A[3] = bpline_w_f(abs(u - 3));
for (int s = 0; s < 4; s++)
{
float C = bpline_w_f(abs(v - s));//同理计算y方向权重
coeff[s * 4] = A[0] * C;
coeff[s * 4 + 1] = A[1] * C;
coeff[s * 4 + 2] = A[2] * C;
coeff[s * 4 + 3] = A[3] * C;
}
//得到的coeff即周围16个点各自的权重x*y
}
//三次B样条插值得到加权总值//传入新转旧float得到了其周围16个点的权重进而得到加权总值
float bpline_inner(float arr[][MATSIZE][MATSIZE], int k ,float x_float, float y_float)
{
float coeff[16];
cal_bpline_coeff(x_float, y_float, coeff); //计算权重系数
float sum = 0.0;
int x0 = floor(x_float) - 1;
int y0 = floor(y_float) - 1;//向下取整再减一
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
sum += coeff[i * 4 + j] * arr[k%2][x0 + i][y0 + j];//周围16个点的权重乘以各自的值加总
}
}
return sum;//精度的核心就在于这个强转
}
float nearst_inner(float arr[][MATSIZE][MATSIZE], int k , float x_float, float y_float)
{
//若自身不是255则维持若自身是255则选取周围任意非空点
if(arr[k%2][(int)(x_float)][(int)(y_float)] != 255)
{
return arr[k%2][(int)(x_float)][(int)(y_float)];
}else
{
if(arr[k%2][(int)(x_float-1)][(int)(y_float-1)] != 255)return arr[k%2][(int)(x_float-1)][(int)(y_float-1)];
if(arr[k%2][(int)(x_float-1)][(int)(y_float)] != 255)return arr[k%2][(int)(x_float-1)][(int)(y_float)];
if(arr[k%2][(int)(x_float-1)][(int)(y_float+1)] != 255)return arr[k%2][(int)(x_float-1)][(int)(y_float+1)];
if(arr[k%2][(int)(x_float+1)][(int)(y_float-1)] != 255)return arr[k%2][(int)(x_float+1)][(int)(y_float-1)];
if(arr[k%2][(int)(x_float+1)][(int)(y_float)] != 255)return arr[k%2][(int)(x_float+1)][(int)(y_float)];
if(arr[k%2][(int)(x_float+1)][(int)(y_float+1)] != 255)return arr[k%2][(int)(x_float+1)][(int)(y_float+1)];
if(arr[k%2][(int)(x_float)][(int)(y_float-1)] != 255)return arr[k%2][(int)(x_float)][(int)(y_float-1)];
if(arr[k%2][(int)(x_float)][(int)(y_float+1)] != 255)return arr[k%2][(int)(x_float)][(int)(y_float+1)];
}
return arr[k%2][(int)(x_float)][(int)(y_float)];
}
void RMS_Dll::dotToImg()
{
/***************************************************************
* dotToImg()
dotToImg将点数据转化成热力图
* 输入:
* 无
* 输出:
* 无
* 描述:
* 根据接收到的所有电阻率点的数据进行热力图绘制数据于dataRecv中
* 逐点读取生成的热力图保存于imageRGBS
**************************************************************/
float Arr[2][MATSIZE][MATSIZE];
//-------------------把src矩阵赋给堆[0]------------------------------
int rows = dataInsert.size();///有几条QStringList即几个点
for (int x = 0; x < MATSIZE; x++)
{
for (int y = 0; y < MATSIZE; y++)
{
Arr[0][x][y] = 255;
Arr[1][x][y] = 255;
//txtOutput<< "X:"<<Arr[0][x][y]<<"y:"<<Arr[0][x][y];
}
}
for (int i = 0; i < rows; i++)///出问题的原因在于忽略了Mat的255初始化
{
int num1,num2;
//对坐标进行缩放
if(bos == 60)
{
num1 = (int)(dataInsert[i][1].toFloat()+HALFMATSIZE);
num2 = (int)(dataInsert[i][2].toFloat()+HALFMATSIZE);
}
else if(bos == 80)
{
num1 = (int)((dataInsert[i][1].toFloat()*60/89+HALFMATSIZE));
num2 = (int)((dataInsert[i][2].toFloat()*60/89+HALFMATSIZE));
}
else if(bos == 40)
{
num1 = (int)((dataInsert[i][1].toFloat()*60/45+HALFMATSIZE));
num2 = (int)((dataInsert[i][2].toFloat()*60/45+HALFMATSIZE));
}
Arr[0][num1][num2] = (dataInsert[i][3].toFloat()*10000);
Arr[1][num1][num2] = (dataInsert[i][3].toFloat()*10000);
//Arr[0][dataInsert[i][1].toInt()+HALFMATSIZE][dataInsert[i][2].toInt()+HALFMATSIZE] = (dataInsert[i][3].toFloat()*10000);
//Arr[1][dataInsert[i][1].toInt()+HALFMATSIZE][dataInsert[i][2].toInt()+HALFMATSIZE] = (dataInsert[i][3].toFloat()*10000);
}
//-----------------------------------------------------------------
for(int k = 0;k<SIZE;k++)
{
for (int x = 5; x < MATSIZE-5; x++)
{
for (int y = 5; y < MATSIZE-5; y++)
{
if(k%2 == 0)
{
//Arr[1][x][y] = bpline_inner(Arr, k, x, y);//k是偶数则数据源为 Arr0
Arr[1][x][y] = nearst_inner(Arr, k, x, y);
//if(isnan(Arr[1][x][y]) == 1 || Arr[1][x][y]>255 || Arr[1][x][y] == 0) Arr[1][x][y] = 255;
}
else
{
//Arr[0][x][y] = bpline_inner(Arr, k, x, y);
Arr[0][x][y] = nearst_inner(Arr, k, x, y);
//if(isnan(Arr[0][x][y]) == 1 || Arr[0][x][y]>255 || Arr[0][x][y] == 0) Arr[0][x][y] = 255;
}
}
}
}
for(int k = 0;k<4;k++)
{
for (int x = 5; x < MATSIZE-5; x++)
{
for (int y = 5; y < MATSIZE-5; y++)
{
if(k%2 == 0)
{
Arr[1][x][y] = bpline_inner(Arr, k, x, y);//k是偶数则数据源为 Arr0
//if(isnan(Arr[1][x][y]) == 1 || Arr[1][x][y]>255 || Arr[1][x][y] == 0) Arr[1][x][y] = 255;
}
else
{
Arr[0][x][y] = bpline_inner(Arr, k, x, y);
//if(isnan(Arr[0][x][y]) == 1 || Arr[0][x][y]>255 || Arr[0][x][y] == 0) Arr[0][x][y] = 255;
}
}
}
}
float ary90[MATSIZE][MATSIZE];
//旋转数组
for (int i = 0; i < MATSIZE; i++)
{
for (int j = 0; j < MATSIZE; j++)
{
//ary90[j][MATSIZE - i - 1] = Arr[SIZE%2][i][j];//顺时针90度
ary90[MATSIZE - j - 1][i] = Arr[SIZE%2][i][j];//逆时针90度
}
}
for (int i = 0; i < MATSIZE; i++)
{
for (int j = 0; j < MATSIZE; j++)
{
Arr[SIZE%2][i][j] = ary90[i][j];
}
}
trans(Arr);
}
void RMS_Dll::Algo()
{
/***************************************************************
* 名称Algo()
* 功能:将热力图绘制在窗口上
* 输入:
* 无
* 输出:
* 无
* 描述:
* 根据imageRGBS进行热力图的显示并画出坐标系
*
**************************************************************/
biggest*=10000;
smallest*=10000;
//qDebug()<<biggest<<smallest;
//float multiple = (float)256/scope;//放大系数
//点值减最小值乘以放大系数
dotToImg();
//image.fill(Qt::white); // 将背景填充为白色
//背景填充
if(bos == 60)
{
QImage scaledImage = imageRGBS.scaled(242/75*86, 242/75*86, Qt::KeepAspectRatio, Qt::SmoothTransformation);
for(int x = 0;x<242/75*86;x++)
{
for(int y = 0;y<242/75*86;y++)
{
image.setPixel(x+82,y+82,scaledImage.pixel(x,y));
}
}
for(int x = 0;x < 450;x++)
{
for(int y = 0;y < 450;y++)
{
if (pow(x-210, 2) + pow(y-210, 2) <= pow(129, 2))
{
//cout << "点(" << x << "," << y << ")在圆内" << endl;
} else
{
//cout << "点(" << x << "," << y << ")不在圆内" << endl;
image.setPixel(x,y,qRgb(240,240,240));
}
}
}
}
else if(bos == 80)
{
QImage scaledImage = imageRGBS.scaled(242/75*94, 242/75*94, Qt::KeepAspectRatio, Qt::SmoothTransformation);
for(int x = 0;x<242/75*94;x++)
{
for(int y = 0;y<242/75*94;y++)
{
image.setPixel(x+70,y+70,scaledImage.pixel(x,y));
}
}
for(int x = 0;x < 450;x++)
{
for(int y = 0;y < 450;y++)
{
if (pow(x-210, 2) + pow(y-210, 2) <= pow(141, 2))
{
//cout << "点(" << x << "," << y << ")在圆内" << endl;
} else
{
//cout << "点(" << x << "," << y << ")不在圆内" << endl;
image.setPixel(x,y,qRgb(240,240,240));
}
}
}
}
else if(bos == 40)
{
QImage scaledImage = imageRGBS.scaled(242/75*94, 242/75*94, Qt::KeepAspectRatio, Qt::SmoothTransformation);
for(int x = 0;x<242/75*94;x++)
{
for(int y = 0;y<242/75*94;y++)
{
//贴图左上角
image.setPixel(x+70,y+70,scaledImage.pixel(x,y));
}
}
for(int x = 0;x < 450;x++)
{
for(int y = 0;y < 450;y++)
{
if (pow(x-210, 2) + pow(y-210, 2) <= pow(141, 2))
{
//cout << "点(" << x << "," << y << ")在圆内" << endl;
} else
{
//cout << "点(" << x << "," << y << ")不在圆内" << endl;
image.setPixel(x,y,qRgb(240,240,240));
}
}
}
}
QPainter painter(&image); // 创建一个QPainter对象用于绘制图形
painter.setRenderHint(QPainter::Antialiasing); // 设置抗锯齿
int n = 5; // 坐标范围为-n到n
int x0 = 210, y0 = 210; // 坐标原点在图像中心
int len = 160; // 坐标轴长度为180像素
int fontSize = 10; // 字体大小为12
QFont font("微软雅黑", fontSize); // 创建字体对象
QPen pen(Qt::black, 0.5); // 创建画笔对象颜色为黑色线宽为2像素
//painter.translate(width() / 2, height() / 2);
QRect rect1(50, 50, 320, 320);
painter.drawArc(rect1, 294 * 16, 312 * 16);
int interval = 15;
if(bos == 60) interval = 15;
else if(bos == 80)interval = 20;
else if(bos == 40)interval = 10;
// 绘制x轴
painter.setPen(pen);
painter.drawLine(x0 - len, y0 + len, x0 + len, y0 + len);
painter.drawLine(x0 - len, y0 - len, x0 + len, y0 - len);
painter.drawLine(x0 - len, y0, x0 + len, y0);
painter.drawLine(x0 - 64, y0 +146, x0 + 64, y0+146);
for (int i = -n; i <= n; i++) {
int x = x0 + i * len / n;
painter.drawLine(x, y0 + len, x, y0 + 5 + len);//小竖杠
painter.setFont(font);
if(i==1||i==2||i==3||i==4||i==5)painter.drawText(x-fontSize/2 - 5, y0+len+fontSize+12, QString::number(i*interval));
else if(i==-1||i==-2||i==-3||i==-4||i==-5)
painter.drawText( x-fontSize/2-10 , y0+len+fontSize+12 , QString::number(i*interval));
else painter.drawText( x-fontSize/2 , y0+len+fontSize+12 , QString::number(i*interval));
}
// 绘制y轴
painter.setPen(pen);
painter.drawLine(x0-len, y0 - len, x0-len, y0 + len);
painter.drawLine(x0+len, y0 - len, x0+len, y0 + len);
painter.drawLine(x0, y0 - len, x0, y0 + len -14);
for (int i = -n; i <= n; i++) {
int y = y0 - i * len / n;
painter.drawLine(x0-len-5, y, x0-len, y);
painter.setFont(font);
if(i == 0) painter.drawText(x0-len-22, y + fontSize / 2, QString::number(i*interval));
else if(i==1||i==2||i==3||i==4||i==5) painter.drawText(x0-len-31, y + fontSize / 2, QString::number(i*interval));
else painter.drawText(x0-len-37, y + fontSize / 2, QString::number(i*interval));
}
for(int x = 370;x < 395;x++)
{
for(int y = 0; y < 40;y++)image.setPixel(x,49+y,qRgb(196, 0, 0));
for(int y = 40; y < 80;y++)image.setPixel(x,49+y,qRgb(255, 89, 0));
for(int y = 80; y < 120;y++)image.setPixel(x,49+y,qRgb(255, 208, 0));
for(int y = 120; y < 160;y++)image.setPixel(x,49+y,qRgb(177, 255, 70));
for(int y = 160; y < 200;y++)image.setPixel(x,49+y,qRgb(73, 255, 173));
for(int y = 200; y < 240;y++)image.setPixel(x,49+y,qRgb(98,162,255));
for(int y = 240; y < 280;y++)image.setPixel(x,49+y,qRgb(80,90,255));
for(int y = 280; y < 321;y++)image.setPixel(x,49+y,qRgb(23,8,255));
}
double small = smallest/=10;
double big = biggest/=10;
double eig = (big - small)/8;
painter.drawText(400,53,QString::number(big,'f',2));
painter.drawText(400,93,QString::number(small+eig*7,'f',2));
painter.drawText(400,133,QString::number(small+eig*6,'f',2));
painter.drawText(400,173,QString::number(small+eig*5,'f',2));
painter.drawText(400,213,QString::number(small+eig*4,'f',2));
painter.drawText(400,253,QString::number(small+eig*3,'f',2));
painter.drawText(400,293,QString::number(small+eig*2,'f',2));
painter.drawText(400,333,QString::number(small+eig,'f',2));
painter.drawText(400,373,QString::number(small,'f',2));
painter.drawText(50,420,"平均数:"+QString::number(ave*1000,'f',2));
painter.drawText(170,420,"众数:"+QString::number(modeImage*1000,'f',2));
painter.drawText(290,420,"标准差:"+QString::number(stdDev,'f',4));
//image
}
double calculate_mean(const QVector<double>& data)
{
double sum = 0.0;
for (double value : data) {
sum += value;
}
return sum / data.size();
}
double calculate_standard_deviation(const QVector<double>& data)
{
if (data.size() < 2) {
return 0; // 如果数据点少于两个,则标准差为 0
}
double mean = calculate_mean(data);
double variance = 0.0;
for (double value : data) {
variance += std::pow(value*1000 - mean*1000, 2);//为了放大标准差*1000
}
variance /= data.size();
return std::sqrt(variance);
}
QImage RMS_Dll::RMS_Image(int size)
{
// QString fileName = "D:/PYpro/002-NSC-6-230501.csv";
// QFile file(fileName); // 新建QFile对象
// if (!file.open(QFile::ReadOnly | QFile::Text))
// {
// }
// QTextStream in(&file);///文件流in
// while (!in.atEnd())
// {
// QString line = in.readLine();///一行一行的读取
// QStringList fields;
// fields.append("1");
// fields.append(line.split(","));///逗号分隔123元素
// double A = (fields.at(3)).toDouble();//获取该行第3个单元格内容
// x.append(A);///QVector<double> x;
// dataInsert.append(fields);
// }
ave = calculate_mean(x);
stdDev = calculate_standard_deviation(x);
bos = size;
auto max = std::max_element(std::begin(x), std::end(x));//最小值表示
auto min = std::min_element(std::begin(x), std::end(x));//直接赋值表示
biggest = *max;
smallest = *min;
Algo();
//file.close();
return image;
}