无限图的算法

时间:2014-06-11 20:12:58

标签: c++ algorithm qt qwt

我需要实现一个“无限图”,但我不知道如何制作算法。

我在Qwt中使用Qt,我的所有点都存储在QVector<double>中;当新数据到达时,它被附加到向量的末尾。与经典图表不同,在屏幕上显示的所有数据都在某个时刻更新,无限图表理论上存储了自绘图开始以来收到的所有数据。这会产生“在曲线左侧缩小曲线”的效果,例如在此图像中: plot

但由于屏幕上没有无限像素,我无法维持点向量内的所有数据;每次新的到达时我都需要删除一个点。

但是如何以一种能产生“无限图”效果的方式呢?我想我不能只是在新数据到达时从曲线的任何部分随机删除一个点;这肯定不会产生“越来越小”的效果。

我想到了删除一个点的想法并使所有剩余的点都获得了他们所拥有的一个小值(所以当每个新数据到达时,所有已存在的点将在其x值中得到-1),但是我不确定这会奏效。有没有人有任何想法?

修改

有些用户在下面提出了一些问题,以下是我的答案:

史蒂夫:不; x轴不会不断变化,等于收到的总点数;这只是它应该是什么样子,因为它应该是一个显示所有收到的数据的图表。但屏幕尺寸有限,因此,x轴也将受到尺寸限制,因为我不假装在屏幕上可用的每个像素点数超过一个点(570,更具体)。现在有一些要点:通过说x轴将受到尺寸限制并不意味着它必然会有0-570的比例;比例值本身可能会改变,但包含要绘制的点的vectos将被修改为大小,因为我不想在嵌入式应用程序中存储100.000点向量!

quantdev:“无限图”是理论上绘制自绘图开始以来收到的所有数据的图表,与固定时间图表显示的相反(哪个图表,让我们说“在过去10秒内收到的数据”) )。但显然这是纯粹的理论,因为没有无限大小的屏幕来显示所有的点,也没有足够的内存来存储无限大小的点矢量。所以我想要的是保持最小尺寸矢量与要绘制的点(我认为它等于屏幕上的像素数)并且仍然具有无限图形效果。此外,图形必须具有附加图像上显示的效果:数据越旧,图表中的图像越小(注意:但与图像相反的位置,因为图形将从右到左)。

Tay2510:你走了!而且可以肯定的是,示波器中没有滑动效果;图形将是x轴固定的。

3 个答案:

答案 0 :(得分:2)

不要一次删除一个点。这在数学上变得相当混乱。你必须经常插值,这会导致数值精度的损失。

相反,请继续向矢量添加点,直到尺寸是您需要的尺寸的两倍。此时,平均所有点对将长度减半。即新的x[3]是旧(x[6]+x[7])/2

要绘制,请不要直接使用x[],因为您通常会有太多分数。相反,您必须在2个相邻点之间进行插值。

答案 1 :(得分:1)

  

我想我不能在新数据到达时从曲线的任何部分随机删除一个点;这当然不会创造出越来越小的&#34;效果。

这是对的。您应该采取的第一步是将X轴上的点数量的宽度增加到最大量。当您这样做时,在需要时删除与较大的Y轴之间的偏差最小的点。

这些点将在图形中创建最小量的图形变化,而具有最大偏差的点在相互推动时将更加明显。

  

我想到了删除一个点的想法并使所有剩余的点都获得了他们所拥有的一个小值(所以当每个新数据到达时,所有已存在的点将在其x值中得到-1),但是我不确定是否有效。

这会使图表向左滑动,这不是你想要的。

答案 2 :(得分:1)

这类问题的固定内存解决方案在数字荧光示波器上被打败了。

你做的是:

  1. 从图表的固定大小QImage开始,每个传入的样本都会生成一个点,每个样本都有一个 X坐标。从左到右绘制样本。无需在任何其他位置存储值:图像是您的存储空间。

  2. 当水平用尽示例空间时,请将现有图像的内容调整为其水平尺寸的一半,与左侧对齐,并清除图像的右半部分。

  3. 从中点开始绘制新的传入样本 - 覆盖图像的已清除部分。

  4. 转到2.

  5. 选项:

    • 将分割点更改为水平尺寸的一半以外的其他内容。

    • 重新绘制比例而不存储任何额外数据,但是除了计数器 - 除法计数器足以准确知道所有分割点的位置等。

    • 在步骤2中缩放图像之前,您可以在要缩放0.5倍的图像上重新缩放强度值。这样,您将为每个像素获得类似荧光的效果,其中具有重叠样本的像素更加强烈。

    • 强度缩放可以是饱和的,因此,例如,您永远不会将任何强度归零至1/255以下。这避免了像素的最终消失。事实上,您可以根据自己的喜好选择更高档的非线性和时变标量。