当前位置:编程学习 > VB >>

大量数据绘图,如何提高速度!!!!!!!!!!!!!!!!!

数组中有几百万个点, 连成曲线绘图,要放大、缩放,如何能提高绘图速度?????,对于常规分辨率下的曲线显示,当点数远远超过分辨率像素时,有很多曲线点是完全无法表达出来的。如果全都绘制出来会很慢,能不能取大量数据点中的特征点绘制,原则是尽量不影响曲线的大致形状。怎么实现啊?前提是还不能影响我的放大、缩小曲线功能!!!!!!!!!!!!!!!最好有具体的代码谢谢了 --------------------编程问答-------------------- 只有在内存中操作是最快的,至于几百万个点,我没有敢想会是个什么情况,不过可以给你个内存中绘图再显式大图片上的例子,兴许对你有帮助:
http://download.csdn.net/detail/veron_04/2368159 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- vb绘几百万个点也最多也就十几秒钟,不过这几百万个点绘成的曲线挤在一屏还有什么特征可言,都成面了。
每一次绘图应该只绘窗口能显示的点数,也即不超过窗口的ScaleWidth,至于放大缩小,只需改变ScaleWidth的值即可,用不着你处理. --------------------编程问答-------------------- 1.大量增加CPU和GPU的核数;
2.大量增加内存和显存的G数. --------------------编程问答-------------------- 另外,想在放大和缩小时不影响图像质量,得用矢量图形. --------------------编程问答-------------------- 分级显示,缩小时细节不显示,放大显示局部细节 --------------------编程问答-------------------- 哪位高手能说的具体点么?最好有代码,谢谢了.
数据如
时间(小时)  温度
0.00027778    16.381 
0.00055556    17.488 
0.00083333    19.560 
0.00111111    25.624 
0.00138889    36.682 
0.00166667    23.740 
0.00194444    16.797 
......
在文本里有百万行,怎么才能提高速度啊,绘制使屏幕分辨率有限,肯定有很多重复的点,如何才能只画不重复的点,这样就可以不改变图形的形态,但怎么实现才能速度快请高手指点

--------------------编程问答-------------------- 这么大的数据量,取特征数据是关键,而不是全画.

按照LS给的数据,我考虑应该这样做.
大约1秒1个数据,那么首先考虑横坐标的划分,横坐标以1分钟计.10个小格就是每6个数据的均值画点.
画满大约是1000个小格就是100分钟的数据图,基本可以连贯起来,而且数据真实.

如果怕数据失真,可以加入放大缩小功能.总之,画前要先自动计算屏幕需要重绘的点数,然后再求值画点,比一股脑全画上去速度高,可看性强。

另外ls说到文本中的数据,处理起来就有些麻烦了,不如数据库方便。 --------------------编程问答-------------------- 我是个初学者,希望大家指教,取特征数据最好最快的算法是什么,谢谢了?给我写的更详细点吧 --------------------编程问答-------------------- 可把数据按时间等分为若干段(段数肯定要小于能显示的点数),每一段取其平均值(或中位数)作为该段的代表(特征,不用极值,因为一段内会有很多极值),绘出曲线即可,这样可基本保留图形的特征,你大可不必纠结于图形的某些时段会出现高峰或低谷,想想谁能从几百万个点中找到高峰或低谷?即使想看更多细节也可通过放大图形得到。

图形的放大与缩小:由上面的绘制方法,只需改变段的长度(如一天改为一小时,一秒改为十分钟)即可实现图形的放大与缩小。 --------------------编程问答-------------------- 我想按温度数据的大小来找特征点,这怎么实现啊?有什么好的算法?谢谢大家指教 --------------------编程问答-------------------- 我觉得楼主作为一个初学者就不要一下子塞太多东西.
还是先回头去实现那个最初的目标吧:
假设你的Picture控件宽度是1000个像素, 要如何最有效率地将百万个数据描上去?
其实你也看出来了, 这么密集的数据, 点和点之间连不连线已经是无关紧要的事了.
而且你肯定也发现了, 要把所有数据都画上去是没有意义的.
所以剩下的就是如何挑选数据的事了.

这个和VB也好C也好, 其实关系都不大, 纯粹是数学或思路方面的事情了.
所以楼主可以自己解决吧. --------------------编程问答--------------------
引用 11 楼 phghbcs8888 的回复:
我想按温度数据的大小来找特征点,这怎么实现啊?有什么好的算法?谢谢大家指教


至于"特征点", 你把任何一个股票一年的变化曲线压到一屏显示, 还能从上面辨别出每一天的"特征"么?  更何况你的数据压缩比远大于这个. 

别人的思路不见得适合你的问题, 还是小马过河吧. --------------------编程问答-------------------- 我想用位图法实现重复数据不显示,怎么实现啊,请高手指点 --------------------编程问答--------------------
引用 14 楼 phghbcs8888 的回复:
我想用位图法实现重复数据不显示,怎么实现啊,请高手指点

你想得也太多了点,不就是一条曲线,搞得这么复杂。
1、写内存DC位图只是在机器性能的确不能满足的情况下才会考虑,重要的是算法,否则就是直接写屏也不会快。
2、关于特征,特征只是一个相对概念,拿你的温度采集数据来说,若一分钟采集一次,则这个数据就只是这一分钟的特征,若一天一次,则这个数据就是一天的特征,温度与时间本身是一个连续函数,你采集到的数据尽管间隔很小,但并不能代表就是温度变化的曲线,只能是一种近似,所以你的数据已经是温度曲线的“特征”了,你还要怎样的特征?同样的,你把现有数据任意等距拿出一部份,或者一段时间内的多个数据的平均值、中位数等,都可以作为“特征”。(注:初中数学统计:平均值、中位数、众数可以作为数据的代表
3、重复数据不显示,数据里有“重复数据”本身就是数据的一个特征,你不画,不就丢了这个特征?应该说,若一段时间内的重复数据比较多,那你就取这段时间的众数作为这段时间的“特征”就是了。

最后,人眼能看到最多不会超过屏幕的宽度,最多也就一两千个点,用效率最慢的PSet来画都已经足够了,你要做的,就是每次画图时选出这些点。 --------------------编程问答--------------------
引用 7 楼 phghbcs8888 的回复:
哪位高手能说的具体点么?最好有代码,谢谢了.
数据如
时间(小时)  温度
0.00027778    16.381 
0.00055556    17.488 
0.00083333    19.560 
0.00111111    25.624 
0.00138889    36.682 
0.00166667    23.740 
0.001944……

最简单的办法:

定义一个值A,这个值代表物理界面上最多能显示的温度点的数量,比如1000,超过此值的话显示的相邻点已经在物理上是同一像素点了,再显示就是无意义,白费CPU与内存等硬件资源.

然后绘图时,肯定会有一个显示范围,是所有数据都显示呢,还是只显示某些天之内的数据.

显示范围确定后,就能得到这个范围内的原始数据数量,这里假设你要显示所有数据,就是从0到1000000.

那么,由于物理界面上最多只能显示A个温度点,因此只需要每隔1000000/(1000000-A)取一个温度点显示出来就行了.

这样,无论何时只有A个温度点在显示,速度无论如何也不会慢啦. --------------------编程问答-------------------- 如果我的温度数据瞬时变化比较大从15一下变到120,又从120变到30,这样如何每隔多少点取就能把这种特征点漏掉,在曲线上就看不到这几个点的波动,还是要找到曲线特征点才行啊,谢谢了大家了,哪位高手再给指点一下,有更好的算法吗,我的绘图范围是所有数据都显示.请高手指点 --------------------编程问答-------------------- 你可以做一些试验,先不要考虑效率问题

1,全画出来
2,每隔一个点画一个
3,每隔5个点画一个
4,每隔10个点画一个

先看看这些有什么区别,自己有个清晰直观的认识

然后你可以对于这些数据作一些区间分析,如果你画图的单位是twip那么差不多15个twip=1个像素,你可以看看如果前后两个点相差不足5的话就去掉? --------------------编程问答-------------------- 如果我的温度数据瞬时变化比较大从15一下变到120,又从120变到30,这样如果每隔几点取一点就会把这种特征点漏掉,在曲线上就看不到这几个点的波动,还是要找到曲线特征点才行啊,谢谢了大家了,哪位高手再给指点一下,有更好的算法吗,我的绘图范围是所有数据都显示.请高手指点 --------------------编程问答-------------------- 数据可以处理后在绘制,比如连续10个数据求个平均值,作为一个有效数据。实际上很多数据处理都是如此的。 --------------------编程问答-------------------- 高手们能说的更详细一点么?我是个初学者,不好意思了。最好有详细的算法和代码 --------------------编程问答--------------------
引用 19 楼 phghbcs8888 的回复:
如果我的温度数据瞬时变化比较大从15一下变到120,又从120变到30,这样如果每隔几点取一点就会把这种特征点漏掉,在曲线上就看不到这几个点的波动,还是要找到曲线特征点才行啊,谢谢了大家了,哪位高手再给指点一下,有更好的算法吗,我的绘图范围是所有数据都显示.请高手指点

更好的算法可求函数的导数(差商)、二阶导数(二阶差商),就怕CPU伤不起 --------------------编程问答--------------------
引用 楼主 phghbcs8888 的回复:
数组中有几百万个点, ……对于常规分辨率下的曲线显示,……

假定要显示数据1百万,用于显示的区域宽度为 1000,则每列像素要表示 1000000 / 1000 = 1000 个点。
即 1 个 X 有 1000 个 Y,这样的绘图只能用统计的方式:
对这 1000 个数据分别求最大值、最小值、平均值;共 1000 组数据。

最后的绘图就是最大值、最小值、平均值 3 条曲线,每条 1000 个折点。 --------------------编程问答--------------------
引用 7 楼 phghbcs8888 的回复:
哪位高手能说的具体点么?最好有代码,谢谢了.
数据如
时间(小时)  温度
0.00027778    16.381 
0.00055556    17.488 
0.00083333    19.560 
0.00111111    25.624 
0.00138889    36.682 
0.00166667    23.740 
0.00194444    16.797 ……

如果不要求一次全部显示出来,就不要全部画。还有,你的这些点差距都很小,你可以选择每隔3个点甚至更多地取一个绘图点,这样100万个数据只有33万个绘图点,这样就快了。每两个绘图点之间用Line方法画线,就是用折线图代替很精确的曲线图,因为两个点之间间距小,看不出来的,既然看不出来,你画那么多也没意义。只有在放大的时候,你算好放大多少倍的时候,两个绘图点之间的差距足够远,必须要把中间省略的点绘上,你再画中间省略的点。
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,