Ecrit par Adrien le Novembre 30, 2000 at 11:58:04:
En réponse à: reconstruction 3D écrit par arnaud le Novembre 30, 2000 at 07:28:33:
: 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