我希望有经验的人能够帮助解决如何从xyz数据准备形状文件的问题。可以看到这里是一个准备得很好的数据集的很好的例子,用于彗星Churyumov-Gerasimenko,尽管创建shape file的前置步骤没有提供。
我正在尝试更好地理解如何将表面应用于给定的XYZ坐标集。使用笛卡尔坐标系和R软件包“rgl”很直观,但是环绕形状似乎更困难。我发现了R软件包“geometry”,它提供了一个接口到QHULL函数。我尝试使用这个函数计算Delaunay三角剖分的面,然后可以在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")
alphashape3d
包吗?我不确定它是否完全符合你的需求,但你可以尝试这个更好的绘图方法:ashp <- ashape3d(bunny, alpha = c(0.005)); plot(ashp, col=c(8,8,8))
- Jotaalpha = 0.5
。 - Marc in the boxgeometry
包中Qhull的实现没有问题:一组点的Delaunay三角剖分与该组点的凸包的Delaunay三角剖分始终相同。因此,您的“Delaunay化”的兔子是凸的。 - Stéphane Laurent