Arcs et segments labellisés

Voir le sujet précédent Voir le sujet suivant Aller en bas

Arcs et segments labellisés

Message  P.Fradin le Lun 6 Oct - 10:52

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:

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.

_________________
P.Fradin

P.Fradin
Admin

Nombre de messages : 1133
Age : 55
Date d'inscription : 19/01/2008

Voir le profil de l'utilisateur http://texgraph.tuxfamily.org/

Revenir en haut Aller en bas

Re: Arcs et segments labellisés

Message  P.Fradin le Jeu 9 Oct - 22:50

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()
]

_________________
P.Fradin

P.Fradin
Admin

Nombre de messages : 1133
Age : 55
Date d'inscription : 19/01/2008

Voir le profil de l'utilisateur http://texgraph.tuxfamily.org/

Revenir en haut Aller en bas

Re: Arcs et segments labellisés

Message  Joffrey le Mar 25 Nov - 23:44

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

Joffrey

Nombre de messages : 179
Age : 35
Localisation : Vichy(03) / Clermont-Ferrand(63)
Date d'inscription : 13/06/2008

Voir le profil de l'utilisateur http://mathex.servhome.org

Revenir en haut Aller en bas

Re: Arcs et segments labellisés

Message  Joffrey le Mar 25 Nov - 23:49

Re,

dans ma serie d'essai, je remarque que le code
Code:
LabelSeg(0,3+i,"$r$",labelpos:=top, labelsep:=1)
n'éloigne pas le label de 1 cm.

J'étudie le code!

Joffrey

Joffrey

Nombre de messages : 179
Age : 35
Localisation : Vichy(03) / Clermont-Ferrand(63)
Date d'inscription : 13/06/2008

Voir le profil de l'utilisateur http://mathex.servhome.org

Revenir en haut Aller en bas

Re: Arcs et segments labellisés

Message  Joffrey le Mer 26 Nov - 0:04

Pardon,

le dernier message était complètement inutile, j'avais oublié les crochets pour les options!!!! affraid
Le code
Code:
LabelSeg(0,3+i,"$r$",[labelpos:=top, labelsep:=1.5])
donne un label à 1,5cm du segment.

Joffrey

Joffrey

Nombre de messages : 179
Age : 35
Localisation : Vichy(03) / Clermont-Ferrand(63)
Date d'inscription : 13/06/2008

Voir le profil de l'utilisateur http://mathex.servhome.org

Revenir en haut Aller en bas

Re: Arcs et segments labellisés

Message  P.Fradin le Mer 26 Nov - 0:07

Bonsoir Joffrey,

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.

_________________
P.Fradin

P.Fradin
Admin

Nombre de messages : 1133
Age : 55
Date d'inscription : 19/01/2008

Voir le profil de l'utilisateur http://texgraph.tuxfamily.org/

Revenir en haut Aller en bas

Re: Arcs et segments labellisés

Message  Joffrey le Mer 26 Nov - 0:16

Je pense avoir trouvé,

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

Joffrey

Nombre de messages : 179
Age : 35
Localisation : Vichy(03) / Clermont-Ferrand(63)
Date d'inscription : 13/06/2008

Voir le profil de l'utilisateur http://mathex.servhome.org

Revenir en haut Aller en bas

Re: Arcs et segments labellisés

Message  Joffrey le Mer 26 Nov - 0:45

Il y avait un souci avec l'orientation des labels.

Modifié dans le code précédent.

Joffrey


Dernière édition par Joffrey le Mer 26 Nov - 1:01, édité 1 fois

Joffrey

Nombre de messages : 179
Age : 35
Localisation : Vichy(03) / Clermont-Ferrand(63)
Date d'inscription : 13/06/2008

Voir le profil de l'utilisateur http://mathex.servhome.org

Revenir en haut Aller en bas

Re: Arcs et segments labellisés

Message  Joffrey le Mer 26 Nov - 0:55

Voila ce que j'obtiens avec les modifications:



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

Joffrey

Nombre de messages : 179
Age : 35
Localisation : Vichy(03) / Clermont-Ferrand(63)
Date d'inscription : 13/06/2008

Voir le profil de l'utilisateur http://mathex.servhome.org

Revenir en haut Aller en bas

Re: Arcs et segments labellisés

Message  P.Fradin le Mer 26 Nov - 1:09

Re,

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).

_________________
P.Fradin

P.Fradin
Admin

Nombre de messages : 1133
Age : 55
Date d'inscription : 19/01/2008

Voir le profil de l'utilisateur http://texgraph.tuxfamily.org/

Revenir en haut Aller en bas

Re: Arcs et segments labellisés

Message  Joffrey le Mer 26 Nov - 1:36

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

Joffrey

Nombre de messages : 179
Age : 35
Localisation : Vichy(03) / Clermont-Ferrand(63)
Date d'inscription : 13/06/2008

Voir le profil de l'utilisateur http://mathex.servhome.org

Revenir en haut Aller en bas

Re: Arcs et segments labellisés

Message  P.Fradin le Mer 26 Nov - 9:57

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.

_________________
P.Fradin

P.Fradin
Admin

Nombre de messages : 1133
Age : 55
Date d'inscription : 19/01/2008

Voir le profil de l'utilisateur http://texgraph.tuxfamily.org/

Revenir en haut Aller en bas

Re: Arcs et segments labellisés

Message  Contenu sponsorisé Aujourd'hui à 5:58


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum