R implementation to union of overlapping rectangle

2019-07-29 11:23发布

问题:

I am trying to solve a problem where I have multiple overlapping rectangles and I need to find the combined area of the rectangles. Intersecting portion of the rectangles need to looked at just once. I searched online and I found that Line sweep algorithm will work perfectly for me, as explained here : What is an Efficient algorithm to find Area of Overlapping Rectangles

My question is, Does R have something similar already implemented? I could not find anything similar in R. I do not want to reinvent the wheel if it already exists.

回答1:

Interesting question. Suppose we've four rectangle coordinates as shown below:

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

To see if rectangle i intersects with j, the condition, IIUC is:

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

This can be achieved with a conditional join, which was recently implemented in the current development version of data.table, v1.9.7. See installation instructions 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

Basically this performs a self-join. For each row in dt, it finds all matching indices with itself based on the condition provided to the on= argument, and based on the matching rows it extracts indices of the two rectangles and their intersecting portions. The id1 != id2 filters out self-overlaps..

Then we make sure that are no duplicates. The result shows which rectangle id1 overlaps with which ones id2, and their intersecting region x0, x1, y0, y1.

Is this more or less what you were looking for?



标签: r rectangles