使用R中的rgl包测量不规则物体的体积

Using rgl package in R to measure the volume of an irregular object

我有一个不规则物体的顶点(x,y,z 坐标)(所有法线都指向外),我想计算它的体积。对于只有少数顶点的小物体,我可以通过计算表面上每个三角形相对于参考点的四面体的体积来找到体积。我有一个脚本可以针对少量面孔执行此操作,并且识别面孔和点的顺序并不难。然而,对于大量的点,识别每组 3 个点是具有挑战性和耗时的。我认为我的第一个问题是我需要将顶点转换为网格,但我不知道该怎么做。我在 rgl 包中尝试了几个命令,但我没有得到任何结果,我不理解这一步。

以下是我的数据示例。对于每组点,我对对象进行切片并识别 6 个顶点。 plot3d(x,y,z) 效果很好。

index   x   y   z   point
1   -225.64 0.3 427.91  1
2   -225.64 0.3 233.32  2
3   -39.83  0.3 44.62   3
4   45.7    0.3 41.67   4
5   228.56  0.3 236.26  5
6   228.56  0.3 427.91  6
7   -227.47 75  427.52  1
8   -224.52 75  244.72  2
9   -77.05  75  82.56   3
10  73.36   75  82.56   4
11  229.68  75  232.92  5
12  229.68  75  427.52  6
13  -226.37 85  425.78  1
14  -224.75 85  236.55  2
15  -84.08  85  92.6    3
16  84.08   85  92.06   4
17  227.98  85  238.16  5
18  226.37  85  427.4   6
19  -226.37 95  426.39  1
20  -226.37 95  235.54  2
21  -95.4   95  102.91  3
22  93.78   95  102.91  4
23  226.37  95  235.54  5
24  236.37  95  426.39  6
25  -229.6  105 428.21  1
26  -224.75 105 240.59  2
27  -105.1  105 112.81  3
28  106.72  105 112.81  4
29  226.37  105 237.35  5
30  226.37  105 426.59  6
31  -226.37 115 426.59  1
32  -226.37 115 237.35  2
33  -114.8  115 122.52  3
34  114.8   115 124.14  4
35  227.98  115 237.35  5
36  226.37  115 426.59  6
37  -224.75 125 426.59  1
38  -226.37 125 235.74  2
39  -124.5  125 133.84  3
40  122.89  125 135.46  4
41  226.37  125 235.74  5
42  226.37  125 426.59  6
43  -226.37 135 428.21  1
44  -226.37 135 237.35  2
45  -134.2  135 143.54  3
46  135.82  135 143.54  4
47  226.37  135 237.35  5
48  226.37  135 426.59  6
49  -226.37 145 428.21  1
50  -226.37 145 237.35  2
51  -145.54 145 153.25  3
52  142.29  145 154.87  4
53  226.37  145 237.35  5
54  226.37  145 426.59  6
55  -226.37 155 428.21  1
56  -226.37 155 237.35  2
57  -174.63 155 185.4   3
58  174.63  155 185.4   4
59  226.37  155 237.35  5
60  226.37  155 426.59  6

我不认为rgl有你需要的功能,但如果物体是凸的,geometry::convhulln可以做你想要的。让我们假设 obj 包含您显示的数据,然后计算凸包的体积:

xyz <- obj[c("x", "y", "z")]
library(geometry)
hull <- convhulln(xyz, options = "FA")
hull$vol

这给出了 20389437。包含所有点的直角棱柱的体积是 27863952,因此看起来是正确的。

如果您的物体不是凸面的,那么 alphashape3d 包中可能有一些可以帮助您的东西。