目录
背景
整体功能流程(逻辑)
功能展示
代码实现(平均值合并法)
小结
背景
在实际应用中,随着数据量的增加,曲线上的数据点数量也会随之增加,这可能导致曲线过于密集,从而影响用户对曲线的观测和分析。因此,我们需要实现数据点合并删除功能,通过合并相邻的数据点或者删除一些数据点,从而减少曲线上的数据点数量,保证曲线的平滑性和清晰度。
整体功能流程(逻辑)
- 添加游标
- 使用游标选择需要合并的区域
- 对该区域进行合并算法计算
- 更新曲线
功能展示
该图进行了两组游标对应两组曲线区域,合并的点数为10个点和2个点。
功能介绍:
该功能通过点击按钮生成一组随机颜色的游标,通过鼠标事件移动游标来确定要计算处理曲线数据范围,右边表格则实时记录游标的信息,记录游标的起始位置以及要合并的点数,通过合并算法对曲线进行减点操作。
我所使用的合并算法为平均合并法,通过计算需要合并N个点的平均值来替换这些点,达到减点的操作,这样会改变曲线的形状使得曲线相对平滑,减少噪声。或则可以采用删除数据点的方法达到效果,例如每两个点之间删除N个点。自己设置N的阈值。
代码实现(平均值合并法)
首先自己先设计好游标的代码,这里就不详细展示了,内容跟上一篇文章的游标代码大同小异,主要就是记录曲线的下标范围。
上一篇文章:Qt-QCustomlot图像设计功能-数据点添加
如果对设计游标还是不懂得可以参考:Qt-QCustomplot图像设计功能-游标
合并算法代码:
/*******************
* @author 范儿
* @method
* @param
* @description 合并算法计算
*******************/
void SpeciesBinning::update_curveData(int subIndex) {
try {
//建立集合存储新合并后数据
QVector<double> newXPoinList;
QVector<double> newYPoinList;
//获取游标的数量 添加了多少组 根据自己的定义获取
int indexNumber = curveList[subIndex].reducePoints.cursorPL.size();
int currentPos = 0;
//循环执行合并范围
for (int i = 0; i < indexNumber; ++i) {
//获取游标区间和合并的数量
int begin = curveList[subIndex].reducePoints.cursorPL[i];
int end = curveList[subIndex].reducePoints.cursorPR[i];
int num = curveList[subIndex].reducePoints.insertNumber[i];
// 添加游标区间之前的点(不进行合并的点集合)
for (int j = currentPos; j < begin; ++j) {
newXPoinList.append(tempXPoinLists[subIndex][j]);
newYPoinList.append(tempYPoinLists[subIndex][j]);
}
// 处理游标区间内的点(合并区域)
for (int j = begin; j < end; j += num) {
qreal sumX = 0; //X轴点数据之和
qreal sumY = 0; //Y轴点数据之和
int count = 0; //合并次数累计
// 计算区间内 num 个点的平均值
for (int k = 0; k < num && j + k < end; ++k) {
sumX += tempXPoinLists[subIndex][j + k];
sumY += tempYPoinLists[subIndex][j + k];
count++;
}
// 添加平均点
if (count != 0) {
double valueX = sumX / count; //计算出X轴平均值
double valueY = sumY / count; //计算出Y轴平均值
//当平均值为零或其他特殊情况时的处理
if(valueY <= 0 || valueY <= pow(10,-3)){
valueY = curveList[subIndex].replacement / curveList[subIndex].IntegrationTime / (num);
}
//将数据添加到集合中
newXPoinList.append(valueX);
newYPoinList.append(valueY);
}
}
// 更新当前位置
currentPos = end;
}
//添加最后一组区间之后的点
for (int j = currentPos; j < tempXPoinLists[subIndex].size(); ++j) {
newXPoinList.append(tempXPoinLists[subIndex][j]);
newYPoinList.append(tempYPoinLists[subIndex][j]);
}
} catch (...) {
FERROR("数据计算更新异常!");
}
}
将方法放在鼠标释放事件方法中调用然后执行曲线更新数据即可!
以上代码展示了一个合并算法的实现。
在代码中,通过循环遍历游标区间,计算区间内数据点的平均值并添加到新集合中,最终更新数据列表以实现数据点的合并删除。该方法可以有效地减少数据点数量,保持曲线的趋势,并提升用户体验。
小结
总的来说,本文介绍了一种在Qt中实现数据点合并删除功能的方法,通过取N个数据点的平均值来替换这N个点,从而优化曲线的显示效果。
通过本文的内容,读者可以了解如何利用这一合并算法来优化曲线数据的显示效果,同时也可以根据自身需求进行适当的调整和扩展。希望本文对读者有所启发,欢迎读者在实际项目中应用这一方法,提升曲线显示效果。感谢您的阅读!
下一篇内容关于曲线的点拖动、局部拖动以及整体拖动!