initial commit

This commit is contained in:
Yann Esposito (Yogsototh) 2012-09-20 13:14:34 +02:00
commit 64378ee2b2
6 changed files with 732 additions and 0 deletions

75
MAxMA.mp Normal file
View file

@ -0,0 +1,75 @@
% Le input shadows donne l'acces
% à la macro drawShadow(p);
input pfa
%vspace := 2vspace;
%u:=6mm;
%hspace := 2hspace;
beginfig(1) ;
z1 = origin;
z2 = z1 shifted (2hspace,0);
z3-z4 = z1-z2;
z7-z8 = z5-z6 = 2(z3-z4) ;
z3 = z1 shifted (0,-3vspace);
x5-x1=x4-x6;
y5-y3=y3 - y1;
y7-y5=-3vspace;
x7=x5;
taille := 2hauteur(btex $A$ etex) ;
drawCadreLabel(z1 shifted (-hspace, 0 ),z2 shifted (hspace,taille),btex $A$ etex);
drawCadreLabel(z3 shifted (-hspace, 0 ),z4 shifted (hspace,taille),btex $B$ etex);
drawCadreLabel(z7 shifted (-hspace, 0 ) ,z6 shifted (2.3hspace,taille),btex $A \times B$ etex);
drawIFState(btex $(q_1)$ etex,
btex $\iota(q_1)$ etex,
btex $\tau(q_1)$ etex,
z1) ;
drawIFState(btex $(q_2)$ etex,
btex $\iota(q_2)$ etex,
btex $\tau(q_2)$ etex,
z2) ;
drawIFState(btex $(r_1)$ etex,
btex $\iota(r_1)$ etex,
btex $\tau(r_1)$ etex,
z3) ;
drawIFState(btex $(r_2)$ etex,
btex $\iota(r_2)$ etex,
btex $\tau(r_2)$ etex,
z4) ;
drawIFState(btex $(q_1,r_1)$ etex,
btex $\iota(q_1)\iota(r_1)$ etex,
btex $\tau(q_1)\tau(r_1)$ etex,
z5) ;
drawIFState(btex $(q_1,r_2)$ etex,
btex $\iota(q_1)\iota(r_2)$ etex,
btex $\tau(q_1)\tau(r_2)$ etex,
z6) ;
drawIFState(btex $(q_2,r_1)$ etex,
btex $\iota(q_2)\iota(r_1)$ etex,
btex $\tau(q_2)\tau(r_1)$ etex,
z7) ;
drawIFState(btex $(q_2,r_2)$ etex,
btex $\iota(q_2)\iota(r_2)$ etex,
btex $\tau(q_2)\tau(r_2)$ etex,
z8) ;
drawArc(z1,z2,30,btex $\varphi(q_1,a,q_2)$ etex);
drawArc(z2,z2,30,btex $\varphi(q_2,a,q_2)$ etex);
drawArc(z3,z4,30,btex $\varphi(r_1,a,r_2)$ etex);
drawArc(z4,z4,30,btex $\varphi(r_2,a,r_2)$ etex);
drawArc(z5,z8,-10,btex $\varphi(q_1,a,q_2)\varphi(r_1,a,r_2)$ etex);
drawArc(z7,z8, 20,btex $\varphi(q_2,a,q_2)\varphi(r_1,a,r_2)$ etex);
drawArc(z6,z8,-100,btex $\varphi(q_1,a,q_2)\varphi(r_2,a,r_2)$ etex);
drawArc(z8,z8, 30,btex $\varphi(q_2,a,q_2)\varphi(r_2,a,r_2)$ etex);
endfig ;
end.

104
default.mp Normal file
View file

@ -0,0 +1,104 @@
% collected graphics of job "tmp"
if unknown context_tool : input mp-tool.mpii ;
fi ;
if unknown context_spec : input mp-spec.mpii ;
fi ;
if unknown context_grph : input mp-grph.mpii ;
fi ;
defaultfont := "cmr10" ;
defaultscale := 12.0pt/10pt ;
graphictextformat := "context" ;
graphictextdirective "\global \loadfontfileoncetrue " ;
string contextversion ;
contextversion := "2003.1.31" ;
if not known _data_prefix_ : string _data_prefix_ , _data_suffix_ ;
fi ;
_data_prefix_ := "mpd-" ;
_data_suffix_ := ".mpd" ;
boolean collapse_data ;
collapse_data := true ;
_data_suffix_ := ".mpd" ;
cmykcolors := true ;
spotcolors := true ;
color OverlayColor, OverlayLineColor ;
OverlayWidth := 138.0014pt ;
OverlayHeight := 17.84998pt ;
OverlayDepth := 17.84998pt ;
OverlayColor := (0,0,0) ;
OverlayLineWidth := 0.4pt;
OverlayLineColor := (0,0,0) ;
BaseLineSkip := 14.46669pt;
LineHeight := 14.46669pt;
BodyFontSize := 12.0pt;
TopSkip := 12.0pt;
StrutHeight := 10.41603pt;
StrutDepth := 4.05064pt;
CurrentWidth := 138.0014pt;
CurrentHeight := 17.84998pt;
EmWidth := 11.74988pt;
ExHeight := 5.16667pt;
PageNumber := 1;
RealPageNumber := 1;
LastPageNumber := 1;
prologues := 2;
if unknown context_page : input mp-page.mpii ;
fi ;
boolean PageStateAvailable, OnRightPage, InPageBody ;
PageStateAvailable := OnRightPage := true ;
InPageBody := false ;
def LoadPageState = OnRightPage := true;
RealPageNumber := 1;
PageNumber := 1;
NOfPages := 1;
PaperHeight := 845.04684pt;
PaperWidth := 597.50787pt;
PrintPaperHeight := 845.04684pt;
PrintPaperWidth := 597.50787pt;
TopSpace := 71.12546pt;
BottomSpace := 62.60228pt;
BackSpace := 71.13275pt;
CutSpace := 99.58769pt;
MakeupHeight := 711.3191pt;
MakeupWidth := 426.78743pt;
TopHeight := 0.0pt;
TopDistance := 0.0pt;
HeaderHeight := 56.90294pt;
HeaderDistance := 0.0pt;
TextHeight := 597.51323pt;
FooterDistance := 0.0pt;
FooterHeight := 56.90294pt;
BottomDistance := 0.0pt;
BottomHeight := 0.0pt;
LeftEdgeWidth := 0.0pt;
LeftEdgeDistance := 0.0pt;
LeftMarginWidth := 75.58197pt;
LeftMarginDistance := 11.99829pt;
TextWidth := 426.78743pt;
RightMarginDistance := 11.99829pt;
RightMarginWidth := 75.58197pt;
RightEdgeDistance := 0.0pt;
RightEdgeWidth := 0.0pt;
InnerMarginDistance := 11.99829pt;
InnerMarginWidth := 75.58197pt;
OuterMarginDistance := 11.99829pt;
OuterMarginWidth := 75.58197pt;
InnerEdgeDistance := 0.0pt;
InnerEdgeWidth := 0.0pt;
OuterEdgeDistance := 0.0pt;
OuterEdgeWidth := 0.0pt;
PageOffset := 0.0pt;
PageDepth := 0.0pt;
enddef ;
ResetTextAreas ;
SaveTextAreas ;
ResetTextAreas ;
if unknown context_core : input mp-core.mpii ;
fi ;
local_multi_par_area:=false;
;;
let mprunend = end ;
% On choisit l'unité de mesure principale
% celle là est pas mal pour utiliser l'ombre comme il faut.
u:=2mm;

53
exemple.mp Normal file
View file

@ -0,0 +1,53 @@
% le input pour utiliser les macros
input pfa ;
% la défintion de chaque figure se fait entre
% beginfig(numéro de la figure) ;
% ...
% endfig;
beginfig(1) ;
% z est un nom de variable réservé pour être un tableau de coordonnées
% par exemple si on écrit z1=origin, alors on peut utiliser directement
% x1 et y1 qui valent tous les deux 0.
z1 = origin;
% hspace correspond à l'espace horizontal standart entre deux états.
% Comme dans l'exemple il y a du texte, on rajoute un peu plus
z2 = (hspace+2cm,0);
% si on veut dessiner un état non initial et non terminal
% on utilise
% drawState(texteEtat, position)
% pour un état terminal et pas initial
% drawFState(texteEtat, texteFinal, position)
% pour un état initial et pas terminal
% drawIState(texteEtat, texteInitial, position)
% pour un état initial et terminal
% drawIFState(texteEtat, texteInitial, texteTerminal, position)
% ici on trace un état initial et terminal qui s'appelle q_1 (écrit
% LaTeX celà signifie q avec 1 en indice bas)
% on écrit 1/2 pour la valeur d'initialisation
% on écrit \alpha pour la valeur terminale
drawIFState(btex $q_1$ etex,
btex $$ \frac{1}{2} $$ etex,
btex $ \alpha $ etex,
z1);
% presque pareil qu'avant seule les valeur changent
drawIFState(btex $q_2$ etex,
btex $$ \frac{1}{2} $$ etex,
btex $ \alpha^2 $ etex,
z2);
% On peut maintenant tracer des transitions avec
% drawArc(positionDépart, positionArrivé, angle de sortie, texte)
drawArc(z1,z1,0,btex $$\eqalign{& a,\alpha \cr & b,1-2\alpha } $$ etex) ;
drawArc(z2,z2,0,btex $$\eqalign{& a,\alpha^2 \cr & c,1-2\alpha^2} $$ etex) ;
% remarque si vous voulez donner l'angle de sortie pour qu'il n'y ait
% pas de courbre, il suffit d'écrire :
% angle(positionArrivée - positionDépart)
endfig ;
end.

291
pfa.mp Normal file
View file

@ -0,0 +1,291 @@
% Le input shadows donne l'acces
% à la macro drawShadow(p);
input shadows
hspace := 8u ;
vspace := 5u ;
drawoptions(withpen pencircle scaled .05u) ;
% affiche un état à la position donnée
def drawStateParam(expr nom, position, anglab) =
begingroup ;
path p;
pair ps;
path s;
p :=fullcircle scaled 3u shifted position;
drawShadow(p);
% fill p withcolor white ;
unfill p ;
draw p ;
s := position -- position shifted (dir anglab scaled 3u) ;
ps := p intersectionpoint s;
if (anglab >= -22.5) and (anglab <= 22.5) :
label.rt(nom, ps) ;
elseif (anglab > 22.5) and (anglab <= 67.5) :
label.urt(nom, ps) ;
elseif (anglab > 67.5) and (anglab <= 112.5) :
label.top(nom, ps) ;
elseif (anglab > 112.5) and (anglab <= 157.5) :
label.ulft(nom, ps) ;
elseif (anglab > 157.5) or (anglab <= -157.5) :
label.lft(nom, ps) ;
elseif (anglab > -157.5) and (anglab <= -112.5) :
label.llft(nom, ps) ;
elseif (anglab > -112.5) and (anglab <= -67.5) :
label.bot(nom, ps) ;
elseif (anglab > -67.5) and (anglab <= -22.5) :
label.lrt(nom, ps) ;
fi
endgroup ;
enddef ;
% affiche un état
def drawState(expr nom, position) =
begingroup ;
drawStateParam(nom, position, -45) ;
endgroup ;
enddef ;
% message est la valeur dans l'état
def drawFState(expr nom, message, position) =
begingroup ;
path p;
p :=fullcircle scaled 3u shifted position;
drawState(nom,position);
% draw p blownup -.3u withpen pencircle scaled .02u;
draw p blownup -.3u ;
picture pic;
pic := thelabel(message,origin);
numeric taille;
taille := abs (urcorner pic);
if (taille <= 1.2u) :
label(message, position);
else :
label(message scaled (1.2u / taille), position);
fi ;
endgroup ;
enddef ;
% message est le message d'initialisation
def drawIState(expr nom, message, position) =
begingroup ;
path p;
p :=fullcircle scaled 3u shifted position;
drawState(nom,position)
% affiche de la flèche d'entrée
path r;
pair debut;
debut := position shifted (-2.7u,0);
r:=debut--center p;
pair pr;
pr := p intersectionpoint r;
r := r cutafter pr ;
numeric taillepen ;
taillepen := (( xpart urcorner currentpen )+(ypart urcorner currentpen)) ;
r := r cutafter (point -taillepen on r) ;
% r := r cutafter (point -.05u on r) ;
% drawarrow r withpen pencircle scaled .05u;
drawarrow r ;
label.lft(message, debut );
endgroup ;
enddef ;
% message est le message d'initialisation
def drawIFState(expr nom, ini, term, position) =
begingroup ;
path p;
p :=fullcircle scaled 3u shifted position;
drawIState(nom,ini,position);
% affichage du second cercle et de la valeur term
% draw p blownup -.3u withpen pencircle scaled .02u;
draw p blownup -.3u ;
%picture pic;
%pic := thelabel(term,origin);
%numeric taille;
%taille := abs (urcorner pic);
numeric taille;
taille := diag(term) ;
if (taille <= 1.2u) :
label(term, position);
else :
label(term scaled (1.2u / taille), position);
fi ;
endgroup ;
enddef ;
def largeur(expr texte) =
begingroup ;
picture pic;
pic := thelabel(texte, origin);
numeric taille;
taille := abs ((ulcorner pic) - (urcorner pic));
taille
endgroup ;
enddef ;
def hauteur(expr texte) =
begingroup ;
picture pic;
pic := thelabel(texte, origin);
numeric taille;
taille := abs ((urcorner pic) - (lrcorner pic));
taille
endgroup ;
enddef ;
def diag(expr texte) =
begingroup ;
picture pic;
pic := thelabel(texte, origin);
numeric taille;
taille := abs(urcorner pic);
taille
endgroup ;
enddef ;
def drawLoop(expr ori, angle, mesg) =
begingroup ;
path p; p:=fullcircle scaled 3u;
path r; r=ori -- ori shifted (2u* (dir angle));
path s; s=ori -- ori shifted (2u* (dir 90) );
pair prb, pre, prc;
prb := p shifted ori intersectionpoint r;
pre := p shifted ori intersectionpoint s;
prc := ori shifted ((2u+(u*(90-angle)/90)) * (dir ((angle + 90)/2)));
r := prb .. prc .. pre;
numeric taillepen ;
taillepen := (( xpart urcorner currentpen )+(ypart urcorner currentpen)) ;
r := r cutbefore (point taillepen on r);
r := r cutafter (point -taillepen on r);
% drawarrow r withpen pencircle scaled .04u;
drawarrow r ;
prc := point .333 length r of r;
label.rt(mesg, prc);
endgroup ;
enddef;
def Cadre (expr longueur,hauteur,arrondi) =
begingroup
path res ;
pair A,B ;
A:=origin ;
B:=A shifted (arrondi,arrondi) ;
res := origin -- origin +
(longueur,0) {right} .. {up} B +
(longueur,0) -- B+(longueur,hauteur) ;
res := res {up}..
{left} res rotated 180 shifted (longueur,hauteur+(2*arrondi)) {down} ..
{right}cycle ;
res
endgroup
enddef;
def drawCadre (expr llcorn, urcorn ) =
begingroup
path res ;
numeric longueur, hauteur ;
longueur := ( xpart urcorn ) - ( xpart llcorn ) + 7u ;
hauteur := ( ypart urcorn ) - ( ypart llcorn ) + 7u ;
res = Cadre(longueur, hauteur, 1u) ;
res := res shifted llcorn ;
res := res shifted (-4u, -4.5u) ;
drawShadow(res) ;
% fill res withcolor white ;
unfill res withcolor white ;
draw res ;
endgroup
enddef ;
def drawCadreLabel (expr llcorn, urcorn, message ) =
begingroup
numeric hauteur;
hauteur := ypart (thelabel(message,origin) scaled 2) ;
hauteur := hauteur + 2u ;
milieu := .5[xpart llcorn, xpart urcorn] ;
drawCadre(llcorn, urcorn shifted (0, hauteur) ) ;
label (message scaled 2, (milieu, (ypart urcorn) + 4u) ) ;
endgroup
enddef ;
def drawArcParam(expr ori, arr, angl, mesg, posl, invert) =
begingroup ;
if ori = arr:
drawLoop(ori,angl,mesg);
else:
path p; p:=fullcircle scaled 3u;
path r; r=ori{dir angl}..arr;
pair prb, pre;
% calcul de la taille du pen
taillepen := (( xpart urcorner currentpen )+(ypart urcorner currentpen)) ;
prb := p shifted ori intersectionpoint r;
r := r cutbefore prb;
r := r cutbefore (point taillepen on r);
pre := p shifted arr intersectionpoint r;
r := r cutafter pre;
r := r cutafter (point -taillepen on r);
picture etiquette ;
etiquette:=thelabel(mesg, origin);
pair hauteur, largeur;
hauteur := (ulcorner etiquette) - (llcorner etiquette);
hauteur := hauteur scaled .5;
hauteur := hauteur + (0,.3u);
largeur := (urcorner etiquette) - (ulcorner etiquette);
largeur := largeur scaled .5 ;
largeur := largeur + (.15u,0);
drawarrow r ;
pair centre;
numeric an;
centre := point posl*length r of r ;
an := angle direction posl*length r of r ;
if invert:
hauteur := -hauteur ;
largeur := -largeur ;
fi ;
if (an > -35) and (an < 35):
centre := centre shifted (hauteur rotated an) ;
label(mesg rotated an, centre) ;
elseif (an > 145) or (an < -145) :
centre := (point posl*length r of r) shifted (hauteur rotated (an+180)) ;
label(mesg rotated (an+180), centre) ;
elseif (an >= 0 ) :
hauteur := hauteur - (0,.15u) ;
centre := (point posl*length r of r) shifted largeur shifted -hauteur ;
label(mesg, centre);
else :
hauteur := hauteur - (0,.15u) ;
centre := (point posl*length r of r) shifted largeur shifted hauteur ;
label(mesg,centre);
fi;
fi;
endgroup ;
enddef ;
def drawArc(expr ori, arr, angl, mesg) =
drawArcParam(ori, arr, angl, mesg, .5, false) ;
enddef;

104
sequence.mp Normal file
View file

@ -0,0 +1,104 @@
input pfa ;
% Pour LaTeX
verbatimtex
\documentclass{article}
\usepackage{color}
\usepackage[utf8]{inputenc}
\usepackage{amssymb}
\usepackage{dsfont}
\usepackage[nice]{nicefrac}
\begin{document}
etex
beginfig(1)
z0 = origin ;
z1 = (hspace, vspace);
z2 = (hspace, -vspace);
% drawCadre((xpart(z0), ypart(z2)), z1);
drawIState(btex $q_\varepsilon$ etex, btex $\phantom{1}$ etex, z0);
drawFState(btex $q_a$ etex, "", z1);
drawState(btex $q_b$ etex, z2);
drawArc(z0,z1,angle(z1-z0),btex $a\phantom{,\nicefrac{1}{2}}$ etex);
drawArc(z0,z2,angle(z2-z0),btex $b\phantom{,\nicefrac{1}{2}}$ etex);
drawArc(z1,z1,0,btex $a\phantom{,\nicefrac{1}{2}}$ etex);
drawArc(z2,z1,90,btex $a\phantom{,-\nicefrac{1}{3}}$ etex);
drawArc(z2,z2,0,btex $a\phantom{,\nicefrac{4}{3}}$ etex);
endfig;
beginfig(2)
z0 = origin ;
z1 = (hspace, vspace);
z2 = (hspace, -vspace);
% drawCadre((xpart(z0), ypart(z2)), z1);
drawIState(btex $q_\varepsilon$ etex, btex ${\color{red} 1 }$ etex, z0);
drawFState(btex $q_a$ etex, btex ${\color{red} \nicefrac{1}{2}}$ etex, z1);
drawState(btex $q_b$ etex, z2);
drawArc(z0,z1,angle(z1-z0),btex $a{\color{red} ,\nicefrac{1}{2} }$ etex);
drawArc(z0,z2,angle(z2-z0),btex $b{\color{red} ,\nicefrac{1}{2} }$ etex);
drawArc(z1,z1,0,btex $a{\color{red} ,\nicefrac{1}{2} }$ etex);
drawArc(z2,z1,90,btex $a{\color{red} ,-\nicefrac{1}{3} }$ etex);
drawArc(z2,z2,0,btex $a{\color{red} ,\nicefrac{4}{3} }$ etex);
endfig;
beginfig(3)
z0 = origin ;
z1 = (hspace, vspace);
z2 = (hspace, -vspace);
% drawCadre((xpart(z0), ypart(z2)), z1);
drawIState(btex $q_\varepsilon$ etex, btex ${\color{red} 1 }$ etex, z0);
drawFState(btex $q_a$ etex, btex ${\color{red} \nicefrac{1}{2}}$ etex, z1);
drawState(btex $q_b$ etex, z2);
drawArc(z0,z2,angle(z2-z0),btex $b,\nicefrac{1}{2}$ etex);
drawArc(z1,z1,0,btex $a,\nicefrac{1}{2}$ etex);
drawArc(z2,z1,90,btex $a,-\nicefrac{1}{3}$ etex);
drawArc(z2,z2,0,btex $a,\nicefrac{4}{3}$ etex);
drawoptions(withcolor red);
drawArc(z0,z1,angle(z1-z0),btex $a{\color{red} ,\nicefrac{1}{2} }$ etex);
endfig;
beginfig(4)
z0 = origin ;
z1 = (hspace, vspace);
z2 = (hspace, -vspace);
% drawCadre((xpart(z0), ypart(z2)), z1);
drawIState(btex $q_\varepsilon$ etex, btex ${\color{red} 1 }$ etex, z0);
drawFState(btex $q_a$ etex, btex ${\color{red} \nicefrac{1}{2}}$ etex, z1);
drawState(btex $q_b$ etex, z2);
drawArc(z0,z1,angle(z1-z0),btex $a,\nicefrac{1}{2}$ etex);
drawArc(z1,z1,0,btex $a,\nicefrac{1}{2}$ etex);
drawoptions(withcolor red);
drawArc(z0,z2,angle(z2-z0),btex $b{\color{red} ,\nicefrac{1}{2} }$ etex);
drawArc(z2,z1,90,btex $a{\color{red} ,-\nicefrac{1}{3} }$ etex);
drawArc(z2,z2,0,btex $a{\color{red} ,\nicefrac{4}{3} }$ etex);
endfig;
beginfig(5)
z0 = origin ;
z1 = (hspace, vspace);
z2 = (hspace, -vspace);
% drawCadre((xpart(z0), ypart(z2)), z1);
drawIState(btex $q_\varepsilon$ etex, btex ${\color{red} 1 }$ etex, z0);
drawFState(btex $q_a$ etex, btex ${\color{red} \nicefrac{1}{2}}$ etex, z1);
drawState(btex $q_b$ etex, z2);
drawArc(z0,z1,angle(z1-z0),btex $a,\nicefrac{1}{2}$ etex);
drawArc(z2,z2,0,btex $a,\nicefrac{4}{3}$ etex);
drawoptions(withcolor red);
drawArc(z1,z1,0,btex $a,\nicefrac{1}{2}$ etex);
drawArc(z0,z2,angle(z2-z0),btex $b{\color{red} ,\nicefrac{1}{2} }$ etex);
drawArc(z2,z1,90,btex $a{\color{red} ,-\nicefrac{1}{3} }$ etex);
endfig;
beginfig(6)
z0 = origin ;
z1 = (hspace, vspace);
z2 = (hspace, -vspace);
% drawCadre((xpart(z0), ypart(z2)), z1);
drawIState(btex $q_\varepsilon$ etex, btex $1$ etex, z0);
drawFState(btex $q_a$ etex, btex $\nicefrac{1}{2}$ etex, z1);
drawState(btex $q_b$ etex, z2);
drawArc(z0,z1,angle(z1-z0),btex $a,\nicefrac{1}{2}$ etex);
drawArc(z2,z2,0,btex $a,\nicefrac{4}{3}$ etex);
drawArc(z1,z1,0,btex $a,\nicefrac{1}{2}$ etex);
drawArc(z0,z2,angle(z2-z0),btex $b,\nicefrac{1}{2}$ etex);
drawArc(z2,z1,90,btex $a,-\nicefrac{1}{3}$ etex);
endfig;
end.

105
shadows.mp Normal file
View file

@ -0,0 +1,105 @@
% permet d'afficher des ombres jolies
% comme dans Omnigraffle
%
% Voilà un exemple d'utilisation
% --------
% input shadows
%
% beginfig(1);
% path p; p :=fullcircle scaled 3u;
%
% drawShadow(p);
% fill p withcolor white;
% draw p withpen pencircle scaled .02u;
% draw p blownup -.3u withpen pencircle scaled .02u;
% label(btex $$\frac{1}{2}$$ etex, origin);
% endfig;
% -------
%
% Qualité maximale tolérée 84.
%
%
input default ;
% p est un path pour lequel on va tracer la figure
% decalage est un vecteur de décalge pour l'ombre
% smooth est l'effacement de l'ombre (0 renvoie une ombre portée parfaite)
% la valeur par défaut est .06u
% quality est la qualité du rendu (plus il est élevé meilleur est le rendu)
% ATTENTION : une valeur trop grande risque de donner des
% PDF très long à lire...
% la valeur par défaut est 100
% grey est le degrès de transparence global
% la valeur par défaut est .3
% couleur est la couleur de l'ombre, par défaut c'est black
def drawShadowWithParameters(expr p, decalage, smooth, quality, grey, couleur) =
begingroup ;
qual := round(sqrt (quality/2));
factor := grey/((qual+1)*(qual+1));
if path p :
if cycle p :
path shadow ;
pair dcl;
shadow := p shifted decalage ;
% fill shadow withcolor transparent(1,factor,black) ;
dcl:=(0,0);
for j=-qual upto qual :
for k=-qual upto qual :
dcl := (j/qual, k/qual) scaled smooth;
fill shadow shifted dcl withcolor transparent(1,factor,couleur) ;
endfor ;
endfor ;
else :
path shadow ;
pair dcl;
shadow := p shifted decalage ;
dcl:=(0,0);
for j=-qual upto qual :
for k=-qual upto qual :
dcl := (j/qual, k/qual) scaled smooth;
draw shadow shifted dcl withcolor transparent(1,factor,couleur) ;
endfor ;
endfor ;
fi ;
else :
picture shadow ;
pair dcl ;
shadow := p shifted decalage ;
dcl := origin ;
for j = -qual upto qual :
for k = -qual upto qual :
dcl := (j/qual, k/qual) scaled smooth ;
draw shadow shifted dcl withcolor transparent (1, factor, couleur) ;
endfor ;
endfor ;
fi ;
endgroup ;
enddef ;
pair shadowsDefaultDecalage ;
shadowsDefaultDecalage := (.05u, -.18u) ;
numeric shadowsDefaultSmooth ;
shadowsDefaultSmooth := .18u ;
numeric shadowsDefaultQuality ;
shadowsDefaultQuality := 17 ;
numeric shadowsDefaultGrey ;
shadowsDefaultGrey := .3 ;
color shadowsDefaultColor ;
shadowsDefaultColor := black ;
% affiche l'ombre d'un chemin avec les paramètres par défaults
def drawShadow(expr p) =
drawShadowWithParameters(p, shadowsDefaultDecalage, shadowsDefaultSmooth,
shadowsDefaultQuality, shadowsDefaultGrey,
shadowsDefaultColor) ;
enddef ;