proglin2d

Pour proposer des idées, ou simplement discuter

proglin2d

Messagepar Joffrey » 22 Mars 2010 22:36

Salut Patrick, ca va ? :D

Comme l'indique le titre du sujet, je me suis pencher sur proglin2d, dans les exemples. Je suis en plein dedans avec les premières.
Le fichier proglin2d.teg est très utile mais j'ai trouvé la variable globale infouegal pas très pratique. D'où ma macro Drawdomaine4 qui contrairement aux macros de ton fichier, hachure la partie qui ne convient pas.
Code: Tout sélectionner
[{Drawdomaine4(f(x,y), "signe", [options])
SaveAttr(),
NewMac("f",String(%1),x,y),
$c:=f(0,0),
$a:=f(1,0)-c,
$b:=f(0,1)-c,
{représentation droite d'equation ax+by+c=0 suivant :
                 - la valeur de b
                 - signe de l'expression}

if b<>0 then
   $A:=Xmin-(a*Xmin+c)/b*i, $B:=Xmax-(a*Xmax+c)/b*i,
else $A:=-c/a+Ymin*i, $B:=-c/a+Ymax*i
fi,

{Definition de au-dessus et en dessous de la droite}
tMin:=Xmin, tMax:=Xmax,
$L:=Get(Cartesienne(-a/b*x-c/b),0),
AuDessus:=[for $z in [Xmin,L,Xmax] do z od,
           Reverse(for $z in L do Re(z)+Ymax*i od)],
EnDessous:=[for $z in [Xmin,L,Xmax] do z od,
            Reverse(for $z in L do Re(z)+Ymin*i od)],
AGauche:=[A,B,Xmin+Ymax*i,Xmin+Ymin*i],
ADroite:=[A,B,Xmax+Ymax*i,Xmax+Ymin*i],

if StrComp(%2,"<") Or StrComp(%2,">") then
   draw("line", [A,B], [LineStyle:=dashed, Close:=0, %3]),
else draw("line", [A,B], [LineStyle:=solid, Close:=0,%3]),
fi,

if StrComp(%2,"<") Or StrComp(%2,"<=") then
   if b=0 then
      if a>0 then
         draw("line", ADroite, [Close:=1, LineStyle:=noline, %3])
      elif a<0 then
           draw("line", AGauche, [Close:=1, LineStyle:=noline, %3])
      fi,
   elif b>0 then
      draw("line", AuDessus, [Close:=1, LineStyle:=noline, %3])
   else
       draw("line", EnDessous, [Close:=1, LineStyle:=noline, %3])
   fi
else if b=0 then
        if a>0 then
           draw("line", AGauche, [Close:=1, LineStyle:=noline, %3])
        elif a<0 then
             draw("line", ADroite, [Close:=1, LineStyle:=noline, %3])
        fi,
     elif b>0 then
        draw("line", EnDessous, [Close:=1, LineStyle:=noline, %3])
     else
         draw("line", AuDessus, [Close:=1, LineStyle:=noline, %3])
     fi
fi,
NewMac("f","Nil"),
RestoreAttr()
]


Qui s'utilise comme suit :

Code: Tout sélectionner
[
Fenetre(-5+5*i, 5-5*i, (1+i)),
Marges(0,0,0,0),
draw("domaine4",x+2*y-5,"<=",[Color:=navy, FillStyle:=full, FillOpacity:=0.5, FillColor:=navy]),
draw("domaine4",-5*x+2*y-5,">",[Color:=red, FillStyle:=fdiag, FillColor:=red]),
Arrows:=1, Axes(0,(1+i)), Arrows:=0,


Ce qui donne :
proglin2.png
proglin2.png (28.93 Kio) Consulté 9008 fois


Il y a certainement des erreurs à corriger et des retouches à faire.

PS : Ne pas oublier de charger draw2d.mac, ça évitera de déranger le patron pour rien ;)
L'homme en noir fuyait à travers le désert, et le Pistoléro le suivait ...
Joffrey
 
Messages: 287
Inscription: 16 Juil 2009 17:05
Localisation: Vichy

Re: proglin2d

Messagepar P.Fradin » 22 Mars 2010 23:39

Tu peux changer ta macro ainsi:

Code: Tout sélectionner
{Drawdomaine4(f(x,y), "signe", [options])}
[
SaveAttr(),
NewMac("f",String(%1),x,y),
$c:=f(0,0),
$a:=f(1,0)-c,
$b:=f(0,1)-c,
{représentation droite d'equation ax+by+c=0 suivant :
                 - la valeur de b
                 - signe de l'expression}
$u:=b-i*a,
if b<>0 then
   $A:=Xmin-(a*Xmin+c)/b*i, $B:=Xmax-(a*Xmax+c)/b*i,
else $A:=-c/a+Ymin*i, $B:=-c/a+Ymax*i
fi,
$contour:=[Xmin+i*Ymin, Xmax+i*Ymin,Xmax+i*Ymax,Xmin+i*Ymax],

if StrComp(%2,"<") Or StrComp(%2,">") then
   draw("line", [A,B], [LineStyle:=dashed,  %3, FillStyle:=none]),
else draw("line", [A,B], [LineStyle:=solid, %3, FillStyle:=none]),
fi,

if StrComp(%2,">") Or StrComp(%2,">=") then  u:=-u fi,
draw("line", Clip2D(contour, [A,A+u],1), [LineStyle:=noline, %3]),

DelMac("f"),
RestoreAttr()
]


Elle utilise les nouvelles commandes: Clip2D(liste, contour, close) et la commande DelMac( "macro").
P.Fradin
Avatar de l’utilisateur
P.Fradin
Administrateur du site
 
Messages: 1887
Inscription: 29 Oct 2008 15:04

Re: proglin2d

Messagepar Joffrey » 23 Mars 2010 00:04

Ah quand même, c'est vachement plus simple !

Elle utilise les nouvelles commandes: Clip2D(liste, contour, close) et la commande DelMac( "macro").


Maintenant je les connaît :D
L'homme en noir fuyait à travers le désert, et le Pistoléro le suivait ...
Joffrey
 
Messages: 287
Inscription: 16 Juil 2009 17:05
Localisation: Vichy

Re: proglin2d

Messagepar Joffrey » 23 Mars 2010 00:25

Toujours dans le souci d'homogénéite, voila ce que je voudari faire : draw("domaine4",[expression, "signe"], [options])
D'où dans la macro :
Code: Tout sélectionner
NewMac("f",String(%1[1]),x,y),


Pas de problème
Mais je n'arrive pas à récupérer %1[2] convenablement, je n'ai plus trop les yeux en face des trous, je reprendrai demain.

Bonne nuit...
L'homme en noir fuyait à travers le désert, et le Pistoléro le suivait ...
Joffrey
 
Messages: 287
Inscription: 16 Juil 2009 17:05
Localisation: Vichy

Re: proglin2d

Messagepar Joffrey » 23 Mars 2010 23:56

Bonsoir, j'ai l'impression que de mettre dans un même argument, une expression mathématiques et une chaine de caractère ça complique vraiment les choses.
Je reprendrai ça ce week end (peut etre)
L'homme en noir fuyait à travers le désert, et le Pistoléro le suivait ...
Joffrey
 
Messages: 287
Inscription: 16 Juil 2009 17:05
Localisation: Vichy

Re: proglin2d

Messagepar P.Fradin » 24 Mars 2010 00:38

Je te propose ceci:

Code: Tout sélectionner
{Drawdomaine4( a*x+b*y+c<=0, [options])}
[
SaveAttr(),
SetStr(sg,String(%1)), $p:=StrPos(" ", @sg),
NewMac("f",StrCopy(@sg,1,p-1),x,y),
SetStr(sg, StrCopy(@sg,p+1,StrLength(@sg)-p)), $p:=StrPos(" ", @sg),
SetStr(sg, StrCopy(@sg,1,p-1)),
$c:=f(0,0),
$a:=f(1,0)-c,
$b:=f(0,1)-c,
{représentation droite d'equation ax+by+c=0 suivant :
                 - la valeur de b
                 - signe de l'expression}
$u:=b-i*a,
if b<>0 then
   $A:=Xmin-(a*Xmin+c)/b*i, $B:=Xmax-(a*Xmax+c)/b*i,
else $A:=-c/a+Ymin*i, $B:=-c/a+Ymax*i
fi,
$contour:=[Xmin+i*Ymin, Xmax+i*Ymin,Xmax+i*Ymax,Xmin+i*Ymax],

if StrComp(@sg,"Inf") Or StrComp(@sg,"Sup") then
   draw("line", [A,B], [LineStyle:=dashed,  %2, FillStyle:=none]),
else draw("line", [A,B], [LineStyle:=solid, %2, FillStyle:=none]),
fi,

if StrComp(@sg,"Sup") Or StrComp(@sg,"SupOuE") then  u:=-u fi,
draw("line", Clip2D(contour, [A,A+u],1), [LineStyle:=noline,%2]),

DelMac("f","sg"),
RestoreAttr()
]


Exemple:

Code: Tout sélectionner
[
Fenetre(-5+5*i, 5-5*i, (1+i)),
Marges(0,0,0,0),
draw("domaine4" ,x+2*y-5<=0,  [Color:=navy, FillStyle:=full,  FillColor:=navy]),
draw("domaine4", -5*x+2*y-5>0, [Color:=red, FillStyle:=fdiag, FillColor:=red]),
Arrows:=1, Axes(0,(1+i)), Arrows:=0,
]


Comme tu vois, on met carrément l'inéquation, mais il faut que le second membre soit 0.
P.Fradin
Avatar de l’utilisateur
P.Fradin
Administrateur du site
 
Messages: 1887
Inscription: 29 Oct 2008 15:04

Re: proglin2d

Messagepar Joffrey » 24 Mars 2010 08:43

Bonjour, merci pour les modifs, c'est bien plus pratique avec l'inéquation en entière.

Bonne journée
L'homme en noir fuyait à travers le désert, et le Pistoléro le suivait ...
Joffrey
 
Messages: 287
Inscription: 16 Juil 2009 17:05
Localisation: Vichy


Revenir vers Propositions - Discussions

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 13 invités

cron