【发布时间】:2014-05-03 00:56:00
【问题描述】:
我希望有经验的人可以帮助如何从 xyz 数据准备形状文件。尽管没有提供前面创建 shape file 的步骤,但对于 Churyumov–Gerasimenko 彗星的 here 可以看到一个很好的数据集示例。
我试图更好地理解如何将表面应用于给定的一组 XYZ 坐标。使用 R 包“rgl”直接使用笛卡尔坐标,但是环绕的形状似乎更困难。我找到了 R 包geometry,它提供了QHULL 函数的接口。我尝试使用它来计算 Delaunay 三角面,然后我可以在 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")
This answer 让我相信 Qhull 的 R 实现可能存在问题。另外,我现在尝试了各种设置(例如delaunayn(bunny, options="Qt")),但效果不大。概述了 Qhull 选项here
编辑:
这是一个额外的(更简单的)球体示例。即使在这里,面的计算也并不总是找到最近的相邻顶点(如果你旋转球你会看到一些面穿过内部)。
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)) -
@Frank - 感谢您的建议,但这个例子似乎有同样的问题 - 例如更改
alpha = 0.5。 -
geometry包中 Qhull 的 R 实现没有问题:点云的 Delaunay 三角剖分始终与此点云的凸包的 Delaunay 三角剖分相同。所以你的“delaunayised”兔子是凸的。