2013-02-15 68 views
1

如何高效地选择在当前图纸视图中可见的图形对象?如何高效地在当前图形区域绘制可见对象?

我正在使用一个开源图表库ZegGraph来绘制数十亿个对象。 ZedGraph中的设计是循环遍历每个对象,并计算它是否在当前缩放视图中可见,并给出左上角以及对象的高度和宽度。对于成千上万的项目来说这样很好,但数百万人却变得很慢。现在我们拥有超过PC内存的数十亿项,因此我们将它们缓存到磁盘。当然,这是通过磁盘遍历它们来发现当前视图中的一小部分,这是不可想象的。

一个有用的约束是对象都具有足够接近的垂直坐标,以便如果它们水平可见,那么它们有90%的机会可见。这意味着该算法可以简单地根据左右边缘找到对象,而不管是否与可见区域重叠。

我的第一个想法是让它们按左角的X坐标排序。但是,物体可以具有不同的宽度,它们可以大于可见区域,因此左角可能不在屏幕上,但物体仍可能部分可见。

当然,由于X1和X2是区域的左右边缘,x1和x2是每个物体的左右边缘,我们需要每个物体都有x1和x2> X1。

到目前为止,似乎我们以某种方式保留了所有x1(左边缘)与对象引用的缩略列表。还有一个有关每个对象的引用的所有x2(右边缘)的排序列表。

那么下一步是在x1列表中找到第一个满足x1 < X2条件的二进制搜索?那么我们发现x2列表中的第一个满足x2> X1条件?

但是他们如何找到x1和x2的交叉点而不扫描每个项目?

+0

跟进。 X坐标是时间。数据可能包含许多范围和对象的浓度,例如10年的对象每隔几秒到1个月出现数毫米的对象。所以根据Karthik关于离散区域的想法。也许我们需要嵌套的基于时间的区域来组织月份,日期和小时的对象。所以如果我们放大到只看几个小时,我们可以快速跳到这些离散的区域。 – Wayne 2013-02-15 17:44:40

回答

2

将整个区域分解成不连续的区域,将您的对象分成这些区域,并只渲染那些可见的区域。

更新它们所属的区域(如果它们移动的话)。

+0

有趣。我很好奇。这个想法离你的头顶还有天才吗?或者这是这种类型的问题的标准或通用算法?我想知道如何处理与多个离散区域重叠的对象?我想我们将它添加到每个区域? – Wayne 2013-02-15 17:38:55

+0

@Wayne在我头顶,但我相信有几种解决方案非常相似..也许我受到了这些影响。无论如何,你可以肯定地添加到多个区域。 – 2013-02-15 17:43:37

+0

你知道,我现在将其视为与二分搜索相同的精神分而治之。谢谢。这是我需要的创意果汁。 – Wayne 2013-02-15 17:51:39

相关问题