Graphes pondérés

Tout ce qui concerne le langage Asymptote. Ce langage est utilisable sur le forum via les balises asy.
[participation réservée aux utilisateurs inscrits]
Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
loicwood
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 121
Inscription : dimanche 23 octobre 2011, 11:24
Localisation : Souppes sur Loing

Graphes pondérés

Message non lu par loicwood »

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.
texmaker
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 226
Inscription : vendredi 30 juillet 2010, 12:19
Statut actuel : Enseignant

Re: Graphes pondérés

Message non lu par texmaker »

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.1.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
loicwood
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 121
Inscription : dimanche 23 octobre 2011, 11:24
Localisation : Souppes sur Loing

Re: Graphes pondérés

Message non lu par loicwood »

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é ?
texmaker
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 226
Inscription : vendredi 30 juillet 2010, 12:19
Statut actuel : Enseignant

Re: Graphes pondérés

Message non lu par texmaker »

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.1.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
loicwood
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 121
Inscription : dimanche 23 octobre 2011, 11:24
Localisation : Souppes sur Loing

Re: Graphes pondérés

Message non lu par loicwood »

Merci pour ces réponses.