我正在使用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)
生成以下图像:
如果我们在上面说,让红色方块为A,绿色三角形为B,品红色形状为C,作为A和B的交点。我需要提取的是小的左垂直, C的小右垂直和长底水平边缘,同时丢弃洋红色形状的顶角和右角边缘。
答案 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)
答案 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