2025-03-31T17:24:46

This commit is contained in:
yuntang 2025-03-31 17:24:48 +08:00
parent e4f3cc75f3
commit 8f1d0427d3
6 changed files with 26805 additions and 34 deletions

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

View File

@ -1,9 +1,9 @@
#include <QDebug>
#include "peakpoint.h"
#include "logger.h"
QVector<FileManager::ExperimentData>PeakPoint:: _dataVtr;
float PeakPoint::_leftPointX,PeakPoint::_rightPointX;
QPointF PeakPoint::_peakPoint;
QPointF PeakPoint::_leftSelectedPoint,PeakPoint::_rightSelectedPoint;
@ -21,42 +21,52 @@ QPointF PeakPoint::findPeakPoint(){
QPointF uniquePeak;
// 初始化为 float 类型能表示的最小负数,确保能处理负数 y 值
float maxY = 0.0;
bool findFlag = false;
float maxY = -std::numeric_limits<float>::infinity();
bool isPeak = false;
#if 1
// 直接在遍历过程中找出最大波峰
for (int i = 1; i < n - 1; ++i) {
for (int i = 10; i < n - 10; ++i) { // 从第11个点开始到倒数第11个点结束
const float currentX = _dataVtr.at(i).sampleTemp;
const float currentY = _dataVtr.at(i).dsc;
if(currentX < _leftPointX){
if (currentX < _leftSelectedPoint.x()) {
continue;
}
if(currentX > _rightPointX){
if (currentX > _rightSelectedPoint.x()) {
break;
}
const float preY = _dataVtr.at(i - 1).dsc;
const float lastY = _dataVtr.at(i + 1).dsc;
bool isPeak = true;
// 比较当前点与前后10个点的y值
for (int j = 1; j <= 10; ++j) {
const float preY = _dataVtr.at(i - j).dsc;
const float lastY = _dataVtr.at(i + j).dsc;
findFlag = false;
if(currentY >= preY && currentY >= lastY){
findFlag = true;
}else if(currentY <= preY && currentY <= lastY){
findFlag = true;
}
if(findFlag){
float absY = std::abs(currentY);
if(absY >= maxY){
maxY = absY;
uniquePeak = QPointF(currentX,currentY);
if (currentY < preY || currentY < lastY) {
isPeak = false;
break;
}
}
if(isPeak){
#if 1
float absY = std::abs(currentY);
if(absY > maxY){
maxY = absY;
uniquePeak = QPointF(currentX,currentY);
// logde<<"preY:"<<preY<<",lastY:"<<lastY;
}
#endif
}
}
#endif
_peakPoint = uniquePeak;
logde<<"peakPoint:"<<_peakPoint.x()<<","<<_peakPoint.y();
return uniquePeak;
}
@ -72,7 +82,7 @@ QPair<QPointF, QPointF> PeakPoint::calculateMaxDiffPointDetail(
const float currentY = _dataVtr.at(i).dsc;
if(type == MaxDiffPointDetailType::Left){
if(currentX <= _leftPointX){
if(currentX <= _leftSelectedPoint.x()){
continue;
}
if(currentX >= _peakPoint.x()){
@ -82,7 +92,7 @@ QPair<QPointF, QPointF> PeakPoint::calculateMaxDiffPointDetail(
if(currentX <= _peakPoint.x()){
continue;
}
if(currentX >= _rightPointX){
if(currentX >= _rightSelectedPoint.x()){
break;
}
}
@ -162,17 +172,14 @@ QPointF PeakPoint::findClosestPointByX(float x) {
void PeakPoint::setRegionPointX(const float left, const float right)
{
_leftPointX = left;
_rightPointX = right;
_leftSelectedPoint = findClosestPointByX(_leftPointX);
_rightSelectedPoint = findClosestPointByX(_rightPointX);
_leftSelectedPoint = findClosestPointByX(left);
_rightSelectedPoint = findClosestPointByX(right);
findPeakPoint();
updateStartEndPoint();
qDebug()<<"left,right point:"<<_leftSelectedPoint
qDebug()<<"left,right select point:"<<_leftSelectedPoint
<<","<<_rightSelectedPoint;
}
@ -197,8 +204,10 @@ double PeakPoint::calculateArea() {
<<QString::number(point.y(),'f',3);
}
#endif
#if 0
qDebug()<<QString::number(points.at(0).x(),'f',3)<<","<<
QString::number(points.at(points.size() - 1).x(),'f',3);
#endif
//calculate Area
float integral = 0.0;
@ -260,6 +269,9 @@ QPair<QPointF, QPointF> PeakPoint::calculateStartAndEndPoint()
QPair<QPointF,QPointF> leftMaxDiffPointPair = PeakPoint::calculateMaxDiffPointLeft();
QPair<QPointF,QPointF> rightMaxDiffPointPair = PeakPoint::calculateMaxDiffPointRight();
logde<<"b1:"<<leftMaxDiffPointPair.first.x()<<","<<leftMaxDiffPointPair.first.y();
logde<<"b2:"<<leftMaxDiffPointPair.second.x()<<","<<leftMaxDiffPointPair.second.y();
QPointF startPoint = calculateIntersection(_leftSelectedPoint,_rightSelectedPoint,
leftMaxDiffPointPair.first,leftMaxDiffPointPair.second);
@ -299,10 +311,10 @@ QString PeakPoint::textFormat(const float enthalpyValue,
"峰值:%2℃ \n"
"起始点:%3℃ \n"
"终止点:%4℃"
).arg(QString::number(enthalpyValue, 'f', 2))
.arg(QString::number(peakValue, 'f', 2))
.arg(QString::number(startPoint, 'f', 2))
.arg(QString::number(endPoint, 'f', 2));
).arg(QString::number(enthalpyValue, 'f', 3))
.arg(QString::number(peakValue, 'f', 3))
.arg(QString::number(startPoint, 'f', 3))
.arg(QString::number(endPoint, 'f', 3));
}
// 计算两条直线的交点

View File

@ -34,7 +34,6 @@ QPointF findClosestPointByX(float target);
QVector<QPointF> getPeakPointGroup();
extern QVector<FileManager::ExperimentData> _dataVtr;
extern float _leftPointX,_rightPointX;
extern QPointF _peakPoint;
extern QPointF _leftSelectedPoint,_rightSelectedPoint;
}

View File

@ -129,6 +129,7 @@ void CentralWidget::slotRecvCommonData(const CommonData &cd)
_customPlot->graph(0)->addData(cd.sample_temp, cd.dsc); // 添加数据到曲线
_customPlot->replot();
_customPlot->rescaleAxes();
//
FileManager::writeExperimentFile(cd);
}
@ -160,7 +161,7 @@ void CentralWidget::slotRecvAnalysisFileName(const QString &fileName)
_customPlot->yAxis->setLabel("DSC/mW");
_customPlot->xAxis->setLabel("Temp/℃");
// 设置坐标轴范围,以便我们可以看到全部数据
_customPlot->xAxis->setRange(0, 400);
_customPlot->xAxis->setRange(0, 500);
_customPlot->yAxis->setRange(-20, 20);
QVector<double> xVtr, yVtr;