Расчет площади поверхности трехмерного многоугольника в R - PullRequest
0 голосов
/ 01 мая 2020

Я новичок в 3D вычислениях и графике. У меня есть следующий набор данных.

> data
          x        y        z
1 -83.50855 42.02817 67.87841
2 -79.90784 45.27420 78.96291
3 -70.76262 45.16967 83.27016
4 -63.08391 41.29231 81.74785
5 -70.60881 39.28322 79.47612
6 -80.35512 39.61557 69.02509

Я смог сгенерировать 3D-полигон, используя пакет Rvcg.

> library(Rvcg)
> polygon3d(data)

Анимированный GIF ниже иллюстрирует форму 3D-полигона.

enter image description here

Теперь я хочу получить площадь поверхности этого трехмерного многоугольника. Как мне это сделать?

К вашему сведению - я преобразовал xyz в mesh3d, используя пакет rgl, но, очевидно, он рассчитывается только из двух треугольников, что не совсем то, что я ищу.

> library(rgl)
> data_mesh <- as.mesh3d(data)
> vcgArea(data_mesh, perface = TRUE)
$area
[1] 156.6687

$pertriangle
[1] 46.11146 32.22287

Помогите ~ пожалуйста?

1 Ответ

1 голос
/ 01 мая 2020

Если многогранник выпуклый, вы можете триангулировать его границу и суммировать площади треугольников, чтобы получить площадь его поверхности.

Давайте посмотрим. Пакет cxhull вычисляет выпуклую оболочку многогранника.

dat <- "-83.50855 42.02817 67.87841
-79.90784 45.27420 78.96291
-70.76262 45.16967 83.27016
-63.08391 41.29231 81.74785
-70.60881 39.28322 79.47612
-80.35512 39.61557 69.02509"

vertices <- as.matrix(read.table(text = dat))

library(cxhull)
hull <- cxhull(vertices, triangulate = TRUE)
length(hull$vertices) == nrow(vertices) # TRUE => the polyhedron is convex

Здесь вершины выпуклой оболочки совпадают с исходными вершинами многогранника. Это означает, что выпуклая оболочка - это сам многогранник.

Затем вы можете суммировать площади граней, и в результате получается площадь поверхности многогранника:

sum(sapply(hull$facets, `[[`, "volume"))
# 338.5752
...