Page 1 sur 1

object : double ellipse

Posté : mer. 6 avr. 2016, 13:51
par maurice
Bonjour,

Voici un automate simple :

Figure asymptote 48f829d6b431eab805f5fe5561786580
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. size(150);
  2.  
  3. real marge=1mm;
  4. pair z1=(0,0);
  5. pair z2=(1,0);
  6. pair z3=(2,0);
  7.  
  8. transform r=scale(1.);
  9.  
  10. object etat_1=draw("$1$",ellipse,z1,marge,filltype = NoFill,black);
  11. object etat_3=draw("$3$",ellipse,z3,marge,filltype = Fill,lightblue);
  12. object etat_2=draw("$2$",ellipse,z2,marge,filltype = NoFill,black);
  13.  
  14. add(new void(picture pic, transform t) {
  15. draw(pic,r*Label("$a$"),point(etat_1,z2-z1,t){z2-z1} ..{z2-z1}point(etat_2,z1-z2,t),Arrow);
  16. draw(pic,r*Label("$a$", align=N),point(etat_1,NW){NW} ..{SW}point(etat_1,NE,t),Arrow);
  17. draw(pic,r*Label("$b$", align=N),point(etat_2,NW,t){NW} ..{SW}point(etat_2,NE,t),Arrow);
  18. draw(pic,r*Label("$c$"),point(etat_2,E,t){E} ..{E}point(etat_3,W,t),Arrow);
  19. });
  20.  
  21. label("$\Uparrow$", (.1, -.25), W);


J'ai deux questions relatives à cet automate :

1. Pour suivre les conventions de représentation j'aimerais que le sommet coloré (le 3) soit entouré d'une double ellipse. Est-ce possible avec le type objet ?
2. l'état initial est indiqué par la double flèche (dernière ligne). Si on change la taille du dessin, la flèche ne ne trouve plus au bon endroit. Y'a-t-il une astuce pour corriger ce défaut ?

Merci d'avance.

Bruno

Re: object : double ellipse

Posté : mer. 6 avr. 2016, 14:33
par GM
Bonjour Bruno,
  • pour le premier problème... je te soumets un bout de code que j'avais dans mon début d'extension pour les graphes ;
  • le second problème était plus simple puisque la réponse était implicitement dans ton code : du dessin différé !

Figure asymptote 3cd77c2f93cab528c3f1312de25eed91
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. ////////////////////
  2. /// Une nouvelle enveloppe : doublellipse
  3. ////////////////////
  4. path doublellipse(frame dest, frame src=dest, real xmargin=0, real ymargin=xmargin,
  5. pen p=currentpen, filltype filltype=NoFill, bool above=false)
  6. {
  7. pair m=min(src);
  8. pair M=max(src);
  9. pair D=M-m;
  10. static real factor=.5*sqrt(2);
  11. int sign=filltype == NoFill ? 1 : -1;
  12. pair h=0.5*sign*(max(p)-min(p));
  13. path g=ellipse(0.5*(M+m),factor*D.x+h.x+xmargin,factor*D.y+h.y+ymargin);
  14. frame F;
  15. if(above == false) {
  16. filltype.fill(F,g,p);
  17. filltype.fill(F,g,linewidth(p)/2+white);
  18. prepend(dest,F);
  19. } else { filltype.fill(dest,g,p);
  20. filltype.fill(dest,g,linewidth(p)/2+white);
  21. }
  22. return g;
  23. }
  24. path doublellipse(frame f, Label L, real xmargin=0, real ymargin=xmargin,
  25. pen p=currentpen, filltype filltype=NoFill, bool above=true)
  26. {
  27. add(f,L);
  28. return doublellipse(f,xmargin,ymargin,p,filltype,above);
  29. }
  30. ///////////////////////////////////////////////
  31.  
  32. size(300);
  33.  
  34. real marge=1mm;
  35. pair z1=(0,0);
  36. pair z2=(1,0);
  37. pair z3=(2,0);
  38.  
  39. transform r=scale(1.);
  40.  
  41. object etat_1=draw("$1$",ellipse,z1,marge,filltype = NoFill,black);
  42. object etat_2=draw("$2$",ellipse,z2,marge,filltype = NoFill,black);
  43. object etat_3=draw("$3$",doublellipse,z3,marge,2bp+black);
  44.  
  45. add(new void(picture pic, transform t) {
  46. draw(pic,r*Label("$a$"),point(etat_1,z2-z1,t){z2-z1} ..{z2-z1}point(etat_2,z1-z2,t),Arrow);
  47. draw(pic,r*Label("$a$", align=N),point(etat_1,NW){NW} ..{SW}point(etat_1,NE,t),Arrow);
  48. draw(pic,r*Label("$b$", align=N),point(etat_2,NW,t){NW} ..{SW}point(etat_2,NE,t),Arrow);
  49. draw(pic,r*Label("$c$"),point(etat_2,E,t){E} ..{E}point(etat_3,W,t),Arrow);
  50. label(pic,r*"$\Uparrow$", point(etat_1,S,t){S},realEpsilon*S);
  51. });

Re: object : double ellipse

Posté : mer. 6 avr. 2016, 18:21
par GM
Par contre... je réalise que je ne te propose pas une solution qui permet d'avoir l'ellipse intérieure colorée.

Re: object : double ellipse

Posté : jeu. 7 avr. 2016, 13:47
par maurice
Bonjour,

Merci pour les réponses.
Toujours aussi efficace.
GM a écrit :Par contre... je réalise que je ne te propose pas une solution qui permet d'avoir l'ellipse intérieure colorée.
Je n'en ai pas besoin, la solution donnée me convient.

Bruno