Qt-QCustomlot图像设计功能-数据点合并删除

目录

背景

整体功能流程(逻辑)

功能展示

代码实现(平均值合并法)

小结


背景

        在实际应用中,随着数据量的增加,曲线上的数据点数量也会随之增加,这可能导致曲线过于密集,从而影响用户对曲线的观测和分析。因此,我们需要实现数据点合并删除功能,通过合并相邻的数据点或者删除一些数据点,从而减少曲线上的数据点数量,保证曲线的平滑性和清晰度。

整体功能流程(逻辑)

  • 添加游标
  • 使用游标选择需要合并的区域
  • 对该区域进行合并算法计算
  • 更新曲线

功能展示

        该图进行了两组游标对应两组曲线区域,合并的点数为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个点,从而优化曲线的显示效果。

通过本文的内容,读者可以了解如何利用这一合并算法来优化曲线数据的显示效果,同时也可以根据自身需求进行适当的调整和扩展。希望本文对读者有所启发,欢迎读者在实际项目中应用这一方法,提升曲线显示效果。感谢您的阅读!

下一篇内容关于曲线的点拖动、局部拖动以及整体拖动!

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值