Représenter les solutions d'une inéquation.

C'est un problème récurrent pour ceux qui produisent leurs documents en utilisant l'informatique. Voilà une méthode pour faire cela avec metapost.

inequation.mp [ source brut ]

 %prologues:=2;
 input geometriesyr16;
 input TEX;
 
 string pos,sol,style,affichagesolu,affichageval;
 
 style="hachures";
 affichagesolu="non";
 affichageval="oui";
 
 %Macro pour représenter graphiquement les solutions d'une inéquation
 vardef soline(expr valeur,ang,couleur)=
   save $;
   picture dep,$;
   pair ww;
   y.u:=5mm;
   dep=image(
     drawarrow (xpart(z.so),ypart(placepoint(0,0)))
     --(xpart(z.ne*cm),ypart(placepoint(0,0))) withpen pencircle scaled 2bp;
     graduantx.bot;
     pair O;
     O=placepoint(0,0);
     marque_p:="plein";
     pointe(O);
     label.bot(btex $O$ etex,O);
     );
   $=image(
     trace dep;
     ww=placepoint(valeur,0);
     pointe(ww);
     marque_p:="non";
     if pos="inf":
       if style="hachures":
 	draw hachurage(placepoint(valeur,0.4)--placepoint(valeur,-0.4)--
 	  (xpart(z.ne),ypart(placepoint(0,-0.4)))--
 	  (xpart(z.ne),ypart(placepoint(0,0.4)))--cycle,ang,0.3,0)
 	withcolor couleur
       elseif style="repasse":
 	draw (x.so*cm,ypart(placepoint(0,0)))--(placepoint(valeur,0))
 	withpen pencircle scaled 2bp withcolor couleur
       fi;
       if sol="non":
 	if style="hachures":
 	  draw placepoint(valeur+0.3,0.5)--placepoint(valeur,0.5)--
 	  placepoint(valeur,-0.5)--placepoint(valeur+0.3,-0.5)
 	  withpen pencircle scaled 2bp withcolor couleur
 	else:
 	  draw placepoint(valeur+0.3,0.5)--placepoint(valeur,0.5)--
 	  placepoint(valeur,-0.5)--placepoint(valeur+0.3,-0.5)
 	  withpen pencircle scaled 2bp
 	fi;
       elseif sol="oui":
 	draw placepoint(valeur-0.3,0.5)--placepoint(valeur,0.5)
 	--placepoint(valeur,-0.5)--placepoint(valeur-0.3,-0.5)
 	withpen pencircle scaled 2bp withcolor couleur
       fi;
       if affichagesolu="non":
 	long:=abs((xpart(z.ne),ypart(placepoint(0,-0.4)))-
 	  placepoint(valeur,-0.4));
 	label.bot(TEX("$\underbrace{\hbox to"&
 	    decimal(long)&"pt{}}_{\hbox{Ce qui ne convient pas}}$"),
 	  iso(placepoint(valeur,-0.4),(xpart(z.ne),
 	      ypart(placepoint(0,-0.4)))));
       elseif affichagesolu="oui":
 	long:=abs((xpart(z.so),ypart(placepoint(0,-0.4)))-
 	  placepoint(valeur,-0.4));
 	label.bot(TEX("$\underbrace{\hbox to"&
 	    decimal(long)&"pt{}}_{\hbox{Nombres solutions}}$"),
 	  iso(placepoint(valeur,-0.4),(xpart(z.so),
 	      ypart(placepoint(0,-0.4)))));
       fi;
       if affichageval="oui":
 	label.top(TEX("$"&decimal(valeur)&"$"),placepoint(valeur,0.5));
       fi;
     elseif pos="sup":
       if style="hachures":
 	draw hachurage(placepoint(valeur,0.4)--placepoint(valeur,-0.4)
 	  --(xpart(z.so),ypart(placepoint(0,-0.4)))--
 	  (xpart(z.so),ypart(placepoint(0,0.4)))--cycle,ang,0.3,0)
 	withcolor couleur
       elseif style="repasse":
 	draw placepoint(valeur,0)--(x.ne*cm,ypart(placepoint(0,0)))
 	withpen pencircle scaled 2bp withcolor couleur
       fi;
       if sol="non":
 	if style="hachures":
 	  draw placepoint(valeur-0.3,0.5)--placepoint(valeur,0.5)--
 	  placepoint(valeur,-0.5)--placepoint(valeur-0.3,-0.5) 
 	  withpen pencircle scaled 2bp withcolor couleur
 	else:
 	  draw placepoint(valeur-0.3,0.5)--placepoint(valeur,0.5)--
 	  placepoint(valeur,-0.5)--placepoint(valeur-0.3,-0.5)
 	  withpen pencircle scaled 2bp
 	  fi;
       elseif sol="oui":
 	draw placepoint(valeur+0.3,0.5)--placepoint(valeur,0.5)
 	--placepoint(valeur,-0.5)--placepoint(valeur+0.3,-0.5)
 	withpen pencircle scaled 2bp withcolor couleur
       fi;
       if affichagesolu="non":
 	long:=abs((x.so*cm,ypart(placepoint(0,-0.4)))-
 	  placepoint(valeur,-0.4));
 	label.bot(TEX("$\underbrace{\hbox to"&
 	    decimal(long)&"pt{}}_{\hbox{Ce qui ne convient pas}}$"),
 	  iso(placepoint(valeur,-0.4),(x.so*cm,
 	      ypart(placepoint(0,-0.4)))));
       elseif affichagesolu="oui":
 	long:=abs((x.ne*cm,ypart(placepoint(0,-0.4)))-
 	  placepoint(valeur,-0.4));
 	label.bot(TEX("$\underbrace{\hbox to"&
 	    decimal(long)&"pt{}}_{\hbox{Nombres solutions}}$"),
 	  iso(placepoint(valeur,-0.4),(x.ne*cm,
 	      ypart(placepoint(0,-0.4)))));
       fi;
       if affichageval="oui":
 	label.top(TEX("$"&decimal(valeur)&"$"),placepoint(valeur,0.5));
       fi;
     fi;
     );
   $
 enddef;
 
 
Conversion au format PDF de inequation.1
 figure(0,-0.5cm,5cm,1.5cm);
 trace feuillet withcolor blanc;
 x.u:=5mm;
 quad.u:=0.5*cm;
 origine((2,1));
 pos:="sup";
 sol:="oui";
 draw soline(5,120,bleu);
 fin;
 
Conversion au format PDF de inequation.2
 figure(0,-0.5cm,5cm,1.5cm);
 trace feuillet withcolor blanc;
 x.u:=5mm;
 quad.u:=0.5*cm;
 origine((2,1));
 pos:="inf";
 sol:="oui";
 draw soline(5,60,orange);
 fin;
 
Conversion au format PDF de inequation.3
 figure(0,-0.5cm,10cm,1.5cm);
 trace feuillet withcolor blanc;
 x.u:=5mm;
 quad.u:=0.5*cm;
 origine((12,1));
 pos:="sup";
 sol:="oui";
 draw soline(-5,120,bleu);
 fin;
 style:="repasse";
 
Conversion au format PDF de inequation.4
 figure(0,-0.5cm,8cm,1.5cm);
 trace feuillet withcolor blanc;
 x.u:=5mm;
 quad.u:=0.5*cm;
 origine((12,1));
 pos:="sup";
 sol:="non";
 draw soline(-3,120,bleu);
 fin;
 style:="repasse";
 affichagesolu:="oui";
 
Conversion au format PDF de inequation.5
 figure(0,-0.5cm,10cm,1.5cm);
 trace feuillet withcolor blanc;
 x.u:=5mm;
 quad.u:=0.5*cm;
 origine((8,1));
 pos:="sup";
 sol:="oui";
 draw soline(5,120,bleu);
 fin;
 end