R 具有xyz坐标的三维曲面打印

R 具有xyz坐标的三维曲面打印,r,plot,3d,rgl,qhull,R,Plot,3d,Rgl,Qhull,我希望有经验的人能在如何从xyz数据准备形状文件方面提供帮助。Churyumov–Gerasimenko彗星就是一个很好的准备好的数据集的例子,尽管没有提供前面创建数据集的步骤 我试图更好地理解如何将曲面应用于给定的XYZ坐标集。使用笛卡尔坐标是R软件包“rgl”的直截了当的做法,但环绕的形状似乎更难。我找到了R包geometry,它提供了函数的接口。我试着用它来计算Delaunay三角剖分面,然后在rgl中绘制。我无法找出与函数delaunayn相关的一些选项,以可能控制这些面计算的最大距离。

我希望有经验的人能在如何从xyz数据准备形状文件方面提供帮助。Churyumov–Gerasimenko彗星就是一个很好的准备好的数据集的例子,尽管没有提供前面创建数据集的步骤

我试图更好地理解如何将曲面应用于给定的XYZ坐标集。使用笛卡尔坐标是R软件包“rgl”的直截了当的做法,但环绕的形状似乎更难。我找到了R包
geometry
,它提供了函数的接口。我试着用它来计算Delaunay三角剖分面,然后在
rgl
中绘制。我无法找出与函数
delaunayn
相关的一些选项,以可能控制这些面计算的最大距离。我希望这里的人可能对从xyz数据改进曲面构造有一些想法

使用“Stanford Bunny”数据集的示例:

我想我已经找到了一个可能的解决方案,使用
alphashape3d
包。我不得不反复考虑一下,以获得与给定数据集中的距离相关的
alpha
的可接受值(例如,
bunny
sd
给了我一些见解)。我仍在试图找出如何更好地控制顶点和边中线条的宽度,以避免控制绘图,但这可能与
rgl
中的设置有关

例子:
这里是一种使用核密度估计和
misc3d
中的
contour3d
函数的方法。我一直在玩,直到找到一个正常工作的
级别的值。它不是非常精确,但是你可以调整一些东西来得到一个更好、更精确的曲面。如果您有超过8GB的内存,那么您可以将
n
增加到我在此所做的之外

library(rgl)
library(misc3d)
library(onion); data(bunny)

# the larger the n, the longer it takes, the more RAM you need
bunny.dens <- kde3d(bunny[,1],bunny[,2],bunny[,3], n=150, 
    lims=c(-.1,.2,-.1,.2,-.1,.2)) # I chose lim values manually

contour3d(bunny.dens$d, level = 600, 
    color = "pink", color2 = "green", smooth=500)
rgl.viewpoint(zoom=.75)

因为这是一种基于密度估计的方法,我们可以通过增加兔子的密度来获得更多的信息。我在这里也使用
n=400
。成本是计算时间的显著增加,但生成的曲面更好:


bunny.dens包
Rvcg
于2016年7月更新至版本0.14,并添加了球旋转曲面重建。该函数为
vcballpivoting

library(Rvcg) # needs to be >= version 0.14
library(rgl)
library(onion); data(bunny)

# default parameters
bunnybp <- vcgBallPivoting(bunny, radius = 0.0022, clustering = 0.2, angle = pi/2)
shade3d(bunnybp, col = rainbow(1000), specular = "black")
shade3d(bunnybp, col = "pink", specular = "black") # easier to see problem areas.
library(Rvcg)#需要>=版本0.14
图书馆(rgl)
图书馆(洋葱);数据(兔子)
#默认参数

bunnybp您试用过
alphashape3d
软件包吗?我不知道这正是你要找的,但你可以试着找到一个更好的情节:
ashp@Frank-谢谢你的建议,但是这个例子似乎有同样的问题-例如,更改
alpha=0.5
。在
geometry
包中Qhull的R实现没有问题:点云的Delaunay三角剖分始终与点云的凸包的Delaunay三角剖分相同。所以你的“delaunayised”兔子是凸面的。所以,我的答案对你有用!我没有把它作为答案发布,因为我不确定它是否是你所需要的。无论如何,如果您在调用ashape3d
时使用了多个
alpha
值,并且希望为您尝试的所有
alpha
值绘制结果,则只需使用
indexAlpha=“all”
。@Frank-我真的没有意识到这是您推荐的同一个包!我在另一次谷歌搜索中发现了它,软件包的小插曲帮助我找到了设置。我会试试你的建议。干杯@弗兰克-看起来我把
alpha
transparency
搞混了。你应该在这里写一个正式的答案。第二个带有调整后的
绘图的绘图。ashape3d.2
非常酷!我发现,
alpha=0.0015
的图像非常好。@Frank-是的,
alpha=0.0015
在某些地方效果更好,但仔细看,到处都是漏洞。冯和蒂尔尼(2008)的优秀参考资料——正是我一直在寻找的。我想这会给我一个很好的开始,让我找到关于这个主题的相关文献。谢谢你的帮助,谢谢你在这里的努力,弗兰克,你让我在这个话题上走得更远了。我喜欢你表演的愚蠢的油灰兔!这真的很快-谢谢你的回答。不幸的是,我无法通过使用参数来消除这些漏洞。顺便说一句,vcgBallPivoting函数在使用RStudio时崩溃。我已经通知了软件包的作者。你的回答对我来说很有趣<代码>半径=0.0022
返回更好的输出,但不是完美的。。。
library(onion)
library(rgl)
library(geometry)
library(alphashape3d)

data(bunny)
apply(bunny,2,sd)
alphabunny <- ashape3d(bunny, alpha = 0.003)
bg3d(1)
plot.ashape3d(alphabunny, col=c(5,5,5), lwd=0.001, size=0, transparency=rep(0.5,3), indexAlpha = "all")
plot.ashape3d.2 <- function (x, clear = TRUE, col = c(2, 2, 2), byComponents = FALSE, 
                             indexAlpha = 1, transparency = 1, walpha = FALSE, ...) 
{
  as3d <- x
  triangles <- as3d$triang
  edges <- as3d$edge
  vertex <- as3d$vertex
  x <- as3d$x
  if (class(indexAlpha) == "character") 
    if (indexAlpha == "ALL" | indexAlpha == "all") 
      indexAlpha = 1:length(as3d$alpha)
  if (any(indexAlpha > length(as3d$alpha)) | any(indexAlpha <= 
                                                   0)) {
    if (max(indexAlpha) > length(as3d$alpha)) 
      error = max(indexAlpha)
    else error = min(indexAlpha)
    stop(paste("indexAlpha out of bound : valid range = 1:", 
               length(as3d$alpha), ", problematic value = ", error, 
               sep = ""), call. = TRUE)
  }
  if (clear) {
    rgl.clear()
  }
  if (byComponents) {
    components = components_ashape3d(as3d, indexAlpha)
    if (length(indexAlpha) == 1) 
      components = list(components)
    indexComponents = 0
    for (iAlpha in indexAlpha) {
      if (iAlpha != indexAlpha[1]) 
        rgl.open()
      if (walpha) 
        title3d(main = paste("alpha =", as3d$alpha[iAlpha]))
      cat("Device ", rgl.cur(), " : alpha = ", as3d$alpha[iAlpha], 
          "\n")
      indexComponents = indexComponents + 1
      components[[indexComponents]][components[[indexComponents]] == 
                                      -1] = 0
      colors = c("#000000", sample(rainbow(max(components[[indexComponents]]))))
      tr <- t(triangles[triangles[, 8 + iAlpha] == 2 | 
                          triangles[, 8 + iAlpha] == 3, c("tr1", "tr2", 
                                                          "tr3")])
      if (length(tr) != 0) 
        rgl.triangles(x[tr, 1], x[tr, 2], x[tr, 3], col = colors[1 + 
                                                                   components[[indexComponents]][tr]], alpha = transparency, 
                      ...)
    }
  }
  else {
    for (iAlpha in indexAlpha) {
      if (iAlpha != indexAlpha[1]) 
        rgl.open()
      if (walpha) 
        title3d(main = paste("alpha =", as3d$alpha[iAlpha]))
      cat("Device ", rgl.cur(), " : alpha = ", as3d$alpha[iAlpha], 
          "\n")
      tr <- t(triangles[triangles[, 8 + iAlpha] == 2 | 
                          triangles[, 8 + iAlpha] == 3, c("tr1", "tr2", 
                                                          "tr3")])
      if (length(tr) != 0) 
        rgl.triangles(x[tr, 1], x[tr, 2], x[tr, 3], col = col[1], 
                      , alpha = transparency, ...)
    }
  }
}

alphabunny <- ashape3d(bunny, alpha = c(0.003))
plot.ashape3d.2(alphabunny, col=5, indexAlpha = "all", transparency=1)
bg3d(1)
library(rgl)
library(misc3d)
library(onion); data(bunny)

# the larger the n, the longer it takes, the more RAM you need
bunny.dens <- kde3d(bunny[,1],bunny[,2],bunny[,3], n=150, 
    lims=c(-.1,.2,-.1,.2,-.1,.2)) # I chose lim values manually

contour3d(bunny.dens$d, level = 600, 
    color = "pink", color2 = "green", smooth=500)
rgl.viewpoint(zoom=.75)
library(Rvcg)
library(rgl)
library(misc3d)
library(onion); data(bunny)

bunny.dens <- kde3d(bunny[,1],bunny[,2],bunny[,3], n=150, 
    lims=c(-.1,.2,-.1,.2,-.1,.2)) # I chose lim values manually

bunny.mesh <- vcgIsosurface(bunny.dens$d, threshold=600)
shade3d(vcgSmooth(bunny.mesh,"HC",iteration=3),col="pink") # do a little smoothing
bunny.dens <- kde3d(rep(bunny[,1], 10), # increase density.
                    rep(bunny[,2], 10),
                    rep(bunny[,3], 10), n=400, 
                    lims=c(-.1,.2,-.1,.2,-.1,.2))

bunny.mesh <- vcgIsosurface(bunny.dens$d, threshold=600)
shade3d(vcgSmooth(bunny.mesh,"HC",iteration=1), col="pink")
library(Rvcg) # needs to be >= version 0.14
library(rgl)
library(onion); data(bunny)

# default parameters
bunnybp <- vcgBallPivoting(bunny, radius = 0.0022, clustering = 0.2, angle = pi/2)
shade3d(bunnybp, col = rainbow(1000), specular = "black")
shade3d(bunnybp, col = "pink", specular = "black") # easier to see problem areas.