Page 1 sur 2

automate

Posté : mar. 11 déc. 2012, 18:38
par maurice
Bonsoir, je suis en train de réaliser un automate dans le cadre du cours sur les graphes.
J'essaie de reproduire un dessin du bouquin. Je me suis inspiré de ce post

Figure asymptote e0b9286785d1c72fe6239cbb6cfcb84c
*** 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(10cm);
  2.  
  3. transform t=scale(0.75);
  4.  
  5. object objet_1=draw(t*"d\'epart",ellipse,(0,0),xmargin=.1cm,filltype=FillDraw(blue,black));
  6. object objet_2=draw(t*"D",ellipse,(3,0),xmargin=.1cm,filltype=FillDraw(blue,black));
  7. object objet_3=draw(t*"DE",ellipse,(5,0),xmargin=.1cm,filltype=FillDraw(blue,black));
  8. object objet_4=draw(t*"DEU",ellipse,(7,0),xmargin=.1cm,filltype=FillDraw(blue,black));
  9. object objet_5=draw(t*"DEUX",ellipse,(9,0),xmargin=.1cm,filltype=FillDraw(blue,black));
  10.  
  11. add(new void(picture pic, transform t) {
  12. //Fleches directes
  13. draw(pic,point(objet_1,E,t){N+2*E}..{S+2*E}point(objet_2,W,t),MidArrow);
  14. draw(pic,point(objet_2,W,t){S+2*W}..{N+2*W}point(objet_1,E,t),MidArrow);
  15. draw(pic,point(objet_2,E,t){N+E}..{S+E}point(objet_3,W,t),MidArrow);
  16. draw(pic,point(objet_3,W,t){S+W}..{N+W}point(objet_2,E,t),MidArrow);
  17. draw(pic,point(objet_3,E,t){E}..{E}point(objet_4,W,t),MidArrow);
  18. draw(pic,point(objet_4,E,t){E}..{E}point(objet_5,W,t),MidArrow);
  19.  
  20. draw(pic,point(objet_3,S,t){S+W}..{N+W}point(objet_1,SE,t),MidArrow);
  21. draw(pic,point(objet_4,S,t){S+W}..{N+W}point(objet_1,SW,t),MidArrow);
  22. draw(pic,point(objet_4,N,t){N+W}..{S+W}point(objet_2,NE,t),MidArrow);
  23.  
  24. // Boucles
  25. draw(pic,point(objet_1,NE,t){NE}..{SW}point(objet_1,NW,t),MidArrow);
  26. draw(pic,point(objet_2,NE,t){NE}..{SW}point(objet_2,NW,t),MidArrow);
  27. });


C'est pas si mal mais j'ai malgré tout des questions :
1) Le seul gros problème est les boucles ... Comment faire ?
2) Y'a-t-il un moyen d'étiqueter directement les arêtes de l'automate ?
3) Les arêtes sont-elles nécessairement lisses (pas d'angle) ?
4) N'y a-t-il pas intérêt à ulisiser l'extension flowchart ?

Merci

Bruno

Re: automate

Posté : mar. 11 déc. 2012, 19:25
par GM

Figure asymptote e160b02e50ee2c6c5781d51a20916554
*** 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(10cm);
  2.  
  3. transform t=scale(0.75);
  4.  
  5. object objet_1=draw(t*"d\'epart",ellipse,(0,0),xmargin=.1cm,filltype=FillDraw(blue,black));
  6. object objet_2=draw(t*"D",ellipse,(3,0),xmargin=.1cm,filltype=FillDraw(blue,black));
  7. object objet_3=draw(t*"DE",ellipse,(5,0),xmargin=.1cm,filltype=FillDraw(blue,black));
  8. object objet_4=draw(t*"DEU",ellipse,(7,0),xmargin=.1cm,filltype=FillDraw(blue,black));
  9. object objet_5=draw(t*"DEUX",ellipse,(9,0),xmargin=.1cm,filltype=FillDraw(blue,black));
  10.  
  11. add(new void(picture pic, transform t) {
  12. //Fleches directes
  13. draw(pic,Label("a",align=N),point(objet_1,E,t){N+2*E}..{S+2*E}point(objet_2,W,t),MidArrow);
  14. draw(pic,Label("b",align=S),point(objet_2,W,t){S+2*W}..{N+2*W}point(objet_1,E,t),MidArrow);
  15. draw(pic,point(objet_2,E,t){N+E}..{S+E}point(objet_3,W,t),MidArrow);
  16. draw(pic,point(objet_3,W,t){S+W}..{N+W}point(objet_2,E,t),MidArrow);
  17. draw(pic,point(objet_3,E,t){E}..{E}point(objet_4,W,t),MidArrow);
  18. draw(pic,point(objet_4,E,t){E}..{E}point(objet_5,W,t),MidArrow);
  19.  
  20. draw(pic,point(objet_3,S,t){S+W}..{N+W}point(objet_1,SE,t),MidArrow);
  21. draw(pic,point(objet_4,S,t){S+W}..{N+W}point(objet_1,SW,t),MidArrow);
  22. draw(pic,point(objet_4,N,t){N+W}..{S+W}point(objet_2,NE,t),MidArrow);
  23.  
  24. // Boucles
  25. draw(pic,Label("c",align=S),point(objet_1,NE,t){NE}..{SE}point(objet_1,NW,t),MidArrow);
  26. draw(pic,point(objet_2,NE,t){NE}..{SE}point(objet_2,NW,t),MidArrow);
  27. });


2) directement ???
3) je ne comprends pas !?
4) je ne sais pas car je n'ai pas eu l'occasion d'utiliser vraiment flowchart .

Re: automate

Posté : mer. 12 déc. 2012, 05:03
par maurice
Bonjour net merci pour ta réponse :

GM a écrit :
2) directement ???
3) je ne comprends pas !?
4) je ne sais pas car je n'ai pas eu l'occasion d'utiliser vraiment flowchart .


Pour le 2), tu as répondu avec les labels a, b et c.
Pour le 3) et le 4) j'ai utilisé la semaine première pour la 1ere fois flowchart (principalement pour tester) pour ca :

Figure asymptote 13570ba3adc978ef45b899598fcbd05c
*** 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. import flowchart;
  2.  
  3. size(0,300);
  4.  
  5. block block1=roundrectangle(Label("$x$", blue), (0,0), palegreen, red);
  6. block block2=rectangle(Label("$\sqrt{x}+1$", blue), (0,-1), white, black);
  7. block block3=bevel(Label("$\sqrt{x}+1 \geq 3$", blue), (0,-2), white, black);
  8. block block4=diamond(Label("Oui", green), (-1, -3), white, green);
  9. block block5=diamond(Label("Non", green), (1, -3), white, blue);
  10. block block6=rectangle(pack(Label("On prend", green), Label("le double", green)), (-1, -4), white, green);
  11. block block7=rectangle(pack(Label("On prend", blue), Label("le carr\'e", blue), Label("de l'inverse", blue)), (1, -4), white, blue);
  12.  
  13. draw(block1);
  14. draw(block2);
  15. draw(block3);
  16. draw(block4);
  17. draw(block5);
  18. draw(block6);
  19. draw(block7);
  20.  
  21. add(new void(picture pic, transform t) {
  22. blockconnector operator --=blockconnector(pic,t);
  23. // draw(pic,block1.right(t)--block2.top(t));
  24. block1--Down--Arrow--block2;
  25. block2--Down--Arrow--block3;
  26. block3--Left--Down--Arrow--block4;
  27. block3--Right--Down--Arrow--block5;
  28. block4--Down--Arrow--block6;
  29. block5--Down--Arrow--block7;
  30. });


Je n'ai pas trouvé de moyen pour avoir des fléches lisses, c'est-à-dire sans angles (ou sans coins) ; avec la méthode employé avec les object, je ne sais pas en faire et les flèches sont toujours courbes (ou lisses).

C'était par rapport à ça je je faisais la remarque : la syntaxe est relativement simple mais pas moyen de faire des arêtes courbes (en particulier des boucles) ?...

A+
Bruno

Re: automate

Posté : ven. 14 déc. 2012, 02:03
par maurice
Bonsoir,

Que signifie cette ligne

Code : Tout sélectionner

blockconnector operator --=blockconnector(pic,t);


Dans l'index de fonctions j'ai trouvé ça :

Code : Tout sélectionner

block    blockconnector(block, block)    (picture pic, transform t, pen p=<default>, marginT margin(path, pen)=<default>);


Mais ça ne m'apporte pas grand chose !

J'ai tenté de transformer en

Code : Tout sélectionner

blockconnector operator ..=blockconnector(pic,t);


Lorsque l'on recherche sur l'index filtre global : operator et filtre de type block on obtient :

Code : Tout sélectionner

block    operator --    (block b, bool arrowbar(picture, path, pen, marginT(path, pen)));
block    operator --    (block b1, Dir dir);
block    operator --    (block b1, Label label);
block    operator init    ();


Que penser de tout cela, pas de chemin courbe (lisse) entre deux blocks puisqu'il n'exite pas d'operator .. ?

Merci.
A+
Bruno

Re: automate

Posté : ven. 14 déc. 2012, 23:11
par maurice
Je viens de parcourir le module flowchart.asy et tout laisse penser qu'il n'y a pas moyen d'avoir des chemins "courbes" entre les blocs :

Code : Tout sélectionner

struct Dir
{
  pair z;
  void operator init(pair z) {this.z=z;}
}

Dir Right=Dir(right);
Dir Left=Dir(left);
Dir Up=Dir(up);
Dir Down=Dir(down);


Par ailleurs, je m'interroge sur les types object et point comme dans :

Code : Tout sélectionner

object objet_1=draw(t*"d\'epart",ellipse,(0,0),xmargin=.1cm,filltype=FillDraw(blue,black));


et

Code : Tout sélectionner

draw(pic,Label("a",align=N),point(objet_1,E,t){N+2*E}..{S+2*E}point(objet_2,W,t),MidArrow);



A+

Bruno

Re: automate

Posté : ven. 14 déc. 2012, 23:16
par GM
maurice a écrit :Je viens de parcourir le module flowchart.asy et tout laisse penser qu'il n'y a pas moyen d'avoir des chemins "courbes" entre les blocs

Je te le confirme (j'étais occupé de lire le dit-fichier quand un mail m'a signalé ton message).

Re: automate

Posté : ven. 14 déc. 2012, 23:17
par GM
maurice a écrit :Par ailleurs, je m'interroge sur les types object et point comme dans :

Code : Tout sélectionner

object objet_1=draw(t*"d\'epart",ellipse,(0,0),xmargin=.1cm,filltype=FillDraw(blue,black));


et

Code : Tout sélectionner

draw(pic,Label("a",align=N),point(objet_1,E,t){N+2*E}..{S+2*E}point(objet_2,W,t),MidArrow);


Quelle interrogation ? :roll:

Re: automate

Posté : sam. 15 déc. 2012, 00:28
par GM
GM a écrit :Quelle interrogation ? :roll:

Si c'est sur la compréhension générale... je tente une explication (pas facile à faire) :

Le type object permet d'envisager des "labels entourés d'une enveloppe (rectangulaire, en ellipse ou rectangulaire à coins arrondis)" ou des "frames" comme des objets pour avoir la facilité de se servir d'un point choisi de leur contour (enveloppe du label ou bord de frame) (via la fonction point en désignant le point choisi du contour de l'objet par une direction depuis le centre de l'objet).

Quant au pourquoi du t que l'on voit dans les deux lignes que tu précises... c'est en en rapport avec ceci

Code : Tout sélectionner

add(new void(picture pic, transform t) {
...
});

c'est pour pratiquer le dessin différé (defered drawing)... nécessaire pour prendre en compte qu'il y a, dans une figure, des choses qui s'adaptent au size ou unitsize que l'on choisit et d'autres choses qui ne s'adaptent pas (comme justement les labels qui gardent leur taille quand on change d'unité graphique).

Si tu veux pouvoir maintenir un lien qui démarre depuis un bord d'un objet dont la taille reste fixe (quand on change de size ou unitsize) vers un autre élément du graphique, il va y avoir des syntaxes comme ci-dessus à adopter pour demander le tracé différé du lien (afin que celui ci soit préservé lors d'un changement d'unité) et cela passe par le calcul d'une transformation t qui permet que certains objets gardent une taille ou une position fixe même quand l'unité du graphique change.

Je comprendrais aisément que tu n'aies rien compris à ma tentative d'explication fumeuse. :mrgreen:

Re: automate

Posté : sam. 15 déc. 2012, 00:51
par GM
GM a écrit :Je comprendrais aisément que tu n'aies rien compris à ma tentative d'explication fumeuse. :mrgreen:

Je complète ma réponse avec un exemple

Figure asymptote 36c4198ef98becc5e888217bf47080b5
*** 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(100);
  2. draw(unitsquare);
  3. draw("carr\'e",ellipse,(2,2));

Figure asymptote ece579ea2ad2c19a322c3cc77cd39228
*** 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. draw(unitsquare);
  3. draw("carr\'e",ellipse,(2,2));

J'ai changé la taille de ma figure mais l'objet (qui est un "label avec enveloppe (de type ellipse)" n'a pas changé de taille puisque les labels sont de taille indépendante des commandes size ou unitsize).
Tu comprends alors le problème si on veut tracer une flèche entre le carré et l'étiquette qui doit le désigner.
Si le centre de l'ellipse a pour coordonnées (2;2) dans les deux figures, par contre le point de l'ellipse qui est au sud... n'a pas les mêmes coordonnées dans la première et la deuxième figure.

Figure asymptote 1afbf031628ae3968aa6c1f0672a214d
*** 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. draw(unitsquare);
  3. // On nomme cette fois-ci l'objet (qui était implicite dans les figures précédentes)
  4. object etiquette = draw("carr\'e",ellipse,(2,2));
  5. // On demande le dessin différé de la flèche (qui va passer par le biais d'une transformation t qu'Asymptote va calculer
  6. // pour tenir compte du fait que l'ellipse est de taille fixe dans un dessin susceptible de changer de taille via size).
  7. add(new void(picture pic, transform t) {
  8. draw(pic,point(etiquette ,S,t){S}..t*(1,.5),Arrow);
  9. });


Figure asymptote 3886b6403612788493af22343982901e
*** 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(50);
  2. draw(unitsquare);
  3. // On nomme cette fois-ci l'objet (qui était implicite dans les figures précédentes)
  4. object etiquette = draw("carr\'e",ellipse,(2,2));
  5. // On demande le dessin différé de la flèche (qui va passer par le biais d'une transformation t qu'Asymptote va calculer
  6. // pour tenir compte du fait que l'ellipse est de taille fixe dans un dessin susceptible de changer de taille via size).
  7. add(new void(picture pic, transform t) {
  8. draw(pic,point(etiquette ,S,t){S}..t*(1,.5),Arrow);
  9. });

Re: automate

Posté : sam. 15 déc. 2012, 01:37
par maurice
GM a écrit :Je comprendrais aisément que tu n'aies rien compris à ma tentative d'explication fumeuse. :mrgreen:

Si, si je crois avoir bien compris...
Le schéma construit avec flowchart correspond au même principe !
mais je ne saisis pas vraimen,t l'utilité du type block créé dans flowchart.asy par rapport au type object.
Ils permettent tous les deux la création de labels dans des "enveloppes", mais point de point pour les block et seulement des directions verticales ou horizontales pour les arêtes entre deux blocks.
Dommage ! Ces constructions auraient par exemple pu être de bons début pour la création de graphes ou d'arbres pondérés.

A+ et merci.

Bruno