2012-04-30 6 views
1

J'ai une question concernant le tracé d'une surface cylindrique dans Matlab. Mon jeu de données se compose d'un nuage de points de X, Y, Z coordonnées avec des valeurs d'intensité correspondantes C.Matlab trianguler et tracer le nuage de points cylindrique en 3D

Je peux les tracer en utilisant la fonction scatter3:

figure 
scatter3(X,Y,Z,8,C) 

résultats dans l'image suivante:

Cependant, je voudrais tracer la surface de cet objet plutôt que les points. J'ai essayé d'y parvenir en utilisant la triangulation de Delaunay

tri  = delaunay(X,Y); 
figure 
trisurf(tri,X,Y,Z,C,'FaceColor','interp') 

Link to screenshots

Comme vous pouvez le voir sur l'image, le résultat est pas ce que je voudrais comme il y a des difficultés avec la triangulation. Pour moi, il semble que l'algorithme ne supporte pas bien le fait que je reçois les mêmes coordonnées X et Y plusieurs fois.

Suivant les exemples présentés à la page d'aide TriRep j'ai essayé d'utiliser l'approche suivante:

dt = DelaunayTri(X,Y,Z); 
tr = TriRep(dt, X, Y, Z); 

hélas sans succès que je reçois le message d'erreur suivant lorsque vous appelez la fonction TriRep:

? ?? Erreur lors de l'utilisation de ==> TriRep Le paramètre doit être 'double matrice'.

Je suppose que je dois limiter ma géométrie et je pensais que je trouve la solution dans Example 1 here en utilisant la fonction freeBoundary - bien que je besoin de la sortie de la fonction TriRep afin de calculer cela. C'est là que je suis coincé. Comme vous pouvez le voir, je ne suis pas un expert en méthodes de triangulation et j'apprécierais vraiment toute aide que vous pourriez offrir. Merci!

Répondre

2

Je pense que ce que vous voulez n'est pas une simple triangulation, mais plutôt la coque convexe de votre ensemble de points.

L'analogie classique pour une coque convexe 2d -
Si vous imaginez votre jeu de points à clous sur une planche, puis la coque convexe est le polygone qui serait formé en étirant une bande élastique autour de vos points - c'est-à-dire qu'il touche les points externes mais pas les points internes. Et en prolongeant cela, vous pouvez penser à la coque convexe 3d comme étant une "peau" des points extérieurs dans votre nuage de points. La coque convexe est le point de départ pour des techniques de géométrie computationnelle plus compliquées, mais dans votre cas, elle vous donnera le maillage que vous recherchez.

Je ne l'ai pas utilisé la version de Matlab, mais il semble assez simple: http://www.mathworks.com/help/techdoc/ref/convhulln.html

Edit: Après avoir vu vos commentaires ci-dessous: Si vous utilisez déjà une structure TriRep, vous pouvez l'utiliser pour obtenir le visage normales, puis supprimez tous les triangles dont le visage a une normale proche de droite vers le haut/bas.Par exemple, si vous commencez par l'exemple de la page FaceNormals doc Matlab http://www.mathworks.com/help/techdoc/ref/trirep.facenormals.html:

numpts = 100; 
thetha = rand(numpts,1)*2*pi; 
phi = rand(numpts,1)*pi; 
x = cos(thetha).*sin(phi); 
y = sin(thetha).*sin(phi); 
z = cos(phi); 
dt = DelaunayTri(x,y,z); 
[tri Xb] = freeBoundary(dt); 
tr = TriRep(tri, Xb); 
P = incenters(tr); 
fn = faceNormals(tr); 
trisurf(tri,Xb(:,1),Xb(:,2),Xb(:,3), 'FaceColor', 'cyan', 'faceAlpha', 0.8); 

Ensuite, vous pouvez simplement courir à travers les Normales et éliminer toutes les faces d'une amplitude élevée z:

for(i=196:-1:1) 
    if(abs(fn(i,3))>0.8) 
     tri(i)=[]; 
    end 
end 
trisurf(tri,Xb(:,1),Xb(:,2),Xb(:,3),'FaceColor','red','faceAlpha',0.7); 

HTH - - RC

+0

Merci de m'avoir indiqué dans cette direction. Je l'ai essayé et il semble beaucoup mieux mais toujours pas tout à fait ce que j'étais après. Actuellement, il y a trop peu de faces sur les surfaces et le cylindre est également fermé sur les extrémités supérieure et inférieure. Ce que j'avais à l'esprit était un cylindre ouvert avec autant de petites faces sur les murs latéraux que possible sans chevauchement. Avez-vous une idée de comment je pourrais y parvenir? –

+0

en utilisant T = delaunayn (X, {'Qt', 'Qc', 'Qx', 'Q4'}); J'ai pu obtenir de nouveaux résultats qui sont vraiment proches de ce que je veux (je n'utiliserai pas la coque convexe car elle omettrait des points étant donné que le cylindre n'est pas complètement convexe). Mon dernier problème reste le fait que la face supérieure et inférieure du cylindre est fermée. Est-il possible de spécifier une «distance maximale de triangulation» dans delaunayn? Si je pouvais spécifier une longueur maximale de la face du triangle, alors je pourrais facilement éviter de remplir les faces supérieure et inférieure ... –

+0

Juste une note: la boucle for descend au lieu de monter, donc vous n'avez pas à vous tromper avec l'indexation après suppression des lignes. –

Questions connexes