【问题标题】:Area of intersection of axis-aligned rectangles轴对齐矩形的交点面积
【发布时间】:2011-03-28 14:27:11
【问题描述】:
  • 每个矩形由 4 个双精度体组成,如下所示:(x0,y0,x1,y1)

  • 边缘平行于 x 和 y 轴

  • 它们是随机放置的——它们可能在边缘接触、重叠或没有任何接触

我需要找到由它们重叠形成的区域 - 画布中多个矩形“覆盖”的所有区域(例如,两个矩形,它将是交叉点)

我知道我需要使用扫线算法。我必须使用树结构吗?使用扫描线算法解决这个问题的最简单方法是什么?

【问题讨论】:

标签: algorithm computational-geometry


【解决方案1】:

乍一看,O(n^2) 算法似乎应该很简单,因为我们可以检查所有成对的点。但是,这会产生重复计算的问题,因为 3 个矩形中的所有点都会被计算 3 次!在意识到这一点之后,O(n^2) 算法现在对我来说看起来还不错。如果你能想到一个简单的 O(n^2) 算法,请发帖。

这是一个 O(n^2 log^2 n) 算法。

数据结构:Point (p) {x_value, isBegin, isEnd, y_low, y_high, rectid}

[对于每个点,我们有一个 x_value,两个 y_value,以及该点来自的矩形的 ID]

  1. 给定n个矩形,首先使用矩形的x_left和x_right值创建2n个点。

  2. 创建一个点列表,并按 x_value 对其进行排序。这需要 O(n log n) 时间

  3. 从左侧开始(索引 0),看到起点时使用地图放置,看到终点时使用地图移除。

换句话说:

Map m = new HashMap();  // rectangles overlapping in x-axis
for (Point p in the sorted list) {
    if (p.isBegin()) {
        m.put(p);  // m is keyed off of rectangle id
        if (s.size() >= 2) {
            checkOverlappingRectangles(m.values())
        }
    } else {
        m.remove(p);  // So, this takes O(log n) time
    }
}

接下来,我们需要一个接收矩形列表的函数,知道所有矩形都有重叠的 x 轴,但在 y 轴上可能重叠也可能不重叠。这其实和这个算法是一样的,我们只是使用横向数据结构,因为我们现在对y轴感兴趣。

【讨论】:

  • 乔希,感谢您的回答。你能解释一下什么是映射,如何使用映射。你用哪种语言编写了代码?
  • @mauricio 我刚刚使用了 Java 中的内置地图结构。 TreeMap 是另一种选择,我相信它是一种红黑树的实现,并且支持 O(log n) 的插入、搜索和删除操作。
猜你喜欢
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 2015-05-07
  • 2012-07-25
  • 1970-01-01
  • 2018-11-21
  • 1970-01-01
  • 2010-10-11
相关资源
最近更新 更多