Использование пакета rgl в R для измерения объема нестандартного объекта - PullRequest
0 голосов
/ 27 января 2020

У меня есть вершины (координаты x, y, z) нерегулярного объекта (все нормали направлены наружу), и я хотел бы рассчитать его объем. С небольшими объектами, имеющими всего несколько вершин, я могу найти объем, рассчитав объем тетраэдров для каждого треугольника на поверхности относительно контрольной точки. У меня есть сценарий, который будет делать это для небольшого числа лиц, и определить лица и порядок точек не так уж сложно. Однако для большого количества баллов определение каждой группы из 3 баллов является сложным и трудоемким. Я думаю, что моя первая проблема заключается в том, что мне нужно преобразовать свои вершины в me sh, но я не знаю, как это сделать. Я пробовал несколько команд в пакете 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

1 Ответ

1 голос
/ 28 января 2020

Я не думаю, что rgl имеет функцию, которая вам нужна, но если объект выпуклый, geometry::convhulln может делать то, что вы хотите. Давайте предположим, что obj содержит данные, которые вы показали, а затем вычисляет объем выпуклой оболочки:

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

Это дает 20389437. Объем прямой angular призмы, содержащей все ваши точки, равен 27863952, так что это выглядит правильно.

Если ваш объект не выпуклый, то, возможно, в пакете alphashape3d есть что-то, что вам поможет.

...