metautomata/shadows.mp

106 lines
2.8 KiB
Text
Raw Normal View History

2012-09-20 11:14:34 +00:00
% permet d'afficher des ombres jolies
% comme dans Omnigraffle
%
% Voil<69> un exemple d'utilisation
% --------
% input shadows
%
% beginfig(1);
2012-09-20 11:33:30 +00:00
% path p; p :=fullcircle scaled 3u;
2012-09-20 11:14:34 +00:00
%
2012-09-20 11:33:30 +00:00
% drawShadow(p);
2012-09-20 11:14:34 +00:00
% 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;
% -------
2012-09-20 11:33:30 +00:00
%
2012-09-20 11:14:34 +00:00
% Qualit<69> maximale tol<6F>r<EFBFBD>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<72>e parfaite)
% la valeur par d<>faut est .06u
% quality est la qualit<69> du rendu (plus il est <20>lev<65> meilleur est le rendu)
% ATTENTION : une valeur trop grande risque de donner des
% PDF tr<74>s long <20> lire...
% la valeur par d<>faut est 100
% grey est le degr<67>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;
2012-09-20 11:33:30 +00:00
2012-09-20 11:14:34 +00:00
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;
2012-09-20 11:33:30 +00:00
2012-09-20 11:14:34 +00:00
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 ;
2012-09-20 11:33:30 +00:00
2012-09-20 11:14:34 +00:00
endgroup ;
enddef ;
pair shadowsDefaultDecalage ;
shadowsDefaultDecalage := (.05u, -.18u) ;
numeric shadowsDefaultSmooth ;
shadowsDefaultSmooth := .18u ;
numeric shadowsDefaultQuality ;
shadowsDefaultQuality := 17 ;
2012-09-20 11:33:30 +00:00
2012-09-20 11:14:34 +00:00
numeric shadowsDefaultGrey ;
shadowsDefaultGrey := .3 ;
color shadowsDefaultColor ;
shadowsDefaultColor := black ;
2012-09-20 11:33:30 +00:00
2012-09-20 11:14:34 +00:00
% affiche l'ombre d'un chemin avec les param<61>tres par d<>faults
def drawShadow(expr p) =
2012-09-20 11:33:30 +00:00
drawShadowWithParameters(p, shadowsDefaultDecalage, shadowsDefaultSmooth,
2012-09-20 11:14:34 +00:00
shadowsDefaultQuality, shadowsDefaultGrey,
shadowsDefaultColor) ;
enddef ;