如何在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
相关产品推荐
相关产品推荐

