commit 64378ee2b29e5a2e1aef15a65f7617f4c4de98d5 Author: Yann Esposito (Yogsototh) Date: Thu Sep 20 13:14:34 2012 +0200 initial commit diff --git a/MAxMA.mp b/MAxMA.mp new file mode 100644 index 0000000..f15e01d --- /dev/null +++ b/MAxMA.mp @@ -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. diff --git a/default.mp b/default.mp new file mode 100644 index 0000000..d5357f2 --- /dev/null +++ b/default.mp @@ -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; diff --git a/exemple.mp b/exemple.mp new file mode 100644 index 0000000..e8db02c --- /dev/null +++ b/exemple.mp @@ -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. diff --git a/pfa.mp b/pfa.mp new file mode 100644 index 0000000..5da7873 --- /dev/null +++ b/pfa.mp @@ -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; diff --git a/sequence.mp b/sequence.mp new file mode 100644 index 0000000..c33e302 --- /dev/null +++ b/sequence.mp @@ -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. diff --git a/shadows.mp b/shadows.mp new file mode 100644 index 0000000..721eb50 --- /dev/null +++ b/shadows.mp @@ -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 ; +