1

如何有效地仅选择在当前绘图视图中可见的图形对象?

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

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

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

当然,给定 X1 和 X2 是区域的左右边缘,x1 和 x2 是每个对象的左右边缘,我们需要每个具有 x1 < X2 和 x2 > X1 的对象。

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

那么下一步是使用二分搜索在 x1 列表中找到满足 x1 < X2 条件的第一个吗?然后我们在 x2 列表中找到第一个满足 x2 > X1 的条件?

但是他们如何在不扫描每个项目的情况下找到 x1 和 x2 的交集呢?

4

1 回答 1

2

将整个区域分解为离散区域,将您的对象划分为这些区域,并仅渲染那些可见的区域。

如果他们移动,更新他们所属的区域。

于 2013-02-15T17:33:58.440 回答