2016-04-06 23 views
2

有人可以幫助我將'ashape3d'類對象轉換爲類'mesh3d'嗎?將ashape3d類轉換爲mesh3d

在ashape3d中,三角形en四面體的面被存儲在不同的字段中。因爲我不認爲有可以&四面體同時創建一個三角形物體mesh3d的功能,我試過以下(僞):

model <- ashape3d(rtorus(1000, 0.5, 2),alpha=0.25) 

vert <- model$x[model$vert[,2]==1,] 
vert <- cbind(vert,rep(1,nrow(vert))) 
tria <- model$triang[model$triang[,4]==1,1:3] 
tetr <- model$tetra[model$tetra[,6]==1,1:4] 

m3dTria <- tmesh3d(vertices=vert , indices=tria) 
m3dTetr <- qmesh3d(vertices=vert , indices=tetr) 
m3d  <- mergeMeshes(m3dTria,m3dTetr) 

plot.ashape3d(model) # works fine 
plot3d(m3d)   # Error in x$vb[1, x$it] : subscript out of bounds 

是否有人有更好的辦法?

+0

請提供一個可重複的例子。 –

+0

我已更新問題以包含一些示例數據。不幸的是,現在使用plot3d(m3d)時會引發錯誤。所以可能我做錯了一開始。 –

+0

這是一個可重複的例子的想法。它應該讓你覺得很難。 :) –

回答

2

我最近需要這樣做,發現這個未答覆的問題。要弄清楚發生了什麼的最簡單方法是查看plot.ashape3d並閱讀ashape3d的文檔。 plot.ashape3d只繪製三角形。

rgl包具有通用as.mesh3d函數。這爲通用函數定義了一個方法。

as.mesh3d.ashape3d <- function(x, ...) { 
    if (length(x$alpha) > 1) 
    stop("I don't know how to handle ashape3d objects with >1 alpha value") 
    iAlpha = 1 

    # from help for ashape3d 
    # for each alpha, a value (0, 1, 2 or 3) indicating, respectively, that the 
    # triangle is not in the alpha-shape or it is interior, regular or singular 
    # (columns 9 to last) 

    # Pick the rows for which the triangle is regular or singular 
    selrows = x$triang[, 8 + iAlpha] >= 2 
    tr <- x$triang[selrows, c("tr1", "tr2", "tr3")] 

    rgl::tmesh3d(
    vertices = t(x$x), 
    indices = t(tr), 
    homogeneous = FALSE 
) 
} 

你可以嘗試一下在上述數據

model <- ashape3d(rtorus(1000, 0.5, 2),alpha=0.25) 
plot(model, edges=F, vertices=F) 

library(rgl) 
model2=as.mesh3d(model) 
open3d() 
shade3d(model2, col='red')