R,Polyclip,相交边

时间:2015-08-02 14:38:57

标签: r

我正在使用polyclip库,并且需要从多边形(两个多边形A和B之间的交点)获取此多边形的边缘,该边缘位于A内,但不在B的边缘上

例如,以下代码:

library(ggplot2)
library(polyclip)
A <- list(list(x=c(.1,.1,.9,.9),y=c(.1,.9,.9,.1)))
B <- list(list(x=c(0,.5,1),y=c(0,sqrt(3)/2,0)))
C <- polyclip(A, B)
close = function(x){
  rbind(x,x[1,])
}
getDataStruct <- function(x){
  close(data.frame(x=x[[1]]$x,y=x[[1]]$y))  
}
ggplot(data=NULL,aes(x,y)) + 
  geom_polygon(data=getDataStruct(A),fill="red",alpha=.5) + 
  geom_polygon(data=getDataStruct(B),fill="green",alpha=.5) + 
  geom_polygon(data=getDataStruct(C),color="magenta",size=2,fill="magenta",alpha=.5)

生成以下图像:

Example

如果我们在上面说,让红色方块为A,绿色三角形为B,品红色形状为C,作为A和B的交点。我需要提取的是小的左垂直, C的小右垂直和长底水平边缘,同时丢弃洋红色形状的顶角和右角边缘。

2 个答案:

答案 0 :(得分:2)

使用rgeos库的工作流程只需将A多边形对象转换为直线,然后将与B多边形的交点转换为。生成的线对象包含您感兴趣的边。

library(rgeos)

A <- readWKT("LINESTRING(0.1 0.1, 0.9 0.1, 0.9 0.9, 0.1 0.9, 0.1 0.1)")
B <- readWKT("POLYGON((0 0, 0.5 0.8660254, 1 0, 0 0))")

plot(B,col='green')
plot(A,add=TRUE)

#now taking the intersection
C <- gIntersection(B,A)
plot(C,col='blue',add=TRUE,lwd=5)

enter image description here

答案 1 :(得分:0)

C-object是一个列表,在外部(单个)列表中有两个向量x和y。据推测,这样做可以有多个“交叉点”。

> str(C)
List of 1
 $ :List of 2
  ..$ x: num [1:5] 0.9 0.5 0.1 0.1 0.9
  ..$ y: num [1:5] 0.173 0.866 0.173 0.1 0.1

因此,通过检查图形,对所需点的相当简单的测试是y值小于0.5。因此,将顶点值设置为NA。

> sC2 <- C[[1]]    # just get the inner list
# now set the xa nd y values to NA if the Y values are greater than 0.5
> sC2 <- lapply(sC2 , function(x) {is.na(x) <- sC2$y > .5; x})
> sC2
$x
[1] 0.9  NA 0.1 0.1 0.9

$y
[1] 0.173    NA 0.173 0.100 0.100