根据坐标数据计算由四个任意点包围的 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
我认为这与我在上面的评论中提到的有关:面积取决于被投影物体的“厚度”,因为四边形不是平面的。
我有如下人脸数据:
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
我认为这与我在上面的评论中提到的有关:面积取决于被投影物体的“厚度”,因为四边形不是平面的。