2017-05-26 4 views
2

Je vais essayer les données d'impression 3D pour faire une belle illustration visuelle pour un exemple de classification binaire.Comment est-ce que je fais des avions dans RGL plus épais?

Voici mon tracé 3D:

require(rgl) 
#Get example data from mtcars and normalize to range 0:1 
fun_norm <- function(k){(k-min(k))/(max(k)-min(k))} 
x_norm <- fun_norm(mtcars$drat) 
y_norm <- fun_norm(mtcars$mpg) 
z_norm <- fun_norm(mtcars$qsec) 

#Plot nice big spheres with rgl that I hope will look good after 3D printing 
plot3d(x_norm, y_norm, z_norm, type="s", radius = 0.02, aspect = T) 
#The sticks are meant to suspend the spheres in the air 
plot3d(x_norm, y_norm, z_norm, type="h", lwd = 5, aspect = T, add = T) 
#Nice thick gridline that will also be printed 
grid3d(c("x","y","z"), lwd = 5) 

Ensuite, je voulais ajouter un plan z = 0, inspiré par this blog here décrivant le r2stl écrit par Ian Walker. Il est censé être le fondement de la structure imprimée qui tient tout ensemble.

planes3d(a=0, b=0, c=1, d=0) 

Cependant, il n'a pas de volume, c'est une plaque mince avec une hauteur = 0. Je veux que cela forme une base solide pour la structure imprimée, qui est destinée à tout garder ensemble (consultez le blog mentionné ci-dessus pour plus de détails, ses exemples sont excellents). Comment puis-je augmenter l'épaisseur de mon plan z = 0 pour obtenir le même effet?

Voici la dernière étape à l'exportation comme STL:

writeSTL("test.stl") 

On peut voir le produit final vraiment bien en utilisant l'open source Meshlab tel que recommandé par Ian dans le blog.

Remarque supplémentaire: J'ai remarqué que le plan mince est également séparé des grilles que j'ai ajoutées sur la face -z du cube et qu'il flotte. Cela peut également causer un problème lors de l'impression. Comment puis-je fusionner les grilles avec le plan z = 0? (Je vais envoyer le fichier STL à un ami qui imprimera pour moi, je veux rendre les choses aussi faciles que possible pour lui.)

Répondre

1

Vous ne pouvez pas rendre un plan plus épais. Vous pouvez faire une forme solide (extrude3d() est la fonction à utiliser). Il ne s'adaptera pas à la boîte englobante comme le fait un avion, vous devrez donc le dessiner en dernier.

Par exemple,

example(plot3d) 
bbox <- par3d("bbox") 
slab <- translate3d(extrude3d(bbox[c(1,2,2,1)], bbox[c(3,3,4,4)], 0.5), 
        0,0, bbox[5]) 
shade3d(slab, col = "gray") 

produit cette sortie:

sample output

C'est toujours pas imprimable (les points ont pas de soutien), mais il devrait vous aider à démarrer.

1

Dans le package matlib, il existe une fonction regvec3d() qui dessine une représentation d'espace vectoriel d'un modèle de régression multiple à deux prédicteurs. La méthode plot pour le résultat de la fonction a un argument show.base qui dessine le plan de base x1-x2 et le dessine plus épais si show.base >0.

C'est un hack simple qui dessine juste une deuxième version de l'avion avec un petit décalage. Peut-être que cela sera suffisant pour votre application.

if (show.base > 0) planes3d(0, 0, 1, 0, color=col.plane, alpha=0.2) 
if (show.base > 1) planes3d(0, 0, 1, -.01, color=col.plane, alpha=0.1)