3D-график поверхности с координатами XYZ

Я надеюсь, что кто-то с опытом может помочь в том, как подготовить файлы форм из данных XYZ. Отличный пример хорошо подготовленного набора данных можно увидетьВот для кометы Чурюмова-Герасименко, хотя предыдущие шаги в созданиифайл формы не предоставляются

Я пытаюсь лучше понять, как применить поверхность к заданному набору координат XYZ. Использование декартовых координат прямолинейно с пакетом R "rgl", однако фигуры, которые обертываются вокруг, кажутся более сложными. Я нашел пакет Rgeometry, который обеспечивает интерфейс дляQhull функции. Я попытался использовать это для вычисления триангулированных граней Делоне, которые я затем могу построить вrgl, Я не могу выяснить некоторые параметры, связанные с функциейdelaunayn возможно контролировать максимальные расстояния, которые рассчитываются этими гранями. Я надеюсь, что кто-то здесь может иметь некоторые идеи по улучшению конструкции поверхности из данных XYZ.

Пример использования набора данных "Stanford bunnny":
library(onion)
library(rgl)
library(geometry)
data(bunny)

#XYZ point plot
open3d()
points3d(bunny, col=8, size=0.1)
#rgl.snapshot("3d_bunny_points.png")

#Facets following Delaunay triangulation
tc.bunny <- delaunayn(bunny)
open3d()
tetramesh(tc.bunny, bunny, alpha=0.25, col=8)
#rgl.snapshot("3d_bunny_facets.png")

Этот ответ заставляет меня поверить, что может быть проблема с реализацией R Qhull. Кроме того, я уже пробовал различные настройки (например,delaunayn(bunny, options="Qt")) с небольшим эффектом. Qhull варианты изложеныВот

Редактировать:

Вот дополнительный (более простой) пример сферы. Даже здесь вычисление граней не всегда находит ближайшие соседние вершины (если вы поверните шар, вы увидите, что некоторые грани пересекаются внутри).

library(rgl)
library(geometry)
set.seed(1)
n <- 10
rho <- 1
theta <- seq(0, 2*pi,, n) # azimuthal coordinate running from 0 to 2*pi 
phi <- seq(0, pi,, n) # polar coordinate running from 0 to pi (colatitude)
grd <- expand.grid(theta=theta, phi=phi)

x <- rho * cos(grd$theta) * sin(grd$phi)
y <- rho * sin(grd$theta) * sin(grd$phi)
z <- rho * cos(grd$phi)

set.seed(1)
xyz <- cbind(x,y,z)
tbr = t(surf.tri(xyz, delaunayn(xyz)))
open3d()
rgl.triangles(xyz[tbr,1], xyz[tbr,2], xyz[tbr,3], col = 5, alpha=0.5)
rgl.snapshot("ball.png")

Ответы на вопрос(3)

Ваш ответ на вопрос