如何将Voronoi细胞裁剪至带洞多边形的边界?
问题描述
我在一个带洞的多边形内完成了约束Delaunay三角化:
通过对偶原理构建了Voronoi cells,但部分细胞超出了多边形范围(进入孔洞或外部区域):
我想知道如何将这些Voronoi cells裁剪至大多边形的边界?考虑使用sf包,但从未用过该工具。(注:两张图片比例不同)
编辑说明
抱歉,之前表述有误。以下是添加了大多边形的Voronoi cells图片:
实际上我已剔除了超出多边形的细胞,我会尝试调整,可能会删除此问题并重新提问。
基于sf包的裁剪方案
不管是处理全部Voronoi细胞,还是对已剔除完全超出细胞的剩余部分进行精细裁剪,都可以用sf包的空间交集操作快速实现:
步骤1:安装并加载依赖包
install.packages(c("sf", "deldir")) library(sf) library(deldir)
步骤2:准备空间数据
确保你有两个核心sf对象:
main_polygon:带洞的目标裁剪边界(sf多边形对象,孔洞需正确嵌入)voronoi_cells:待裁剪的Voronoi多边形集合(sf多边形对象)
如果你的Voronoi还未转为sf格式,可通过deldir生成并转换:
# 假设points是生成Voronoi的原始点集(sf点对象) voronoi_raw <- deldir(points$x, points$y) %>% tile.list() %>% lapply(function(tile) st_polygon(list(cbind(tile$x, tile$y)))) %>% st_sfc() %>% st_sf()
步骤3:执行裁剪操作
用st_intersection直接计算Voronoi细胞与带洞多边形的交集,自动切掉超出边界和孔洞内的部分:
clipped_voronoi <- st_intersection(voronoi_cells, main_polygon)
步骤4:验证结果
可视化确认裁剪效果:
plot(st_geometry(main_polygon), col = "#f0f0f0", border = "black") plot(st_geometry(clipped_voronoi), add = TRUE, col = sf.colors(nrow(clipped_voronoi), alpha = 0.6)) plot(st_geometry(points), add = TRUE, pch = 19, cex = 0.4)
如果是对已剔除部分细胞的结果进行调整,只需将voronoi_cells替换为你现有的Voronoi对象即可,st_intersection会自动处理剩余的超出部分。
内容的提问来源于stack exchange,提问作者Stéphane Laurent
相关产品推荐
相关产品推荐

