Arcs et segments labellisés
2 participants
Page 1 sur 1
Arcs et segments labellisés
J'ai commencé à rédiger deux macros pour dessiner des segments dotés d'un label, ainsi que des arcs de cercle. Pour le moment j'en suis à:
- LabelArc(B,A,C,R,sens,"texte" <,[options]>) (s'utilise comme Arc pour les 5 premiers paramètres) avec les options:
labelpos := inside ou outside (outside par defaut)
labelsep := distance (cm) (0.25 par defaut)
- LabelSeg(A,B, "texte" <,[options]>) (s'utilise comme Seg pour les deux premiers paramètres)
avec les options:
labelpos := center ou top ou bottom ( top par defaut)
labelsep := distance (cm) pour top ou bottom (0.25 par defaut)
Par exemple, le code:
donne actuellement:
Cet exemple montre aussi que dans les options on peut modifier les attributs, cette modification est alors locale.
Toute suggestion sera la bienvenue dans ce fil. Peut-être que pour éviter la multiplicité des macros on pourrait reprendre les macros arc et Seg et ajouter les options, mais on risque de perdre la compatibilité ascendante pour la macro arc.
- LabelArc(B,A,C,R,sens,"texte" <,[options]>) (s'utilise comme Arc pour les 5 premiers paramètres) avec les options:
labelpos := inside ou outside (outside par defaut)
labelsep := distance (cm) (0.25 par defaut)
- LabelSeg(A,B, "texte" <,[options]>) (s'utilise comme Seg pour les deux premiers paramètres)
avec les options:
labelpos := center ou top ou bottom ( top par defaut)
labelsep := distance (cm) pour top ou bottom (0.25 par defaut)
Par exemple, le code:
- Code:
[
Width:=8,
LabelSeg(-3+i,2+3*i,"test", [Arrows:=2, labelpos:=center]),
Ligne([5,-1,3-4*i],0),
LabelArc(5,-1,3-4*i,2,-1,"$\theta$", [labelsep:=0.5])
]
donne actuellement:
Cet exemple montre aussi que dans les options on peut modifier les attributs, cette modification est alors locale.
Toute suggestion sera la bienvenue dans ce fil. Peut-être que pour éviter la multiplicité des macros on pourrait reprendre les macros arc et Seg et ajouter les options, mais on risque de perdre la compatibilité ascendante pour la macro arc.
Re: Arcs et segments labellisés
Je donne le code actuel des macros LabelArc et LabelSeg:
- Code:
{LabelArc(B,A,C,R,sens,"texte" <,[options]>)
options
labelpos = inside ou outside (outside par defaut)
labelsep = distance (cm) pour top ou bottom (0.25 par defaut)
}
[ $inside:=0, $outside:=1,
labelpos:=outside, $labelsep:=0.25,
SaveAttr(), $aux:=Eval(String(%7)),
$B:=%1, $A:=%2, $C:=%3, $R:=%4, $sens:=2*(%5>0)-1,
Rarc(B,A,C,R,sens),
LabelAngle:=0, $u:=(B-A)/Abs(B-A)+(C-A)/Abs(C-A), u:=u/Abs(u),
$direct:=2*(Im(bar(B-A)*(C-A))>0)-1, {sens direct ou non}
u:=direct*sens*u,
if labelpos=outside then
Label(A+(R+labelsep)*u,%6)
elif labelpos=inside then
Label(A+(R-labelsep)*u,%6)
fi,
RestoreAttr()
]
- Code:
{LabelSeg(A,B, "texte" <,[options]>)
options
labelpos = center ou top ou bottom ( top par defaut)
labelsep = distance (cm) pour top ou bottom (0.25 par defaut)
}
[
labelpos:=top, $labelsep:=0.25, $center:=0,
SaveAttr(), $aux:=Eval(String(%4)),
$A:=%1, $B:=%2, $C:=(A+B)/2, Ligne([A,B],0),
LabelAngle:=RealArg(B-A)*rad,
if labelpos=center then
FillStyle:=full, LineStyle:=noline, LabelStyle:=framed,
Label(C,%3),
elif labelpos=top then
$v:=ScrCoordV(i*RealCoordV(B-A)),
Label(C+labelsep*v/Abs(v),%3)
elif labelpos=bottom then
$v:=ScrCoordV(i*RealCoordV(B-A)),
Label(C-labelsep*v/Abs(v),%3)
fi,
RestoreAttr()
]
Re: Arcs et segments labellisés
Bonsoir,
Je suis entrain d'utiliser cette nouvelle macro pour dessiner un graphe avec des arêtes pondérées, mais j'ai un souci, c'est que les labels et les arêtes se chevauchent.
Je peux feinter en rajoutant devant ou derrière le label \hspace{?cm} pour le décaler mais ceci ne marche pas lorsque je supprime de TeXgraph.mac LabelAngle=..., pour que les labels soient sur l'horizontale.
D'où mes deux propositions d'options :
- une qui permette ou non d'activer LabelAngle;
- une option (nombre entre 0 et 1; 0,5 placerait le label au milieu du segment) qui permettrait de placer plus ou moins loin de la première extrémité.
Voici mes propositions, je regarde ça ce soir...
Joffrey
Je suis entrain d'utiliser cette nouvelle macro pour dessiner un graphe avec des arêtes pondérées, mais j'ai un souci, c'est que les labels et les arêtes se chevauchent.
Je peux feinter en rajoutant devant ou derrière le label \hspace{?cm} pour le décaler mais ceci ne marche pas lorsque je supprime de TeXgraph.mac LabelAngle=..., pour que les labels soient sur l'horizontale.
D'où mes deux propositions d'options :
- une qui permette ou non d'activer LabelAngle;
- une option (nombre entre 0 et 1; 0,5 placerait le label au milieu du segment) qui permettrait de placer plus ou moins loin de la première extrémité.
Voici mes propositions, je regarde ça ce soir...
Joffrey
Re: Arcs et segments labellisés
Re,
dans ma serie d'essai, je remarque que le code
J'étudie le code!
Joffrey
dans ma serie d'essai, je remarque que le code
- Code:
LabelSeg(0,3+i,"$r$",labelpos:=top, labelsep:=1)
J'étudie le code!
Joffrey
Re: Arcs et segments labellisés
Pardon,
le dernier message était complètement inutile, j'avais oublié les crochets pour les options!!!!
Le code
Joffrey
le dernier message était complètement inutile, j'avais oublié les crochets pour les options!!!!
Le code
- Code:
LabelSeg(0,3+i,"$r$",[labelpos:=top, labelsep:=1.5])
Joffrey
Re: Arcs et segments labellisés
Bonsoir Joffrey,
Pour que les options soient prises en compte, elles doivent être entre crochets:
D'un autre côté j'ai commencé il y a quelques temps un petit modèle pour les tracés avec labels: segments, arcs, secteurs, accolades. J'ai mis l'option orientedlabel qui active ou non le LabelAngle. Il faut que je mette une nouvelle version test en ligne avant de poster ce modèle.
Je regarde ta proposition pour le position le long du segment.
Pour que les options soient prises en compte, elles doivent être entre crochets:
- Code:
LabelSeg(0,3+i,"$r$",[labelpos:=top, labelsep:=1])
D'un autre côté j'ai commencé il y a quelques temps un petit modèle pour les tracés avec labels: segments, arcs, secteurs, accolades. J'ai mis l'option orientedlabel qui active ou non le LabelAngle. Il faut que je mette une nouvelle version test en ligne avant de poster ce modèle.
Je regarde ta proposition pour le position le long du segment.
Re: Arcs et segments labellisés
Je pense avoir trouvé,
Voici ma version, j'ai rajouté 2 options labelangle et d(nombre entre 0 et 1).
Joffrey
- Code:
LabelSeg = {LabelSeg(A,B, "texte" <,[options]>)
options
labelpos = center ou top ou bottom ( top par defaut)
labelsep = distance (cm) pour top ou bottom (0.25 par defaut)
}
[labelpos:=top, $labelsep:=0.25, $center:=0,
$labelangle:=0, $d:=0.5,
SaveAttr(), $aux:=Eval(String(%4)),
$A:=%1, $B:=%2, $C:=d*A+(1-d)*B, Ligne([A,B],0),
if labelangle=0 then LabelAngle:=RealArg(B-A)*rad else LabelAngle=labelangle fi,
if labelpos=center then
FillStyle:=full, LineStyle:=noline, LabelStyle:=framed,
Label(C,%3),
elif labelpos=top then
$v:=ScrCoordV(i*RealCoordV(B-A)),
Label(C+v/Abs(v)*labelsep,%3)
elif labelpos=bottom then
$v:=ScrCoordV(i*RealCoordV(B-A)),
Label(C-labelsep*v/Abs(v),%3)
fi,
RestoreAttr()
]
Voici ma version, j'ai rajouté 2 options labelangle et d(nombre entre 0 et 1).
Joffrey
Dernière édition par Joffrey le Mer 26 Nov - 0:45, édité 1 fois
Re: Arcs et segments labellisés
Il y avait un souci avec l'orientation des labels.
Modifié dans le code précédent.
Joffrey
Modifié dans le code précédent.
Joffrey
Dernière édition par Joffrey le Mer 26 Nov - 1:01, édité 1 fois
Re: Arcs et segments labellisés
Voila ce que j'obtiens avec les modifications:
avec le code
Joffrey
avec le code
- Code:
[
Width:=8, DotStyle:=bigdot,
A:=-1+i,
B:=1+i,
C:=-2,
D:=-i,
E:=1-i,
F:=3,
LabelSeg(A,B,"15"),
LabelSeg(C,A,"13",labelangle:=1),
LabelSeg(C,D,"12", [labelpos := bottom, labelangle:=1]),
LabelSeg(D,E,"27", [labelpos := bottom, labelangle:=1]),
LabelSeg(E,F,"11", [labelpos := bottom, labelangle:=1]),
LabelSeg(C,F,"17", [d:=0.25,labelangle:=1]),
LabelSeg(A,E,"11", [d:=0.15,labelangle:=1]),
LabelSeg(C,B,"27", [d:=0.75,labelangle:=1]),
LabelSeg(A,D,"2", [d:=0.25,labelangle:=1]),
LabelSeg(D,B,"11", [d:=0.25,labelangle:=1]),
LabelDot(A,"A","N",1),
LabelDot(B,"B","N",1),
LabelDot(C,"C","O",1),
LabelDot(D,"D","S",1),
LabelDot(E,"E","S",1),
LabelDot(F,"F","E",1),
]
Joffrey
Re: Arcs et segments labellisés
Re,
Voici le fichier labels.mac que j'avais commencé:
Les macros proposées pour le moment sont:
labelSeg(A,B, "texte" <,[options]>)
options
labelpos := center ou top ou bottom ( top par defaut)
labelcoord := nombre entre 0 et 1 (0.5 par défaut)
labelsep := distance (cm) pour top ou bottom (0.25 par defaut)
segsep := distance (cm) à la droite (AB) (0 par defaut)
orientedlabel := 0/1 (1 par défaut)
labelangle := angle en degrés (Arg(B-A)*rad par défaut)
labelcolor := couleur (Color par défaut)
labelArc(B,A,C,R,sens,"texte" <,[options]>)
options
labelpos := inside ou outside (outside par defaut)
labelsep := distance à l'arc en cm (0.25 par defaut)
orientedlabel := 0/1 (1 par défaut)
labelangle := angle en degrés
labelcolor := couleur (Color par défaut)
labelWedge(B,A,C,R,"texte" <,[options]>)
options
labelpos := inside ou outside (outside par defaut)
labelsep := distance à l'arc en cm (0.25 par defaut)
labelangle := angle en degrés
orientedlabel := 0/1 (1 par défaut)
labelcolor := couleur (Color par défaut)
labelBrace(a,b, label, [options])
options:
side := left ou right (left par défaut)
bracesep := distance à la droite (ab) (0 par défaut)
labelsep := distance du label à brace (0.25 par défaut)
orientedlabel := 0/1 (0 par défaut)
labelangle := angle en degrés (Arg(B-A)*rad par défaut)
labelcolor := couleur (Color par défaut)
width := pourcentage (epaisseur=width*hauteur, 1/6 par défaut)
PS: j'ai changé ton option d en labelcoord, il faut que les options soient déclarées en globales sinon il peut y avoir des conflits. Par exemple: si tu déclares une variable locale appelée d dans ton élément graphique, alors l'option sera inopérante. Il faut leur donner un nom pas trop commun et les déclarer en variables globales. D'autre part cela me parait plus cohérent de considérer que labelcoord:=0 correspond au premier point (c'est à dire A).
Voici le fichier labels.mac que j'avais commencé:
- Code:
200#
{ labels.mac version 0.1 du 05/10/2008 }
Var labelsvernum = 0.1;
{options}
side = left;
bracesep = 0;
labelsep = 0.25;
orientedlabel = 0;
labelcolor = Nil;
segsep = 0;
labelangle = 0;
center = 0;
labelcoord = 0.5;
Cmd
if labelsver<>labelsvernum then Message(["La version actuelle est ",labelsvernum," alors que votre fichier indique ",labelsver,". Regardez le fichier d'aide pour les changements."]), labelsver:=labelsvernum fi;
Mac
labelBrace = {LabelBrace(a,b, label, [options])
options:
side := left ou right (left par défaut)
bracesep := distance à la droite (ab) (0 par défaut)
labelsep := distance du label à brace (0.25 par défaut)
orientedlabel := 0/1 (0 par défaut)
labelangle := angle en degrés (Arg(B-A)*rad par défaut)
labelcolor := couleur (Color par défaut)
width := pourcentage (epaisseur=width*hauteur, 1/6 par défaut)
}
[
$a:=%1, $b:=%2, side:=left, bracesep:=0, labelsep:=0.25, width:=1/6,
orientedlabel:=0, labelcolor:=Nil,
if Re(a)<=Re(b) then labelangle:=RealArg(b-a)*rad
else labelangle:=RealArg(a-b)*rad fi,
SaveAttr(), $aux:=Eval(String(%4)),
$v:=b-a, $haut:=Abs(v), width:=width*haut,
if labelcolor=Nil then labelcolor:=Color fi,
$u:=ScrCoordV(i*RealCoordV(v)), u:=u/Abs(u),
if side=right then u:=-u fi,
$B:=a+bracesep*u, $A:=B+width*u, $C:=A+v/2, $E:=A+v, $D:=B+v/2, $F:=B+v,
FillStyle:=full, FillColor:=Color,
Path([B,A,D,C,bezier,
D,E,F,bezier,
E,D-width*u/8,C,bezier,
D-width*u/8,A,B,bezier
],0),
if orientedlabel then LabelAngle:=labelangle fi,
if StrComp(%3,"")=0 then Color:=labelcolor, Label(C+labelsep*u, %3) fi,
RestoreAttr()
];
labelArc = {LabelArc(B,A,C,R,sens,"texte" <,[options]>)
options
labelpos := inside ou outside (outside par defaut)
labelsep := distance à l'arc en cm (0.25 par defaut)
orientedlabel := 0/1 (1 par défaut)
labelangle := angle en degrés
labelcolor := couleur (Color par défaut)
}
[$inside:=0, $outside:=1, labelpos:=outside, labelsep:=0.25, labelcolor:=Nil,
labelangle:=Nil,
SaveAttr(), $aux:=Eval(String(%7)),
$B:=%1, $A:=%2, $C:=%3, $R:=%4, $sens:=2*(%5>0)-1,
if labelcolor=Nil then labelcolor:=Color fi,
arc(B,A,C,R,sens),
if StrComp(%6,"")=0 then
Color:=labelcolor,
$u:=(B-A)/abs(B-A)+(C-A)/abs(C-A), u:=u/abs(u),
$direct:=2*(Im(bar(B-A)*(C-A))>0)-1, {sens direct ou non}
u:=direct*sens*u, if labelangle=Nil then labelangle:=RealArg(u)*rad fi,
if orientedlabel then LabelAngle:=labelangle else LabelAngle:=0 fi,
$u:=(B-A)/abs(B-A)+(C-A)/abs(C-A), u:=u/abs(u),
$direct:=2*(Im(bar(B-A)*(C-A))>0)-1, {sens direct ou non}
u:=direct*sens*u,
if labelpos=outside then
Label(A+(R+labelsep)*u,%6)
elif labelpos=inside then
Label(A+(R-labelsep)*u,%6)
fi
fi,
RestoreAttr()
];
labelSeg = {LabelSeg(A,B, "texte" <,[options]>)
options
labelpos := center ou top ou bottom ( top par defaut)
labelcoord := nombre entre 0 et 1 (0.5 par défaut)
labelsep := distance (cm) pour top ou bottom (0.25 par defaut)
segsep := distance (cm) à la droite (AB) (0 par defaut)
orientedlabel := 0/1 (1 par défaut)
labelangle := angle en degrés (Arg(B-A)*rad par défaut)
labelcolor := couleur (Color par défaut)
}
[labelpos:=top, labelsep:=0.25, orientedlabel:=1, $A:=%1, $B:=%2,
labelcolor:=Nil, segsep:=0, labelangle:=RealArg(B-A)*rad, labelcoord:=0.5,
SaveAttr(), $aux:=Eval(String(%4)),
if labelcolor=Nil then labelcolor:=Color fi,
if segsep<>0 then
$v:=B-A, $u:=ScrCoordV(i*RealCoordV(v)), u:=segsep*u/Abs(u),
Inc(A,u), Inc(B,u)
fi,
$C:=A+labelcoord*(B-A),
Ligne([A,B],0),
if StrComp(%3,"")=0 then
Color:=labelcolor,
if orientedlabel then LabelAngle:=labelangle else LabelAngle:=0 fi,
if labelpos=center then
FillStyle:=full, LineStyle:=noline, LabelStyle:=framed,
Label(C,%3),
elif labelpos=top then
$v:=ScrCoordV(i*RealCoordV(B-A)),
Label(C+labelsep*v/Abs(v),%3)
elif labelpos=bottom then
$v:=ScrCoordV(i*RealCoordV(B-A)),
Label(C-labelsep*v/Abs(v),%3)
fi
fi,
RestoreAttr()
];
labelWedge = {LabelWegde(B,A,C,R,"texte" <,[options]>)
options
labelpos := inside ou outside (outside par defaut)
labelsep := distance à l'arc en cm (0.25 par defaut)
labelangle := angle en degrés
orientedlabel := 0/1 (1 par défaut)
labelcolor := couleur (Color par défaut)
}
[$inside:=0, $outside:=1, labelpos:=outside, labelsep:=0.25, labelcolor:=Nil,
labelangle:=Nil,
SaveAttr(), $aux:=Eval(String(%6)),
$B:=%1, $A:=%2, $C:=%3, $R:=%4,
if labelcolor=Nil then labelcolor:=Color fi,
if Arg((C-A)/(B-A))>0 then $sens:=1 else sens:=-1 fi,
$d:=A+R*(B-A)/abs(B-A),
Path([d,A,C,R,sens,arc,A,line], 1),
if StrComp(%5,"")=0 then
Color:=labelcolor,
$u:=(B-A)/abs(B-A)+(C-A)/abs(C-A), u:=u/abs(u),
$direct:=2*(Im(bar(B-A)*(C-A))>0)-1, {sens direct ou non}
u:=direct*sens*u, if labelangle=Nil then labelangle:=RealArg(u)*rad fi,
if orientedlabel then LabelAngle:=labelangle else LabelAngle:=0 fi,
$u:=(B-A)/abs(B-A)+(C-A)/abs(C-A), u:=u/abs(u),
if labelpos=outside then
Label(A+(R+labelsep)*u,%5)
elif labelpos=inside then
Label(A+(R-labelsep)*u,%5)
fi
fi,
RestoreAttr()
];
Les macros proposées pour le moment sont:
labelSeg(A,B, "texte" <,[options]>)
options
labelpos := center ou top ou bottom ( top par defaut)
labelcoord := nombre entre 0 et 1 (0.5 par défaut)
labelsep := distance (cm) pour top ou bottom (0.25 par defaut)
segsep := distance (cm) à la droite (AB) (0 par defaut)
orientedlabel := 0/1 (1 par défaut)
labelangle := angle en degrés (Arg(B-A)*rad par défaut)
labelcolor := couleur (Color par défaut)
labelArc(B,A,C,R,sens,"texte" <,[options]>)
options
labelpos := inside ou outside (outside par defaut)
labelsep := distance à l'arc en cm (0.25 par defaut)
orientedlabel := 0/1 (1 par défaut)
labelangle := angle en degrés
labelcolor := couleur (Color par défaut)
labelWedge(B,A,C,R,"texte" <,[options]>)
options
labelpos := inside ou outside (outside par defaut)
labelsep := distance à l'arc en cm (0.25 par defaut)
labelangle := angle en degrés
orientedlabel := 0/1 (1 par défaut)
labelcolor := couleur (Color par défaut)
labelBrace(a,b, label, [options])
options:
side := left ou right (left par défaut)
bracesep := distance à la droite (ab) (0 par défaut)
labelsep := distance du label à brace (0.25 par défaut)
orientedlabel := 0/1 (0 par défaut)
labelangle := angle en degrés (Arg(B-A)*rad par défaut)
labelcolor := couleur (Color par défaut)
width := pourcentage (epaisseur=width*hauteur, 1/6 par défaut)
PS: j'ai changé ton option d en labelcoord, il faut que les options soient déclarées en globales sinon il peut y avoir des conflits. Par exemple: si tu déclares une variable locale appelée d dans ton élément graphique, alors l'option sera inopérante. Il faut leur donner un nom pas trop commun et les déclarer en variables globales. D'autre part cela me parait plus cohérent de considérer que labelcoord:=0 correspond au premier point (c'est à dire A).
Re: Arcs et segments labellisés
P.Fradin a écrit :
PS: j'ai changé ton option d en labelcoord
Tu fais bien!
P.Fradin a écrit :
D'autre part cela me parait plus cohérent de considérer que labelcoord:=0 correspond au premier point (c'est à dire A).
Je l'avais vu aussi, j'allais le changer.
J'ai essayé vite fait cette macro, après chargement j'ai ce message qui s'affiche :
- Code:
La version actuelle est 0.1 alors que votre fichier indique .
Regardez le fichier d'aide pour les changements.
J'ai pas trouvé labelsvernum pour faire les changements, mais peu importe.
Il se fait tard, je reprend ça demain (j'essaie...); merci en tout cas.
Joffrey
Re: Arcs et segments labellisés
Joffrey a écrit:J'ai essayé vite fait cette macro, après chargement j'ai ce message qui s'affiche :
- Code:
La version actuelle est 0.1 alors que votre fichier indique .
Regardez le fichier d'aide pour les changements.
J'ai pas trouvé labelsvernum pour faire les changements, mais peu importe.
Ne t'inquiète pas cela est sans incidence. Cette variable est normlement déclarée dans le fichier labels.mod qui va avec labels.mac.
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|