You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Voronoi细胞裁剪至带洞多边形的边界?

问题描述

我在一个带洞的多边形内完成了约束Delaunay三角化:
约束Delaunay三角化结果

通过对偶原理构建了Voronoi cells,但部分细胞超出了多边形范围(进入孔洞或外部区域):
超出范围的Voronoi cells

我想知道如何将这些Voronoi cells裁剪至大多边形的边界?考虑使用sf包,但从未用过该工具。(注:两张图片比例不同)


编辑说明

抱歉,之前表述有误。以下是添加了大多边形的Voronoi cells图片:
添加大多边形后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:42:30