Colorier sous surface/ MATLAB

Résolu/Fermé
Irene_Adler Messages postés 129 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 9 juillet 2011 - 1 août 2008 à 16:32
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 - 12 août 2008 à 21:39
Bonjour à tous,
Je travaille sur MATLAB et je veux colorier le volume compris entre les deux surfaces que j'ai créé, qui ne se rejoignent pas.
Quelle est la commande pour le faire?
Merci de votre aide!

A voir également:

3 réponses

Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
8 août 2008 à 18:24
Salut Irene_Adler
Bon, ta question date d'une semaine, je l'avais vue, mais elle est pas assez précise en fait et je voyais pas que tu voulais faire exactement. Je me lance quand même...

Quand tu parles de colorer le volume entre deux surfaces qui se rejoignent pas, la question est : Comment tu définis le volume entre deux surfaces qui se rejoignent pas?

Si on considère deux surfaces S1 et S2, il faut se placer relativement à un axe (l'axe (Oz) par exemple) et considérer les points dont la cote z vérifie z1 ≤ z ≤ z2 avec z1 = S1 ∩ (Oz) et z2 = S2 ∩ (Oz). Mais c'est possible que si la projection des surfaces sur le plan (Oxy) est la même.

Donc... en supposant que t'es bien dans ces conditions, ben... je vois pas trop comment faire. Pour colorer un volume sous MatLab, sans avoir de maillage tétrahédrique de ce volume, je sais pas si c'est possible. J'ai aussi demandé autour de moi, aucune idée lumineuse...
Du coup, la seule solution que je peux te proposer c'est de colorer la frontière de ton volume. Tu récupère les segments de la frontière des 2 surfaces, tu crées des rectangles et tu colores chacun d'eux.

Par exemple, pour deux surfaces définies pour (x,y) dans [-1,1]², ça donnerait ça:
[X Y]=meshgrid((-1:0.1:1));
Z1=-1-sin(2*pi*sqrt(X.^2+Y.^2));
Z2=1-X.^2-Y.^2;
Xb=[X(end,:).';X(end-1:-1:1,end);X(1,end-1:-1:1).';X(2:end,1)];
Yb=[Y(end,:).';Y(end-1:-1:1,end);Y(1,end-1:-1:1).';Y(2:end,1)];
Z1b=[Z1(end,:).';Z1(end-1:-1:1,end);Z1(1,end-1:-1:1).';Z1(2:end,1)];
Z2b=[Z2(end,:).';Z2(end-1:-1:1,end);Z2(1,end-1:-1:1).';Z2(2:end,1)];
Xbmat=[repmat(Xb,1,2) repmat(circshift(Xb,1),1,2)];
Ybmat=[repmat(Yb,1,2) repmat(circshift(Yb,1),1,2)];
Zmat=[Z1b Z2b circshift(Z2b,1) circshift(Z1b,1)];
hold on;
surf(X,Y,Z1,'FaceColor','red','EdgeColor','none');camlight left;lighting phong;
surf(X,Y,Z2,'FaceColor','red','EdgeColor','none');camlight left;lighting phong;
fill3(Xbmat.',Ybmat.',Zmat.',[1 0 0],'EdgeColor','none');camlight left;lighting phong;
hold off;
A plus
1
Irene_Adler Messages postés 129 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 9 juillet 2011 18
11 août 2008 à 15:39
Salut Sacabouffe,
Merci de ta réponse!
C'est vrai qu'en relisant la question je n'étais pas assez claire. ;)
Je vais essayer ton code, je pensais qu'il y avait peut etre une fonction en 3d qui coloriait le volume entre une surface et un plan, comme une projection en gardant les lignes de construction (c'est un peu dur de s'expliquer sans dessin!)
Merci encore et à bientot!

--
Freedom is the freedom to say that 2+2 make 4. If that is granted, all else follows.
1984, ORWELL
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834 > Irene_Adler Messages postés 129 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 9 juillet 2011
11 août 2008 à 17:45
Salut
Mais attends... si c'est pour un volume entre une surface et un plan, c'est un peu plus simple !
Bon, comme précédemment on colore pas le volume mais les bords du volume mais bon...
Un exemple...
[X,Y] = meshgrid(-1:0.1:1);
Z=4-X.^2-Y.^2;
h=meshz(X,Y,Z);
ZD=get(h,'ZData');
ZD(:,1)=0;
ZD(:,end)=0;
ZD(1,:)=0;
ZD(end,:)=0;
set(h,'ZData',ZD);
set(h,'EdgeColor','none');
set(h,'CDataMode','auto');
set(h,'FaceColor','interp');
C=min(min(get(h,'CData')));
hold on;
fill3([X(1,1) X(1,end) X(end,end) X(end,1)],...
[Y(1,1) Y(1,end) Y(end,end) Y(end,1)],...
[0 0 0 0],C);
hold off;
A plus
0
Irene_Adler Messages postés 129 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 9 juillet 2011 18 > Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009
12 août 2008 à 20:52
salut Sacabouffe,
je n'avais pas vu ton message. J'ai essayé et ca marche, merci!
à plus!
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834 > Irene_Adler Messages postés 129 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 9 juillet 2011
12 août 2008 à 21:39
De rien ;-)
À la prochaine
0
Irene_Adler Messages postés 129 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 9 juillet 2011 18
6 août 2008 à 15:25
re-bonjour!
je n'ai toujours pas trouvé (je crois avoir lu une 20taine de pages sur google!)
alors SVP quelqu'un aurait une idée?
Ce serait une fonction un peu comme area() mais en 3D.
Merci d'avance!
0
Irene_Adler Messages postés 129 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 9 juillet 2011 18
7 août 2008 à 17:10
re-re-bonjour,
Je crois que je vais finir par laisser tomber...
Mais si quelqu'un a la réponse, je suis curieuse de savoir...
Bye!
0