【问题标题】:R-Tree construction algorithm using polygon MBR使用多边形 MBR 的 R-Tree 构造算法
【发布时间】:2018-08-10 15:16:56
【问题描述】:

当我在我的集​​合中拥有所有已知的多边形最小边界矩形 (MBR) 时,我似乎找不到任何关于如何构造 R-Tree 的文档。 R-Tree 非常适合存储这些空间参考,以消除我当前对多边形相交的蛮力检查:

for p1 in polygons: # O(n)
    for p2 in polygons: # O(n)
        if p2 is not p1: # O(1)
            if p2.intersects(p1): # O(1); computed using DeMorgans law on vertices
                # do stuff

有没有人有参考说明如何确定包含集合中多边形的 MBR 的矩形分区的方法?

【问题讨论】:

  • 与积分相同。因为在树的下一层,每个页面都是一个 MBR。
  • @Anony-Mousse 在我对下面答案的评论中,我真正的问题是确定要对哪些矩形进行分组。我无法将这个细节概念化。
  • 阅读 STR 论文。如果我没记错的话,它只是使用矩形的中心点。不过你可以查一下。

标签: algorithm binary-search-tree r-tree


【解决方案1】:

R-Tree 分区算法有很多,根据我的经验,最好的一种是 Beckmann 等人的 R*Tree (R-Star-Tree)。只需搜索"The R*-tree: an efficient and robust access method for points and rectangles"

如果你更喜欢阅读代码,还有很多开源实现,包括my own one in Java。但请注意,R*Tree 算法并非易事。

如果您正在寻找更简单的东西,请尝试四叉树或八叉树。如果插入和更新速度是重中之重,请查看PH-Tree(我自己的实现),但它也比四叉树复杂。

另一个更简单的解决方案是AABB-Tree,它类似于 R-Tree,但每个节点只有两个边界框。我认为它在计算机图形学中被大量使用,但我对它了解不多,除了它对于 R-Tree 来说相对简单。

编辑(更新以回答评论)

如果您正在寻找 STR 等批量加载策略,here 是原始论文。你可以看看我的 R-Tree 实现,因为它还提供了一个可以处理点和矩形的implementation of an STR-Loader

搜索堆栈溢出我还发现了this answer,它显然指向了一个专门用于存储矩形的替代批量加载器。

我想指出批量加载(例如 STR-Loading)是加载 R-Tree 的最快方式。但是,在我自己的实验中(参见 Figure 3 here),这仍然比好的四叉树或 PH 树慢 2-3 倍。

【讨论】:

  • 我正在寻找 R-Tree 的批量加载或打包的实现;例如 Nearest-X 或 STR,我不需要动态树。
  • 感谢您的更新。阅读提供的文件后,我想我对“页面”的构建方式感到困惑。您必须指定每个叶子的最大页数,并且每个页面都指向一个新叶子。那么在wiki为什么有些叶子只有2页而有些却有3页?
  • AABB-Tree 对我来说可能是一个好的开始。我难以概念化的问题是如何决定哪些矩形组合在一起。在 AABB-Tree 示例中,显然 1 和 3 是一起出现的,但这是如何决定的呢?
  • 在wiki示例中,2是每个页面/节点的最小条目(页面与节点相同),最大为3。如果超过3则需要拆分。如果少于 2 个(删除后),则合并。
  • 在 AABB 页面中,它说“这里使用的一种常见启发式方法是为左右节点的表面积分配一个成本,该面积已经为添加新叶子的 AABB 进行了调整,并下降到最便宜的节点的方向,直到你发现自己在一片叶子上。”。换句话说,当插入一个新元素时,您计算每个节点的 AABB 表面必须增长多少才能包含新元素。然后将元素插入到必须增长最少的节点中。
猜你喜欢
  • 2014-03-28
  • 2015-06-03
  • 2019-08-11
  • 1970-01-01
  • 2011-06-10
  • 2011-12-19
  • 1970-01-01
  • 2015-03-12
  • 1970-01-01
相关资源
最近更新 更多