计算R中形状之间的面积

时间:2014-01-24 23:35:20

标签: r area

我正在尝试计算空间中任意点生成的区域(橙色)。这里有一些不同可能场景的示例图片:

enter image description here

enter image description here

enter image description here

所以基本上在所有三张图片中,我希望能够通过绘制从点到蓝色区域的水平和垂直线来计算从点生成的橙色区域。这个想法很简单,但实际上实施非常具有挑战性。我在R中编写这段代码,所以R代码的任何帮助都会很棒。另外,对于第三个例子,我们可以假设橙色区域在x和y等于8处有界限。并且,我们也知道绿点的坐标。任何建议都非常感谢!

哦,这是我生成以下图表的代码:

x = c(1,3,5)
y = c(5,3,1)

point1 = c(2,4)
point2 = c(2,2)
point3 = c(0,0)

plot(x,y,type="n",xlim=c(0,8),ylim=c(0,8))
rect(point1[1],point1[2],max(x)+10,max(y)+10,col="orange",border=NA)
rect(x,y,max(x)+10,max(y)+10,col="lightblue",border=NA)
points(x,y,pch=21,bg="green")
points(point1[1],point1[2],pch=21,bg="blue")
box()


plot(x,y,type="n",xlim=c(0,8),ylim=c(0,8))
rect(point2[1],point2[2],max(x)+10,max(y)+10,col="orange",border=NA)
rect(x,y,max(x)+10,max(y)+10,col="lightblue",border=NA)
points(x,y,pch=21,bg="green")
points(point2[1],point2[2],pch=21,bg="blue")
box()


plot(x,y,type="n",xlim=c(0,8),ylim=c(0,8))
rect(point3[1],point3[2],max(x)+10,max(y)+10,col="orange",border=NA)
rect(x,y,max(x)+10,max(y)+10,col="lightblue",border=NA)
points(x,y,pch=21,bg="green")
points(point3[1],point3[2],pch=21,bg="blue")
box()

2 个答案:

答案 0 :(得分:0)

你的工作比必要的要困难得多。 pracma::polyarea将根据所有顶点的坐标计算任何多边形的面积。

答案 1 :(得分:0)

将整个绘图区域视为不等的矩形网格,在您绘制的矩形顶点的x坐标和y坐标处使用x和y网格点。

x <- c(1, 3, 5)
y <- c(5, 3, 1)
max.x <- max(x) + 10
max.y <- max(y) + 10
point <- c(0, 0)
x.grid <- sort(unique(c(x, point[1], max.x)))
x.grid
# [1]  0  1  3  5 15
y.grid <- sort(unique(c(y, point[2], max.y)))
y.grid
# [1]  0  1  3  5 15

我们将使用矩阵orange跟踪我们绘制橙色的网格矩形:

orange <- matrix(FALSE, nrow=length(y.grid)-1, ncol=length(x.grid)-1)

我们将制作一个绘图功能,根据传递的矩形标记orange中的单元格,左下角为(x1, y1),右上角为(x2, y2)

plot.rect <- function(x1, y1, x2, y2, value) {
  x1.idx <- which(x.grid == x1)
  y1.idx <- which(y.grid == y1)
  x2.idx <- which(x.grid == x2)
  y2.idx <- which(y.grid == y2)
  orange[y1.idx:(y2.idx-1),x1.idx:(x2.idx-1)] <<- value
}

然后,让我们绘制我们的橙色矩形(填入TRUE),然后绘制所有蓝色矩形(填入FALSE):

plot.rect(point[1], point[2], max.x, max.y, TRUE)
for (idx in 1:length(x)) {
  plot.rect(x[idx], y[idx], max.x, max.y, FALSE)
}

最后,让我们计算每个网格矩形的大小,启用最终大小计算(我在顶部选择的point对应于您的第三个绘图;因为绘图向上延伸15到右边15,它似乎按预期工作):

sizes <- t(outer(diff(x.grid), diff(y.grid)))
area <- sum(orange * sizes)
area
# [1] 41