Clip/Cut 多边形之外的所有内容或用白色填充外部
Clip/Cut everything outside of Polygon or fill the outside with white
我有一个正方形的彩色噪点,上面有一个三角形。
现在,我希望多边形像圣诞节时的 "cookie cutter" 一样减少这种噪音。导致三角形的噪声被多边形路径包围。
如何裁剪与多边形边框重叠的所有像素,然后将其另存为 pdf?
我想到了 2 个想法:
- 方法 1 使用一个函数来测试像素(有色噪声)是否落在形状中。让我们开始吧!
问题:边框像素的边缘脱线。在这个例子中它非常小。你可能会争论只是让多边形线大一点。
- 方法二反转多边形形状(等于:填充多边形外部),然后用白色填充。
问题:
在情节预览 window 中,结果看起来像我想要的。当我将它另存为 PDF 时,我得到的结果是所有东西都是白色的,带有黑色多边形。
可重现的例子:
library(magrittr)
library(ggplot2)
library(SDMTools)
polyGony <- c(0,0,100,50,50,100) %>% matrix(ncol=2,byrow = T) %>% as.data.frame()
deltaN <- 200 #grid width
sp1<-seq(1,100,length=deltaN)
sp2<-seq(1,100,length=deltaN)
sp<-expand.grid(x=sp1,y=sp2)
set.seed(1337)
sp$z <- sample(1:30,nrow(sp),replace = T)
# Method 1
outin = SDMTools::pnt.in.poly(sp[,1:2],polyGony)
outin$z <- sp$z
pointsInsideTri <- outin[outin$pip==1,-3]
p <- ggplot(pointsInsideTri, aes(x, y)) +
geom_raster(aes(fill = z)) +
scale_fill_gradientn(colours=c("#FFCd94", "#FF69B4", "#FF0000","#4C0000","#000000"))
p + geom_polygon(data = polyGony, aes(V1,V2),color="black", fill=NA) + theme(aspect.ratio = 1)
# Method 2
outSQ <-c(0,0,100,0,100,100,0,100)
invPolyGony <- c(outSQ,0,0,100,50,50,100) %>% matrix(ncol=2,byrow = T) %>% as.data.frame()
p <- ggplot(sp, aes(x, y)) +
geom_raster(aes(fill = z)) +
scale_fill_gradientn(colours=c("#FFCd94", "#FF69B4", "#FF0000","#4C0000","#000000"))
p + geom_polygon(data = invPolyGony, aes(V1,V2) ,colour="black", fill="white") + theme(aspect.ratio = 1)
我现在知道问题出在哪里了。为了填充多边形之外的所有内容,路径(中间的孔)需要顺时针"run",外边界需要逆时针运行。
我做了一个简单的例子。我们有一个星星的多边形。我要星星以外的一切都是红色的。
star <- c(25.000,1.000,31.000,18.000,49.000,18.000,35.000,29.000,40.000,46.000,
25.000,36.000,10.000,46.000,15.000,29.000,1.000,18.000,19.000,18.000) %>% matrix(ncol=2, byrow=T)
star <- rbind(star,star[1,])
rim <- c(0,0, 50,0, 50,50,0,50,0,0) %>% matrix(ncol=2, byrow=T)
datapolyM <- rbind(rim,star) %>% as.data.frame()
names(datapolyM) <- c("x","y")
ggplot(datapolyM, aes(x=x, y=y)) +
geom_polygon(fill="red", colour="black")
导出为 pdf!你会看到整张图片都被填满了红色!
现在让我们把星星的路径顺时针转到运行:请注意第二行的apply和reverse命令:
star <- c(25.000,1.000,31.000,18.000,49.000,18.000,35.000,29.000,40.000,46.000,
25.000,36.000,10.000,46.000,15.000,29.000,1.000,18.000,19.000,18.000) %>% matrix(ncol=2, byrow=T) %>% apply(2, rev)
star <- rbind(star,star[1,])
rim <- c(0,0, 50,0, 50,50,0,50,0,0) %>% matrix(ncol=2, byrow=T)
datapolyM <- rbind(rim,star) %>% as.data.frame()
names(datapolyM) <- c("x","y")
datapolyM$id <- "a"
ggplot(datapolyM, aes(x=x, y=y)) +
geom_polygon(fill="red")
现在再次导出为 pdf。这次你会看到它成功了!您已填充给定多边形形状之外的所有内容!
我有一个正方形的彩色噪点,上面有一个三角形。 现在,我希望多边形像圣诞节时的 "cookie cutter" 一样减少这种噪音。导致三角形的噪声被多边形路径包围。
如何裁剪与多边形边框重叠的所有像素,然后将其另存为 pdf?
我想到了 2 个想法:
- 方法 1 使用一个函数来测试像素(有色噪声)是否落在形状中。让我们开始吧!
问题:边框像素的边缘脱线。在这个例子中它非常小。你可能会争论只是让多边形线大一点。 - 方法二反转多边形形状(等于:填充多边形外部),然后用白色填充。
问题: 在情节预览 window 中,结果看起来像我想要的。当我将它另存为 PDF 时,我得到的结果是所有东西都是白色的,带有黑色多边形。
可重现的例子:
library(magrittr)
library(ggplot2)
library(SDMTools)
polyGony <- c(0,0,100,50,50,100) %>% matrix(ncol=2,byrow = T) %>% as.data.frame()
deltaN <- 200 #grid width
sp1<-seq(1,100,length=deltaN)
sp2<-seq(1,100,length=deltaN)
sp<-expand.grid(x=sp1,y=sp2)
set.seed(1337)
sp$z <- sample(1:30,nrow(sp),replace = T)
# Method 1
outin = SDMTools::pnt.in.poly(sp[,1:2],polyGony)
outin$z <- sp$z
pointsInsideTri <- outin[outin$pip==1,-3]
p <- ggplot(pointsInsideTri, aes(x, y)) +
geom_raster(aes(fill = z)) +
scale_fill_gradientn(colours=c("#FFCd94", "#FF69B4", "#FF0000","#4C0000","#000000"))
p + geom_polygon(data = polyGony, aes(V1,V2),color="black", fill=NA) + theme(aspect.ratio = 1)
# Method 2
outSQ <-c(0,0,100,0,100,100,0,100)
invPolyGony <- c(outSQ,0,0,100,50,50,100) %>% matrix(ncol=2,byrow = T) %>% as.data.frame()
p <- ggplot(sp, aes(x, y)) +
geom_raster(aes(fill = z)) +
scale_fill_gradientn(colours=c("#FFCd94", "#FF69B4", "#FF0000","#4C0000","#000000"))
p + geom_polygon(data = invPolyGony, aes(V1,V2) ,colour="black", fill="white") + theme(aspect.ratio = 1)
我现在知道问题出在哪里了。为了填充多边形之外的所有内容,路径(中间的孔)需要顺时针"run",外边界需要逆时针运行。
我做了一个简单的例子。我们有一个星星的多边形。我要星星以外的一切都是红色的。
star <- c(25.000,1.000,31.000,18.000,49.000,18.000,35.000,29.000,40.000,46.000,
25.000,36.000,10.000,46.000,15.000,29.000,1.000,18.000,19.000,18.000) %>% matrix(ncol=2, byrow=T)
star <- rbind(star,star[1,])
rim <- c(0,0, 50,0, 50,50,0,50,0,0) %>% matrix(ncol=2, byrow=T)
datapolyM <- rbind(rim,star) %>% as.data.frame()
names(datapolyM) <- c("x","y")
ggplot(datapolyM, aes(x=x, y=y)) +
geom_polygon(fill="red", colour="black")
导出为 pdf!你会看到整张图片都被填满了红色!
现在让我们把星星的路径顺时针转到运行:请注意第二行的apply和reverse命令:
star <- c(25.000,1.000,31.000,18.000,49.000,18.000,35.000,29.000,40.000,46.000,
25.000,36.000,10.000,46.000,15.000,29.000,1.000,18.000,19.000,18.000) %>% matrix(ncol=2, byrow=T) %>% apply(2, rev)
star <- rbind(star,star[1,])
rim <- c(0,0, 50,0, 50,50,0,50,0,0) %>% matrix(ncol=2, byrow=T)
datapolyM <- rbind(rim,star) %>% as.data.frame()
names(datapolyM) <- c("x","y")
datapolyM$id <- "a"
ggplot(datapolyM, aes(x=x, y=y)) +
geom_polygon(fill="red")