2016-04-06 12 views
2

Birisi 'ashape3d' sınıf nesnesini 'mesh3d' sınıfına dönüştürmeme yardımcı olabilir mi? Ashape3d'de, üçgen tetrahedron yüzleri farklı alanlarda depolanır.ashape3d sınıfını mesh3d'ye dönüştürme

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 

herkes daha iyi bir yolu var mı: Ben & tetraedler eşzamanlı üçgenlerden bir mesh3d nesnesini, ya bir işlev var sanmıyorum, ben şu (pseudocode) çalıştı?

+0

Yukarıdaki verilere bunu deneyebilirsiniz. –

+0

Soruyu, bazı örnek verileri içerecek şekilde güncelledim. Ne yazık ki şimdi plot3d (m3d) kullanırken bir hata atıyor. Yani muhtemelen başlamak için yanlış bir şey yapıyorum. –

+0

Bu, tekrarlanabilir bir örnek fikri. Seni gerçekten çok zorlaştırmalı. :) –

cevap

2

Bunu yakın zamanda yapmam gerekiyordu ve bu cevapsız soruyu buldum. Neler olup bittiğini anlamanın en kolay yolu plot.ashape3d'a bakmak ve ashape3d dokümanlarını okumaktır. plot.ashape3d yalnızca üçgen üçgenler.

rgl paketinin genel bir as.mesh3d işlevi vardır. Bu, bu genel işlev için bir yöntem tanımlar.

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 
) 
} 

Bir tekrarlanabilir örneği sağlayın

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') 
İlgili konular