我正在尝试解决我有多个重叠矩形的问题,我需要找到矩形的组合区域。矩形的相交部分只需要查看一次。我在网上搜索,我发现线扫描算法对我来说非常合适,如下所述:What is an Efficient algorithm to find Area of Overlapping Rectangles
我的问题是,R是否已经实施了类似的东西?我在R中找不到类似的东西。如果它已经存在,我不想重新发明轮子。
答案 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
。
这或多或少是你想要的吗?