我正在为我的数字万用表开发一个可视化的数据记录器,它将每个测量值写入RS232接口。在那里,我连接了一个很小的3.6并收集了数据点。对于每个点,我都有时间戳和测量值。我将收集10.000个读数。我想以两种方式在显示器(800x480)上显示测量数据。首先是滚动图,它从右向左滚动,显示最后一分钟左右。这工作得很好。
其次,我希望显示所有收集到的总测量值(max10k点)。所以我必须收缩或压缩数据,但我想保留曲线的形状。为了让你知道它应该是什么样子,请在YT (https://youtu.be/SObqPuUozNo)观看来自Dave on EEV的视频,并跳到41:20。在那里,你可以看到另一个数字万用表是如何缩小输入数据并显示它的。在大约1:01:05,10k测量值显示在仅400px宽的显示区域上。
问题是,这是如何做到的?我听说过Douglas-Pucker算法,但不知道这是不是正确的方法,以及如何在Arduino/ Teensy平台上使用它。
非常欢迎您的帮助,谢谢您……
发布于 2018-03-28 12:18:50
我不能只显示所有数据点,因为我使用FT81x作为显示控制器,而且每帧最多只能使用2000个绘制命令。这需要更多的时间。
不管怎样,我用简单的方法解决了这个问题。
我创建了bin,并计算了这个bin中的最小值和最大值。然后简单地在这些点之间画一条线。工作正常!
顺便说一句,我是TO :-)
发布于 2018-03-28 16:54:13
对于在x
轴上获得的样本比像素多得多的情况,而不是像LineTo
那样的图形,请使用垂直线图形。
因此,根据每个渲染时间帧的采样数量和x
分辨率,您应该计算eaxch x
和渲染垂直线的ymin
和ymax
。
类似于:
xs=800;
for (x0=x,i=sample_left,y0=y1=sample[i],i<sample_right;i++)
{
x = (i-sample_left)*xs/(sample_right-sample_left);
y = sample[i]; // here add y scaling and offset
if (x0!=x) { line(x0,y0,x0,y1); x0=x; y0=y; y1=y; }
if (y0>y) y0=y;
if (y1<y) y1=y;
}
其中sample[]
是存储值,sample_left,sample_right
是要渲染的范围,xs
是图x分辨率。为了加快速度,你可以为每个x
预先计算y0,y1
并渲染它(仅在范围或样本改变时重新计算) ...因此,正如您所看到的,您将只使用dbe行命令,这些命令应该足够快地转换xs
。如果您将其重写为integer DDA样式,则可以在不进行乘法和除法的情况下完成x
线性插值...
您可能会对以下QA感兴趣:
笔记
再看一眼,被删除的答案采用了同样的方法(可能是在编辑之前通过审查删除的),所以我投票支持恢复删除,即使它的质量比我的低得多,但发布得更快。
https://stackoverflow.com/questions/49523088
复制相似问题