Ecrit par arnaud le Decembre 01, 2000 at 14:12:44:
En réponse à: Re: reconstruction 3D écrit par Adrien le Novembre 30, 2000 at 11:58:04:
: : bonjour a tous!
: : je possede un ensemble de coupe tranversale d'un objet et je souhaite le reconstruire grace a matlab.
: : mais je ne sais comment faire...
: : j'aimerais pouvoir afficher les differentes images (matrices) pour differentes valeurs de z
: : ou alors trouver un moyen de representer une matrice m*n*p
: : j'ai bien essayer avec plot3 mais le probleme c'est que je perd l'informations du pixel(sa valeur)
: : merci d'avance
: Tu peux essayer d'utiliser la commande PATCH de Matlab, qui produit un polygone dans un espace 3D. Tu peux facilement controller la couleur de tes polygones.
: a titre d'exemple voici un programme Matlab qui dessine un hyperboloide de révolution avec patch :
: tu peux le lancer simplement avec brol, ou brol(20),...
: function f = brol(n,t1,t2,shade)
: %shading, argument optionel
: if(nargin<4)
: shade=0;
: end;
: % t1 et t2 controllent la forme de l'hyperboloide si on ne
: % les spécifie pas on a une valeur imposée
: if(nargin<3)
: t1 = 0;
: t2 = 0.7*pi;
: end
: % par défaut, il y a 100 = 10*10 facettes.
: if (nargin<1)
: n = 10;
: end
: %Definition de la figure et de la vue
: figure
: view([1 1 1]);
: set(gca,'CameraPosition',[-25.9216 -61.0676 55.667])
: set(gca,'View',[-23 40])
: set(gca,'XLim',[-1.5 1.5])
: set(gca,'XTick',[-1.5 0 1.5])
: set(gca,'XTickLabel',[-1.5;0;1.5 ])
: set(gca,'YLim',[-1.5 1.5])
: set(gca,'YTick',[-1.5 0 1.5])
: set(gca,'YTickLabel',[-1.5;0;1.5 ])
: set(gca,'ZLim',[-1.5 1.5])
: set(gca,'ZTick',[-1.5 0 1.5])
: set(gca,'ZTickLabel',[-1.5;0;1.5 ])
: set(gca,'XTicklabel','')
: hold on;
: rotate3d
: % définition de la matrice de rotation
: theta = 2*pi/n;
: rot = eye(3);
: rot(1,1) = cos(theta);
: rot(2,2) = rot(1,1);
: rot(1,2) = sin(theta);
: rot(2,1) = -rot(1,2);
: % définition des extrémités du segment de droite
: p1 = [cos(t1) sin(t1) -1]';
: p2 = [cos(t2) sin(t2) 1]';
: p1_old = p1;
: p2_old = p2;
: % on construit les n-1 premières rangées
: for(i=1:n-1)
: p1_new = rot*p1_old;
: p2_new = rot*p2_old;
:
: for(k=1:n)
: p1o = p1_old+(k-1)*(p2_old-p1_old)/n;
: p1n = p1_new+(k-1)*(p2_new-p1_new)/n;
:
: p2o = p1_old+(k)*(p2_old-p1_old)/n;
: p2n = p1_new+(k)*(p2_new-p1_new)/n;
:
: toto = [p1o p2o p2n p1n];
: patch(toto(1,:),toto(2,:),toto(3,:),toto(3,:));
: end
: p1_old = p1_new;
: p2_old = p2_new;
: % pause(1/n)
: end
: % on ferme exactement la surface
: p1_new = p1;
: p2_new = p2;
: for(k=1:n)
: p1o = p1_old+(k-1)*(p2_old-p1_old)/n;
: p1n = p1_new+(k-1)*(p2_new-p1_new)/n;
:
: p2o = p1_old+(k)*(p2_old-p1_old)/n;
: p2n = p1_new+(k)*(p2_new-p1_new)/n;
:
: toto = [p1o p2o p2n p1n];
: patch(toto(1,:),toto(2,:),toto(3,:),toto(3,:));
: end
: if (shade==1)
: shading interp
: end
merci adrien pour tes renseignements qui m'ont fait decouvrir la fonctions patch,
mais neanmoins je n'ai pas trouver ce qui m'interesse.
car en fait c'est come si je voulais reconstruire des plans de coupe venant
d'un scanner medical!!!!
et donc je dois creer un ensemble de plan parallele a altitude differentes et
leurs aplliquer une texture qui serait mon image de coupe.....
et je n'ai pas trouver le moyen d'appliquer une texture sur un polygones avec
la fonction patch!!!