3D-график поверхности с координатами XYZ
Я надеюсь, что кто-то с опытом может помочь в том, как подготовить файлы форм из данных XYZ. Отличный пример хорошо подготовленного набора данных можно увидетьВот для кометы Чурюмова-Герасименко, хотя предыдущие шаги в созданиифайл формы не предоставляются
Я пытаюсь лучше понять, как применить поверхность к заданному набору координат XYZ. Использование декартовых координат прямолинейно с пакетом R "rgl", однако фигуры, которые обертываются вокруг, кажутся более сложными. Я нашел пакет Rgeometry
, который обеспечивает интерфейс дляQhull функции. Я попытался использовать это для вычисления триангулированных граней Делоне, которые я затем могу построить вrgl
, Я не могу выяснить некоторые параметры, связанные с функциейdelaunayn
возможно контролировать максимальные расстояния, которые рассчитываются этими гранями. Я надеюсь, что кто-то здесь может иметь некоторые идеи по улучшению конструкции поверхности из данных XYZ.
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")