难,怎样使用算法过滤图形的重叠点?

labthink 2011-12-16 09:39:37
我用MSChart,画一个折线图,现在的问题是:折线图中的数据太多(有的好几万个点),所以折线图上的点显示在屏幕上比较粗,我认为有很多重叠点造成的(可能数据不同,但是都集在一个像素中),现在想解决的是,怎么让数据少一些,折线图看上去还是一样的,谁能提供一个算法规则来过滤重叠数据?或者别的思路也可以,只要能够减少点数,并保持折线图的形状
...全文
127 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
labthink 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 qwertxp 的回复:]

你在500px宽的图形上根据1000个点和根据100个构成的曲线图有多大区别?就算每个点只用1px,你也最多需要500个点,其它的都是废的。
确保每个坐标的点是唯一的,重复点没有意义。根据时间精度来取值,画一天的曲线图,根据需求考虑精确到每小时一个点,或者每半小时一个点,每10分钟一个点。精确到分钟,精确到秒是没有意义的,曲线图看的就是个趋势,看详细记录应该出报表。
[/Quote]是啊,哥们,不同的项目有不同的要求,当然这也和业务有关,有些就是需要精确到每一个点的。我这里也是需要精确的,我只是想要最前面的那个呈现肉眼看上去一样的效果
wonder_123 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 qwertxp 的回复:]
你在500px宽的图形上根据1000个点和根据100个构成的曲线图有多大区别?就算每个点只用1px,你也最多需要500个点,其它的都是废的。
确保每个坐标的点是唯一的,重复点没有意义。根据时间精度来取值,画一天的曲线图,根据需求考虑精确到每小时一个点,或者每半小时一个点,每10分钟一个点。精确到分钟,精确到秒是没有意义的,曲线图看的就是个趋势,看详细记录应该出报表。
[/Quote]

我的是用作数据分析的,要进行缩放获取每个具体点的信息的……
qwertxp 2011-12-16
  • 打赏
  • 举报
回复
你在500px宽的图形上根据1000个点和根据100个构成的曲线图有多大区别?就算每个点只用1px,你也最多需要500个点,其它的都是废的。
确保每个坐标的点是唯一的,重复点没有意义。根据时间精度来取值,画一天的曲线图,根据需求考虑精确到每小时一个点,或者每半小时一个点,每10分钟一个点。精确到分钟,精确到秒是没有意义的,曲线图看的就是个趋势,看详细记录应该出报表。
wonder_123 2011-12-16
  • 打赏
  • 举报
回复
恩啊。如果它内部是根据你全部导入的数据来确定范围,然后再进行绘制,并提供具体点的像素坐标,那也就没有意义了。从效率上看,teechart比 mschart高一些,3W左右的数据在teechart还是可以用的,mschart就估计够呛了。渲染画面越好的,绘图也越慢。
labthink 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wonder_123 的回复:]

就是在绘图前,能不能先通过坐标转化得到该点将要显示的像素坐标? 如果没用提供,那就有点为难。
[/Quote]这个我还不太清楚,思路我倒是理解了,就是把同一像素点的数据只保留一份
wonder_123 2011-12-16
  • 打赏
  • 举报
回复
就是在绘图前,能不能先通过坐标转化得到该点将要显示的像素坐标? 如果没用提供,那就有点为难。
wonder_123 2011-12-16
  • 打赏
  • 举报
回复
这个我绘制的是 50W 到 100W 个点,但是是自己完全使用GDI+绘图。 如果没有使用反锯齿等渲染方式的话,GDI+图形绘制的基础都是基于像素,也就是整型坐标系。
我因为是自己定义的控件:就是在传入数据前就对数据进行了处理,把像素点重合的点踢掉了,这样绘图效率得以大大提升。不知道MSChart 在导出数据前能否得到数据的像素值? 只能提供这个思路,你再看看。
labthink 2011-12-16
  • 打赏
  • 举报
回复
那个重复点,作为数据来讲,基本上是不重复的,只是因为屏幕宽度有限,而数据点很多,导致可能有些点的大小我们眼睛可能看上去都一样
labthink 2011-12-16
  • 打赏
  • 举报
回复
自己顶
快溜 2011-12-16
  • 打赏
  • 举报
回复
chart控件绑定数据源的时候过滤掉重复点行不行
wonder_123 2011-12-16
  • 打赏
  • 举报
回复
回复了一次看不见?就再回复一次吧:

我定义控件时使用的思路:获取所有的数据-> 确定边界 -> 计算每个点对应的像素坐标 -> 绘制线条。

踢去点就是在确定边界并计算像素坐标时。

对于封装好的控件而言,一般都是传入点然后就将曲线绘制出来了,第三个过程不知道MSChart是否开放给了用户? 如果没有开放,直接在内部转化完了,就无法在绘制前得到像素坐标。

3w -10w 个点用 teechart 可以一试,用 mschart 太慢了。
wonder_123 2011-12-16
  • 打赏
  • 举报
回复
从原理上看,控件的内部实现也肯定是先获取数据,然后才会确定控件的逻辑值边界,再确定每个点的像素坐标的。

在自定义控件时采用的思路则为:先获取所有数据用于确定逻辑边界,然后再计算每个点的像素坐标,踢去重叠的点,再绘制非重合点序列。

估计这种封装好的控件不会提供这种功能。如果太慢,3W-10W 左右用teechart看看吧
labthink 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wonder_123 的回复:]

这个我绘制的是 50W 到 100W 个点,但是是自己完全使用GDI+绘图。 如果没有使用反锯齿等渲染方式的话,GDI+图形绘制的基础都是基于像素,也就是整型坐标系。
我因为是自己定义的控件:就是在传入数据前就对数据进行了处理,把像素点重合的点踢掉了,这样绘图效率得以大大提升。不知道MSChart 在导出数据前能否得到数据的像素值? 只能提供这个思路,你再看看。
[/Quote],看了一下,好像没找到得到像素点的方法
labthink 2011-12-16
  • 打赏
  • 举报
回复
坐等知道的朋友
xiaosun830910 2011-12-16
  • 打赏
  • 举报
回复
晕,没人再说几句了吗

4,820

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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