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

如何在R中通过Delaunay三角剖分求解3D凸包等的中心点?

在R语言中用geometry包计算3D凸包的中心点

要计算3D凸包的中心点(即多面体的体积加权质心),我们可以基于geometry::convhulln返回的凸包面信息,通过计算每个面与原点构成的四面体的贡献来推导。以下是针对bunny数据集的完整实现:

步骤说明

  • 从凸包结果中提取所有面的顶点索引,获取对应的三维坐标
  • 对每个面,计算其与原点组成的四面体的体积和质心
  • 以各四面体体积为权重,加权求和得到整个凸包的质心
  • 将质心可视化到3D图中验证

完整代码

library("onion")
library("geometry")
library("rgl")

# 加载数据并生成凸包
data(bunny)
bunnyConvexHull <- convhulln(bunny, output.options = TRUE)

# 提取凸包的面顶点索引和对应坐标
faces <- bunnyConvexHull$hull
vertices <- bunny

# 定义计算四面体体积和质心的函数
compute_tetrahedron_stats <- function(p1, p2, p3) {
  # 四面体顶点:原点(0,0,0)、p1、p2、p3
  # 计算体积:1/6 * |(p1 × p2) · p3|
  cross_prod <- cross(p1, p2)
  volume <- abs(dot(cross_prod, p3)) / 6
  
  # 四面体质心:(0+p1+p2+p3)/4
  centroid <- (p1 + p2 + p3) / 4
  
  list(volume = volume, centroid = centroid)
}

# 初始化总权重和总质心
total_volume <- 0
total_centroid <- c(0, 0, 0)

# 遍历所有凸包面,累加体积和质心贡献
for (i in 1:nrow(faces)) {
  idx <- faces[i, ]
  p1 <- vertices[idx[1], ]
  p2 <- vertices[idx[2], ]
  p3 <- vertices[idx[3], ]
  
  tetra_stats <- compute_tetrahedron_stats(p1, p2, p3)
  
  total_volume <- total_volume + tetra_stats$volume
  total_centroid <- total_centroid + tetra_stats$volume * tetra_stats$centroid
}

# 计算最终凸包质心
convex_hull_centroid <- total_centroid / total_volume
cat("3D凸包中心点坐标:", convex_hull_centroid, "\n")

# 可视化验证
plot3d(bunny, col = "pink", size = 1)
plot(bunnyConvexHull, col = "gray", alpha = 0.3, add = TRUE)
# 绘制中心点(红色大球体)
spheres3d(convex_hull_centroid[1], convex_hull_centroid[2], convex_hull_centroid[3], 
          col = "red", radius = 0.01)

关键说明

  • 这里计算的是体积加权质心,这是3D凸包(多面体)的标准中心点定义,区别于简单的顶点均值(顶点均值仅对均匀分布的顶点有意义,不适用于凸包)
  • convhulln返回的hull矩阵每行代表一个三角面的三个顶点索引,我们基于这些索引获取坐标后计算四面体贡献
  • 可视化部分用红色球体标记出中心点,方便直观验证

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 06:42:45