查找包含点高效算法的矩形

时间:2012-04-22 15:20:54

标签: algorithm computational-geometry

下午好。

我的情况:

  • 二维空间
  • 输入:一组矩形重叠矩形)。
    • 矩形坐标为整数类型
    • 矩形大小和矩形位置没有任何限制(只有整数范围)。
    • 没有矩形的宽度= 0或高度= 0.
  • 我需要找到:包含输入的(带有整数坐标)的所有矩形。

Find rectangles that contain entered point.

问题:

  • 保持矩形的有效结构是什么?
  • 在这种情况下,哪种算法有效?
    • 什么算法只能在不删除的情况下添加矩形?

谢谢: - )。

5 个答案:

答案 0 :(得分:18)

R-Tree是适用于此用例的最佳数据结构。 R-tree是用于空间访问方法的树数据结构,即用于索引多维信息(如地理坐标),矩形或多边形。所有矩形的信息都可以以树形式存储,因此搜索很容易

Wikipedia页面,short pptresearch paper将帮助您理解这一概念。

enter image description here

答案 1 :(得分:3)

在java中,您可以使用shape.contains

但一般来说,假设一个矩形由(x,y,width,height)定义,你可以

if(pt.x> = x&& pt.x< = x + width&& pt.y> = y&& pt.y< = y + height) ...

如果您在集合中拥有所有矩形,则可以遍历集合并找到包含该点的那些矩形

答案 2 :(得分:2)

如果(left, top, right, bottom) (x, y),则矩形left < x < right包含一个点top < y < bottom(假设坐标向下增加,大多数情况就是如此)我见过的硬件;如果你的坐标向上增加,传统的数学案例就越多,交换topbottom)。你不会比测试更有效率。

如果您将矩形视为“包含”某个点(如果它位于边框上),则将所有<替换为<=

关于如何处理矩形的集合......我不知道。我认为根据角落的坐标排序的列表会有所作为,但我并没有真正看到它的好处...最多,你会削减你的东西列表,平均检查一半(最坏的情况仍然需要检查一切)。整个疯狂的一半仍然可以是一大堆。 :)

答案 3 :(得分:2)

看起来您的矩形集可能是动态的(“......用于添加矩形......”)。在这种情况下 - 2D Interval tree可能是解决方案。

答案 4 :(得分:1)

这是一个简单的解决方案。

  1. 在您的飞机上定义网格。
  2. 每个单元格都有两个列表:完全覆盖此单元格的矩形和部分覆盖此单元格的矩形。
  3. 在每次插入时,将目标矩形的ID放入所有涉及的单元格列表中。
  4. 在每个查询中,找到包含目标点的单元格,输出完整封面列表并在部分封面列表上运行扫描。