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

如何使用rgl包绘制带孔洞的terra多边形?

解决rgl绘制带孔洞多边形的报错问题

问题根源

rgl的triangulate()和polygon3d()处理带孔洞多边形时,主多边形与孔洞的顶点环绕方向必须相反(比如主多边形顺时针,孔洞逆时针,反之亦然)。你的代码里主多边形和两个孔洞的顶点都是顺时针排列,导致函数无法正确识别孔洞边界,从而触发报错。

修正方案

  1. 反转孔洞的顶点顺序(先去掉最后一个重复的闭合点,反转后重新添加闭合点)
  2. 保持用NA分隔主多边形与孔洞的坐标序列

修正后的完整代码

library(rgl)
library(terra)

# 原始数据
geom <- as.matrix(data.frame(
  "object" = 1,
  "part" = 1,
  "x" = c(1,2,6,7,1,3,3,5,3,5,6,6,5),
  "y" = c(1,5,5,3,1,3,4,4,3,3,4,3,3),
  "hole" = c(rep(0,5), rep(1,4), rep(2,4))))

# 2D预览原多边形
poly <- terra::vect(geom, "polygons")
terra::plot(poly, col = "forestgreen")

# 提取主多边形坐标(保留原顺序)
main_x <- geom[geom[,5] == 0, 3]
main_y <- geom[geom[,5] == 0, 4]

# 提取并反转第一个孔洞的坐标(先移除重复闭合点,反转后重新闭合)
hole1_x <- geom[geom[,5] == 1, 3]
hole1_x <- c(rev(hole1_x[-length(hole1_x)]), hole1_x[1])
hole1_y <- geom[geom[,5] == 1, 4]
hole1_y <- c(rev(hole1_y[-length(hole1_y)]), hole1_y[1])

# 提取并反转第二个孔洞的坐标
hole2_x <- geom[geom[,5] == 2, 3]
hole2_x <- c(rev(hole2_x[-length(hole2_x)]), hole2_x[1])
hole2_y <- geom[geom[,5] == 2, 4]
hole2_y <- c(rev(hole2_y[-length(hole2_y)]), hole2_y[1])

# 组合坐标,用NA分隔不同边界
x <- c(main_x, NA, hole1_x, NA, hole2_x)
y <- c(main_y, NA, hole1_y, NA, hole2_y)

# 2D验证修正后的多边形
plot(x, y, type = "n")
polygon(x, y)

# 成功执行三角化
triangulate(x, y, plot = TRUE)

# 3D绘制带孔洞的多边形
open3d()
polygon3d(x, y, 0, col = "red")

关键细节说明

  • 顶点环绕规则:GIS领域默认遵循"内外边界方向相反"的规则,以此区分主多边形和孔洞,rgl的三角化函数也依赖这一规则识别边界类型。
  • 闭合点处理:反转孔洞顶点时,先移除最后一个重复的闭合顶点(比如孔洞的最后一个点和第一个点重合),反转后再添加回去,避免出现重复顶点导致的异常。

内容的提问来源于stack exchange,提问作者Zoe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:42:39