Graphes pondérés

Tout ce qui concerne l'utilisation ou l'installation d'Asymptote.

Modérateur: gdm_asy

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

Graphes pondérés

Messagepar loicwood » Mercredi 26 Décembre 2012, 17:23

Bonsoir,

j'essaye de construire un arbre pondéré représentant une marche aléatoire sur les sommets d'un tétraèdre de sommets A, B, C et D. En utilisant PdfAdd, j'obtiens le code suivant :
Code: Tout sélectionner
// préambule asymptote
usepackage("amsmath,amssymb");
usepackage("inputenc","utf8");
// code figure
unitsize(1cm,1cm);
object sommet0=draw(Label("A"),ellipse,(0,0),NoFill);
object sommet1=draw(Label("B"),ellipse,(14,0),NoFill);
object sommet2=draw(Label("C"),ellipse,(14,-2),NoFill);
object sommet3=draw(Label("D"),ellipse,(0,-2),NoFill);
add(new void(picture pic, transform t) {
path arete01=point(sommet0,dir(degrees((14,0),true)),t){dir(25+degrees((14,0),true))}..point(sommet1,dir(180+degrees((14,0),true)),t);
draw(pic,arete01,Arrow);
label(pic,scale(.7)*"$\frac{1}{3}$",relpoint(arete01,.5),Relative(dir(90+degrees((14,0),true))),Fill(1,white));
path arete10=point(sommet1,dir(degrees((-14,0),true)),t){dir(25+degrees((-14,0),true))}..point(sommet0,dir(180+degrees((-14,0),true)),t);
draw(pic,arete10,Arrow);
label(pic,scale(.7)*"$\frac{1}{3}$",relpoint(arete10,.5),Relative(dir(90+degrees((-14,0),true))),Fill(1,white));
path arete02=point(sommet0,dir(degrees((14,-2),true)),t){dir(25+degrees((14,-2),true))}..point(sommet2,dir(180+degrees((14,-2),true)),t);
draw(pic,arete02,Arrow);
path arete20=point(sommet2,dir(degrees((-14,2),true)),t){dir(25+degrees((-14,2),true))}..point(sommet0,dir(180+degrees((-14,2),true)),t);
draw(pic,arete20,Arrow);
label(pic,scale(.7)*"$\frac{1}{3}$",relpoint(arete20,.5),Relative(dir(90+degrees((-14,2),true))),Fill(1,white));
path arete03=point(sommet0,dir(degrees((0,-2),true)),t){dir(25+degrees((0,-2),true))}..point(sommet3,dir(180+degrees((0,-2),true)),t);
draw(pic,arete03,Arrow);
label(pic,scale(.7)*"$\frac{1}{3}$",relpoint(arete03,.5),Relative(dir(90+degrees((0,-2),true))),Fill(1,white));
path arete30=point(sommet3,dir(degrees((0,2),true)),t){dir(25+degrees((0,2),true))}..point(sommet0,dir(180+degrees((0,2),true)),t);
draw(pic,arete30,Arrow);
label(pic,scale(.7)*"$\frac{1}{3}$",relpoint(arete30,.5),Relative(dir(90+degrees((0,2),true))),Fill(1,white));
path arete12=point(sommet1,dir(degrees((0,-2),true)),t){dir(25+degrees((0,-2),true))}..point(sommet2,dir(180+degrees((0,-2),true)),t);
draw(pic,arete12,Arrow);
label(pic,scale(.7)*"$\frac{1}{3}$",relpoint(arete12,.5),Relative(dir(90+degrees((0,-2),true))),Fill(1,white));
path arete21=point(sommet2,dir(degrees((0,2),true)),t){dir(25+degrees((0,2),true))}..point(sommet1,dir(180+degrees((0,2),true)),t);
draw(pic,arete21,Arrow);
label(pic,scale(.7)*"$\frac{1}{3}$",relpoint(arete21,.5),Relative(dir(90+degrees((0,2),true))),Fill(1,white));
path arete13=point(sommet1,dir(degrees((-14,-2),true)),t){dir(25+degrees((-14,-2),true))}..point(sommet3,dir(180+degrees((-14,-2),true)),t);
draw(pic,arete13,Arrow);
label(pic,scale(.7)*"$\frac{1}{3}$",relpoint(arete13,.5),Relative(dir(90+degrees((-14,-2),true))),Fill(1,white));
path arete31=point(sommet3,dir(degrees((14,2),true)),t){dir(25+degrees((14,2),true))}..point(sommet1,dir(180+degrees((14,2),true)),t);
draw(pic,arete31,Arrow);
label(pic,scale(.7)*"$\frac{1}{3}$",relpoint(arete31,.5),Relative(dir(90+degrees((14,2),true))),Fill(1,white));
path arete23=point(sommet2,dir(degrees((-14,0),true)),t){dir(25+degrees((-14,0),true))}..point(sommet3,dir(180+degrees((-14,0),true)),t);
draw(pic,arete23,Arrow);
label(pic,scale(.7)*"$\frac{1}{3}$",relpoint(arete23,.5),Relative(dir(90+degrees((-14,0),true))),Fill(1,white));
path arete32=point(sommet3,dir(degrees((14,0),true)),t){dir(25+degrees((14,0),true))}..point(sommet2,dir(180+degrees((14,0),true)),t);
draw(pic,arete32,Arrow);
label(pic,scale(.7)*"$\frac{1}{3}$",relpoint(arete32,.5),Relative(dir(90+degrees((14,0),true))),Fill(1,white));
});
shipout(bbox(0.1cm,0.1cm,white));



Est-il possible de modifier la courbure des arêtes, je ne trouve pas cela très lisible.

Merci.
loicwood
Kilo-utilisateur
 
Messages: 118
Inscription: Dimanche 23 Octobre 2011, 10:24
Localisation: Souppes sur Loing
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: Graphes pondérés

Messagepar texmaker » Mercredi 26 Décembre 2012, 21:19

Graphe difficile à réaliser de façon automatique.
Une solution possible :
Code: Tout sélectionner
// préambule asymptote
usepackage("amsmath,amssymb");
usepackage("inputenc","utf8");
// code figure
unitsize(1cm,1cm);
object sommet0=draw(Label("A"),ellipse,(4,0),NoFill);
object sommet1=draw(Label("B"),ellipse,(8,-2),NoFill);
object sommet2=draw(Label("C"),ellipse,(4,-4),NoFill);
object sommet3=draw(Label("D"),ellipse,(0,-2),NoFill);
add(new void(picture pic, transform t) {
path arete01=point(sommet0,dir(degrees((4,-2),true)),t){dir(12+degrees((4,-2),true))}..point(sommet1,dir(180+degrees((4,-2),true)),t);
draw(pic,arete01,Arrow);
label(pic,scale(.5)*"$\frac{1}{3}$",relpoint(arete01,.5),Relative(dir(90+degrees((4,-2),true))),Fill(1,white));
path arete12=point(sommet1,dir(degrees((-4,2),true)),t){dir(12+degrees((-4,2),true))}..point(sommet0,dir(180+degrees((-4,2),true)),t);
draw(pic,arete12,Arrow);
label(pic,scale(.5)*"$\frac{1}{3}$",relpoint(arete12,.5),Relative(dir(90+degrees((-4,2),true))),Fill(1,white));
path arete02=point(sommet0,dir(degrees((0,-4),true)),t){dir(12+degrees((0,-4),true))}..point(sommet2,dir(180+degrees((0,-4),true)),t);
draw(pic,arete02,Arrow);
label(pic,scale(.5)*"$\frac{1}{3}$",relpoint(arete02,.5),Relative(dir(90+degrees((0,-4),true))),Fill(1,white));
path arete20=point(sommet2,dir(degrees((0,4),true)),t){dir(12+degrees((0,4),true))}..point(sommet0,dir(180+degrees((0,4),true)),t);
draw(pic,arete20,Arrow);
label(pic,scale(.5)*"$\frac{1}{3}$",relpoint(arete20,.5),Relative(dir(90+degrees((0,4),true))),Fill(1,white));
path arete03=point(sommet0,dir(degrees((-4,-2),true)),t){dir(12+degrees((-4,-2),true))}..point(sommet3,dir(180+degrees((-4,-2),true)),t);
draw(pic,arete03,Arrow);
label(pic,scale(.5)*"$\frac{1}{3}$",relpoint(arete03,.5),Relative(dir(90+degrees((-4,-2),true))),Fill(1,white));
path arete30=point(sommet3,dir(degrees((4,2),true)),t){dir(12+degrees((4,2),true))}..point(sommet0,dir(180+degrees((4,2),true)),t);
draw(pic,arete30,Arrow);
label(pic,scale(.5)*"$\frac{1}{3}$",relpoint(arete30,.5),Relative(dir(90+degrees((4,2),true))),Fill(1,white));
path arete12=point(sommet1,dir(degrees((-4,-2),true)),t){dir(12+degrees((-4,-2),true))}..point(sommet2,dir(180+degrees((-4,-2),true)),t);
draw(pic,arete12,Arrow);
label(pic,scale(.5)*"$\frac{1}{3}$",relpoint(arete12,.5),Relative(dir(90+degrees((-4,-2),true))),Fill(1,white));
path arete21=point(sommet2,dir(degrees((4,2),true)),t){dir(12+degrees((4,2),true))}..point(sommet1,dir(180+degrees((4,2),true)),t);
draw(pic,arete21,Arrow);
label(pic,scale(.5)*"$\frac{1}{3}$",relpoint(arete21,.5),Relative(dir(90+degrees((4,2),true))),Fill(1,white));
path arete13=point(sommet1,dir(degrees((-8,0),true)),t){dir(12+degrees((-8,0),true))}..point(sommet3,dir(180+degrees((-8,0),true)),t);
draw(pic,arete13,Arrow);
label(pic,scale(.5)*"$\frac{1}{3}$",relpoint(arete13,.4),Relative(dir(90+degrees((-8,0),true))),Fill(1,white));
path arete31=point(sommet3,dir(degrees((8,0),true)),t){dir(12+degrees((8,0),true))}..point(sommet1,dir(180+degrees((8,0),true)),t);
draw(pic,arete31,Arrow);
label(pic,scale(.5)*"$\frac{1}{3}$",relpoint(arete31,.4),Relative(dir(90+degrees((8,0),true))),Fill(1,white));
path arete23=point(sommet2,dir(degrees((-4,2),true)),t){dir(12+degrees((-4,2),true))}..point(sommet3,dir(180+degrees((-4,2),true)),t);
draw(pic,arete23,Arrow);
label(pic,scale(.5)*"$\frac{1}{3}$",relpoint(arete23,.5),Relative(dir(90+degrees((-4,2),true))),Fill(1,white));
path arete32=point(sommet3,dir(degrees((4,-2),true)),t){dir(12+degrees((4,-2),true))}..point(sommet2,dir(180+degrees((4,-2),true)),t);
draw(pic,arete32,Arrow);
label(pic,scale(.5)*"$\frac{1}{3}$",relpoint(arete32,.5),Relative(dir(90+degrees((4,-2),true))),Fill(1,white));
});
shipout(bbox(0.1cm,0.1cm,white));

Remarques :
a) l'angle des arêtes est de 25° par défaut. C'est le 25 dans dir(25+degrees(.... Il suffit de remplacer le 25 par un autre angle sur les arêtes souhaitées.
b) les arêtes sont reconnaissables par leur nom. Exemple : arete13 représente l'arête débutant au sommet 1 et finissant au sommet 3.
c) La position du poids le long de l'arête (0.5 : milieu défaut) peut se régler dans relpoint(aretexx,.5) : il suffit de remplacer 0.5 par un autre coefficient.
d) Pour avoir la flèche au milieu d'une arête au lieu de l'extrémité, on peut remplacer draw(pic,aretexx,Arrow); par draw(pic,aretexx,MidArrow);
Texmaker (version courante : 5.0.3) : éditeur LaTeX libre et multi-plateforme avec afficheur pdf.
PdfAdd : Tableaux variations, courbes, arbres, graphes, loi binomiale, cercle trigo, suites pour pdflatex et Asymptote
Site de documentation sur LaTeX
texmaker
Kilo-utilisateur
 
Messages: 226
Inscription: Vendredi 30 Juillet 2010, 11:19
Statut actuel: Actif et salarié | Enseignant

Re: Graphes pondérés

Messagepar loicwood » Jeudi 27 Décembre 2012, 00:08

Merci, c'est nickel !

Peut-on modifier la couleur des arcs ? Peut-être un paramètre supplémentaire dans draw ? j'ai essayé avec pen p=rgb(1,0,0) mais cela ne donne rien.

J'aurais une autre question, cette fois-ci sur les arbres : comment peut-on modifier la longueur des branches horizontales (ce qui devrait modifier également la longueur des autres branches), car je trouve que c'est un peu trop ramassé ?
loicwood
Kilo-utilisateur
 
Messages: 118
Inscription: Dimanche 23 Octobre 2011, 10:24
Localisation: Souppes sur Loing
Statut actuel: Actif et salarié | Enseignant

Re: Graphes pondérés

Messagepar texmaker » Jeudi 27 Décembre 2012, 08:05

loicwood a écrit:Peut-on modifier la couleur des arcs ? Peut-être un paramètre supplémentaire dans draw ? j'ai essayé avec pen p=rgb(1,0,0) mais cela ne donne rien.

Pour avoir une arête en rouge : draw(pic,arete??,red,Arrow); au lieu de draw(pic,arete??,Arrow);
loicwood a écrit:Merci, c'est nickel !
J'aurais une autre question, cette fois-ci sur les arbres : comment peut-on modifier la longueur des branches horizontales (ce qui devrait modifier également la longueur des autres branches), car je trouve que c'est un peu trop ramassé ?

Pour les arbres, il faut jouer avec les 3 paramètres du début (et notamment sur treeLevelStep pour la longueur), mais ça va jouer sur toutes les branches (l'arbre étant généré par les routines layout et drawall) :
real treeNodeStep = 0.3cm;
real treeLevelStep = 2.2cm;
real treeMinNodeHeight = 0.6cm;
Texmaker (version courante : 5.0.3) : éditeur LaTeX libre et multi-plateforme avec afficheur pdf.
PdfAdd : Tableaux variations, courbes, arbres, graphes, loi binomiale, cercle trigo, suites pour pdflatex et Asymptote
Site de documentation sur LaTeX
texmaker
Kilo-utilisateur
 
Messages: 226
Inscription: Vendredi 30 Juillet 2010, 11:19
Statut actuel: Actif et salarié | Enseignant

Re: Graphes pondérés

Messagepar loicwood » Jeudi 27 Décembre 2012, 10:15

Merci pour ces réponses.
loicwood
Kilo-utilisateur
 
Messages: 118
Inscription: Dimanche 23 Octobre 2011, 10:24
Localisation: Souppes sur Loing
Statut actuel: Actif et salarié | Enseignant


Retourner vers Asymptote

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités