如何有效地仅在当前图形区域中绘制可见对象
本文关键字:区域 绘制 对象 图形 有效地 | 更新日期: 2023-09-27 17:59:39
如何有效地仅选择在当前工程视图中可见的图形对象?
我正在使用一个开源的图表库ZegGraph,用于绘制数十亿个对象的图形。ZedGraph中的设计是遍历每个对象,并计算在给定对象的左上角以及高度和宽度的情况下,它在当前缩放视图中是否可见。这对成千上万的商品来说是好的,但对数百万的商品来说却很慢。现在,我们有数十亿个项目超过了PC内存,所以我们将它们缓存到磁盘上。当然,这使得从磁盘中循环浏览它们,只找到当前视图中的少数几个,这是不可想象的。
一个有用的约束是,所有对象的垂直坐标都足够近,因此如果它们在水平方向上可见,那么它们有90%的机会出现在视图中。这意味着该算法可以简单地根据物体的左右边缘是否与可见区域重叠来找到物体。
我的第一个想法是按照左角的X坐标对它们进行排序。然而,对象可以具有不同的宽度,它们可以大于可见区域,因此左角可能不在屏幕上,但对象可能仍然部分可见。
当然,给定X1和X2是区域的左边缘和右边缘,并且X1和X2是每个对象的左边缘或右边缘,我们需要每个对象具有X1<X2和X2>X1。
到目前为止,我们似乎以某种方式保留了所有引用对象的x1(左边缘)的短列表。还有一个所有x2(右边缘)的排序列表,其中包含对每个对象的引用。
因此,下一步是在x1列表上找到满足x1<X2条件使用二进制搜索?然后我们发现x2列表上的第一个满足x2>X1条件?
但是,他们如何在不扫描每一项的情况下找到x1和x2的交点?
将整个区域分解为离散区域,将对象划分为这些区域,并仅渲染可见的区域。
如果它们移动,则更新它们所属的区域。