请问如何提高绘制散点图的效率?

haven_t 2009-06-22 07:43:44
需要用大量数据绘制散点图,因为数据分布比较集中,往往几个数据绘制在同一个点上,但却需要进行几次绘图操作,请问能否进行优化提高重绘效率呢?(因为在窗口中可能有数十个这样的散点图,如果恢复最小化的窗口时可能就会很缓慢)
当然我也想过使用bitmap来储存每个散点图,但不知道有没有方法对图像进行压缩以减少资源的占用呢?

...全文
278 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tan34035 2009-07-03
  • 打赏
  • 举报
回复
我的意思是,画图现实本身和数据独立开来,假设在512*512的空间显示(通常软件显示区位固定大小),那么就分配一个512*512的位图,对10w个点遍历(由于大小不一样可能涉及到差值或者去最邻近点),哪个位置有点就标记,很有可能很多点重复再位图的同一个位置上也没有关系,最后将位图显示出来就行了。
haven_t 2009-06-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 Mackz 的回复:]
单色位图能有多大。其实你这种方法,就是按照单色位图的结构,存储某个坐标是否有点就可以了,不压缩也无所谓。另外RLE压缩和几位几位色没有关系,因为只管二进制数据。
[/Quote]

颜色位数会对rle压缩比有影响的,假如每个像素占32位,计数用32位,重复像素超过3个就达到压缩的效果,而单色的话则需要更多的重复像素才能达到压缩效果.
haven_t 2009-06-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tan34035 的回复:]
画内存位图需要用setpixel?楼主可能没有搞明白这个东西吧,10万个点不就是对10个内存单位赋值就行了,最后画图就一次完成,效率上应该没有问题。
[/Quote]

只要内存位图放入内存DC就可以了,否则使用数组来CreateBitmap有点麻烦,因为每个数组元素存放8个像素,需要进行位运算.
另外如果数据很集中,在非常极端的情况下10万数据都相同,对散点图作一个赋值就可以了,当然实际上不大可能如此.
菜牛 2009-06-27
  • 打赏
  • 举报
回复
单色位图能有多大。其实你这种方法,就是按照单色位图的结构,存储某个坐标是否有点就可以了,不压缩也无所谓。另外RLE压缩和几位几位色没有关系,因为只管二进制数据。
tan34035 2009-06-27
  • 打赏
  • 举报
回复
画内存位图需要用setpixel?楼主可能没有搞明白这个东西吧,10万个点不就是对10个内存单位赋值就行了,最后画图就一次完成,效率上应该没有问题。
haven_t 2009-06-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 w29468 的回复:]
使用二次缓存绘图,先在内存DC中绘制好,再一次性绘制到屏幕上
[/Quote]

例如我有100万个数据,第一次绘制当然要进行100万次setpixel,其实生成的图像可能只需要10万次setpixel就完成了(因为可能有在一个同像素中多次setpixel).当引发ondraw时,还是要迭代所有的数据绘制在内存dc中.
haven_t 2009-06-26
  • 打赏
  • 举报
回复
需要补充一下,散点图需要的颜色非常少,一般用二阶位图就足够了,占用空间应该不大,我只是想更加完美,希望能控制一下资源的使用,不过二元位图的rle压缩编码似乎比8位和16位更麻烦。
haven_t 2009-06-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tkminigame 的回复:]
先对你的pixel建个树排序,这样可消除重复的点。
[/Quote]
建树的运算量不少,虽然只需要运行一次,而且空间效率未必比bitmap高。
tkminigame 2009-06-26
  • 打赏
  • 举报
回复
先对你的pixel建个树排序,这样可消除重复的点。
w29468 2009-06-23
  • 打赏
  • 举报
回复
使用二次缓存绘图,先在内存DC中绘制好,再一次性绘制到屏幕上
tkminigame 2009-06-22
  • 打赏
  • 举报
回复
bmp用rle压缩。

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧