数组中有几百万个点, 连成曲线绘图,要放大、缩放,如何能提高绘图速度?????,对于常规分辨率下的曲线显示,当点数远远超过分辨率像素时,有很多曲线点是完全无法表达出来的。如果全都绘制出来会很慢,能不能取大量数据点中的特征点绘制,原则是尽量不影响曲线的大致形状。怎么实现啊?前提是还不能影响我的放大、缩小曲线功能!!!!!!!!!!!!!!!最好有具体的代码谢谢了

解决方案 »

  1.   

    只有在内存中操作是最快的,至于几百万个点,我没有敢想会是个什么情况,不过可以给你个内存中绘图再显式大图片上的例子,兴许对你有帮助:
    http://download.csdn.net/detail/veron_04/2368159
      

  2.   

    vb绘几百万个点也最多也就十几秒钟,不过这几百万个点绘成的曲线挤在一屏还有什么特征可言,都成面了。
    每一次绘图应该只绘窗口能显示的点数,也即不超过窗口的ScaleWidth,至于放大缩小,只需改变ScaleWidth的值即可,用不着你处理.
      

  3.   

    1.大量增加CPU和GPU的核数;
    2.大量增加内存和显存的G数.
      

  4.   

    这么大的数据量,取特征数据是关键,而不是全画.按照LS给的数据,我考虑应该这样做.
    大约1秒1个数据,那么首先考虑横坐标的划分,横坐标以1分钟计.10个小格就是每6个数据的均值画点.
    画满大约是1000个小格就是100分钟的数据图,基本可以连贯起来,而且数据真实.如果怕数据失真,可以加入放大缩小功能.总之,画前要先自动计算屏幕需要重绘的点数,然后再求值画点,比一股脑全画上去速度高,可看性强。另外ls说到文本中的数据,处理起来就有些麻烦了,不如数据库方便。
      

  5.   

    我觉得楼主作为一个初学者就不要一下子塞太多东西.
    还是先回头去实现那个最初的目标吧:
    假设你的Picture控件宽度是1000个像素, 要如何最有效率地将百万个数据描上去?
    其实你也看出来了, 这么密集的数据, 点和点之间连不连线已经是无关紧要的事了.
    而且你肯定也发现了, 要把所有数据都画上去是没有意义的.
    所以剩下的就是如何挑选数据的事了.这个和VB也好C也好, 其实关系都不大, 纯粹是数学或思路方面的事情了.
    所以楼主可以自己解决吧.
      

  6.   

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

  7.   

    最简单的办法:定义一个值A,这个值代表物理界面上最多能显示的温度点的数量,比如1000,超过此值的话显示的相邻点已经在物理上是同一像素点了,再显示就是无意义,白费CPU与内存等硬件资源.然后绘图时,肯定会有一个显示范围,是所有数据都显示呢,还是只显示某些天之内的数据.显示范围确定后,就能得到这个范围内的原始数据数量,这里假设你要显示所有数据,就是从0到1000000.那么,由于物理界面上最多只能显示A个温度点,因此只需要每隔1000000/(1000000-A)取一个温度点显示出来就行了.这样,无论何时只有A个温度点在显示,速度无论如何也不会慢啦.
      

  8.   

    你可以做一些试验,先不要考虑效率问题1,全画出来
    2,每隔一个点画一个
    3,每隔5个点画一个
    4,每隔10个点画一个先看看这些有什么区别,自己有个清晰直观的认识然后你可以对于这些数据作一些区间分析,如果你画图的单位是twip那么差不多15个twip=1个像素,你可以看看如果前后两个点相差不足5的话就去掉?
      

  9.   

    更好的算法可求函数的导数(差商)、二阶导数(二阶差商),就怕CPU伤不起
      

  10.   

    如果不要求一次全部显示出来,就不要全部画。还有,你的这些点差距都很小,你可以选择每隔3个点甚至更多地取一个绘图点,这样100万个数据只有33万个绘图点,这样就快了。每两个绘图点之间用Line方法画线,就是用折线图代替很精确的曲线图,因为两个点之间间距小,看不出来的,既然看不出来,你画那么多也没意义。只有在放大的时候,你算好放大多少倍的时候,两个绘图点之间的差距足够远,必须要把中间省略的点绘上,你再画中间省略的点。