根据坐标数据计算由四个任意点包围的 3D 表面网格上的面积

Calculate area on 3D surface mesh encolosed by four arbitrary points from coordinate data

我有如下人脸数据:

library(Rvcg)
library(rgl)

data(humface)

lm <- matrix(c(1.0456182e+001, -3.5877686e+001, 5.0972912e+001, 2.2514189e+001,
               8.4171227e+001, 6.6850304e+001, 8.3239525e+001, 9.8277359e+000,
               6.5489395e+001, 4.2590347e+001, 4.0016006e+001, 5.9176712e+001), 
              4)

shade3d(humface, col="#add9ec", specular = "#202020", alpha = 0.8)     
plot3d(lm, type = "s", col = "red", xlab = "x", ylab = "y", zlab = "z", 
       size = 1, aspect = FALSE,add=T)

对于lm,在网格表面放置了四个地标,顺序如下:

为了便于说明,黄线是手绘的。 我想计算四个红点围成的四边形的表面积,即黄色边内的表面积

如果无法计算表面积,我也欢迎计算四边形面积(不是面部表面面积)的方法。我知道可以计算三角形 123 和三角形 234 的面积之和。但是,在我的实际应用中,我不知道这四个点的顺序和相对空间位置。由于我有数千个四边形区域要计算,因此无法绘制每个四边形并确定如何将四边形分解为两个三角形。比如我可能不小心挑了三角形123和三角形124,这两个三角形面积之和不是我想要的

因此,我对四边形的表面积或面积感兴趣。欢迎解决任何一个问题。我只是不想绘制每个四边形,我想要一个直接从坐标计算的面积值。

我认为您的问题更适合 math.stackexchange.com,因为我认为它更多的是关于代码背后的数学问题,而不是代码本身。

如果您关心精度,您可能需要使用平滑网格计算区域的技术,例如 this 论文中介绍的技术。

但是,如果您真的不需要那个区域来真正模拟表面,那么您可以忽略该面并使用许多 [=16] 计算 凸四边形 面积=]问题)

如果您决定找到对角线并使用最简单的向量公式(对角线之间叉积的大小的一半),您应该使用 cross()Norm() 中的函数pracma 封装为 R 的 crossprod() 计算与您需要的不同类型的叉积。

rgl::shadow3d 函数可以计算四边形到面部的投影。然后,您可以通过对结果中的三角形和四边形面积求和来计算面积。 @DiegoQueiroz 为您提供了一些指导, 加上 Rvcg 包包含 vcgArea:

quad <- mesh3d(lm, triangles = cbind(c(1,2,4), c(1,4,3)))
projection <- shadow3d(humface, quad, plot = FALSE)

这是它的样子:

shade3d(projection, col = "yellow", polygon_offset = -1)

投影最终包含 3604 个三角形;该地区是

vcgArea(projection)
# [1] 5141.33

这个问题有一些含糊之处:四边形不是平面的,所以如果你沿着另一条对角线把它分成三角形,你会得到一个不同的四边形。根据您选择的方向,四边形在脸上的投影会有所不同。我使用了沿 z 轴投影的默认设置,但实际上面部并没有完全对齐。

编辑添加:

如果你不知道如何将4个点分解成一个四边形,那么投影所有4个三角形(在3-space中形成一个四面体):

triangles <- mesh3d(lm, triangles = cbind(c(1,2,3), c(1,2,4), c(1,3,4), c(2,3,4))
projection <- shadow3d(humface, triangles, plot = FALSE)

这给出了与投影四边形略有不同的区域:

vcgArea(projection)
# [1] 5217.224

我认为这与我在上面的评论中提到的有关:面积取决于被投影物体的“厚度”,因为四边形不是平面的。