我无法弄清楚如何以表演的方式实现这一点,所以我决定问你们。
我有一个矩形列表 - 实际上只有正方形,但我可能需要稍后迁移到矩形,所以让我们坚持它们并保持它更一般 - 在二维空间中。每个矩形由两个点指定,矩形可以重叠,我不太关心设置时间,因为矩形基本上是静态的,并且有一些预先计算任何设置内容的空间(如构建树,排序,预先计算其他向量,等等)。哦,如果有任何问题,我正在开发JavaScript。
对于我的实际问题:给出一个观点,我如何得到一组包含该点的所有矩形?
线性方法表现不佳。所以我寻找比O(n)更好的东西。我读了一些东西,比如在Bounding Volume Hierarchies和类似的东西上,但无论我尝试了矩形可以重叠的事实(我实际上想要得到所有这些,如果点在多个矩形内)似乎总是进入我的方式
有什么建议吗?我错过了明显的东西吗? BVH是否适用于可能重叠的边界?如果是这样,我如何构建这样一个可能重叠的树?如果没有,我还能用什么?如果边界在内部,外部或未确定,我不关心。
如果有人能提出任何有用的信息,比如链接或咆哮我是多么愚蠢,我使用BVH而不是Some_Super_Cool_Structure_Perfectly_Suited_For_My_Problem,我真的很感激!
编辑:好的,我和R-Trees玩了一下,这正是我想要的。事实上,我正在使用endy_c建议的RTree实现http://stackulator.com/rtree/。它表现得非常好,完全满足了我的要求。非常感谢你们的支持!
答案 0 :(得分:7)
答案 1 :(得分:2)
您可以将空间划分为网格,并且每个网格单元格都有一个矩形列表(或矩形标识符),这些矩形至少部分存在于该网格中。仅在相应的网格单元格中搜索矩形。复杂性应为O(sqrt(n))。
另一种方法是维护四个排序的x1,y1,x2,y2值数组,并在这4个数组中搜索你的点。每次搜索的结果是一组矩形候选,最终结果是这4组的交集。根据实现集合交集的方式,这应该比O(n)有效。