R实现重叠矩形的并集

时间:2016-07-18 20:56:59

标签: r rectangles

我正在尝试解决我有多个重叠矩形的问题,我需要找到矩形的组合区域。矩形的相交部分只需要查看一次。我在网上搜索,我发现线扫描算法对我来说非常合适,如下所述:What is an Efficient algorithm to find Area of Overlapping Rectangles

我的问题是,R是否已经实施了类似的东西?我在R中找不到类似的东西。如果它已经存在,我不想重新发明轮子。

1 个答案:

答案 0 :(得分:3)

有趣的问题。假设我们有四个矩形坐标,如下所示:

require(data.table) # v1.9.7+
dt = data.table(x0 = c(7,17,5,1),  x1 = c(14,27,11,10), 
                y0 = c(1,55,6,14), y1 = c(10,70,20,34))
dt[, id := .I] # add row numbers
#    x0 x1 y0 y1 id
# 1:  7 14  1 10  1
# 2: 17 27 55 70  2
# 3:  5 11  6 20  3
# 4:  1 10 14 34  4

要查看矩形i是否与j相交,条件IIUC为:

x0_i <= x1_j, x1_i >= x0_j, y0_i <= y1_j, y1_i >= y0_j, where

x0_i < x1_i, x0_j < x1_j, y0_i < y1_i, y0_j < y1_j

这可以通过条件连接来实现,该连接最近在data.table,v1.9.7的当前开发版本中实现。请参阅安装说明here

ans = dt[dt, 
        .(id1 = pmin(i.id, x.id), id2 = pmax(i.id, x.id), 
           x0 = pmax(x.x0, i.x0),  x1 = pmin(x.x1, i.x1), 
           y0 = pmax(x.y0, i.y0),  y1 = pmin(x.y1, i.y1)), 
        on = .(x0 <= x1, x1 >= x0, y0 <= y1, y1 >= y0)
      ][id1 != id2]
ans = unique(ans)
#    id1 id2 x0 x1 y0 y1
# 1:   1   3  7 11  6 10
# 2:   3   4  5 10 14 20

基本上这会执行自我加入。对于dt中的每一行,它根据提供给on=参数的条件查找所有匹配的索引,并根据匹配的行提取两个矩形及其相交部分的索引。 id1 != id2过滤掉了自我重叠..

然后我们确保没有重复。结果显示哪个矩形id1与哪个id2重叠,以及它们的交叉区域x0, x1, y0, y1

这或多或少是你想要的吗?