Hachures
Le principe est le suivant : on balaye la figure avec une droite en assurant la découpe
finale aux frontières de la figure avec clip. Il est possible de définir, à l'intérieur de la macro,
de nouveaux styles de hachures, il suffit pour cela d'allonger (ou modifier) la liste des alternatives
suivant la valeur du paramètre trace.
%@AUTEUR: Christophe Poulain (4 février 2003)
vardef hachurage(expr chemin, angle, ecart, trace)suffix couleur =
save $;
picture $;
path support;
support=(((-37cm,0))--((37cm,0))) rotated angle;
if trace=1:
drawoptions(dashed evenly);
elseif trace=2:
drawoptions(dashed dashpattern(on12bp off6bp on3bp off6bp));
fi;
$ = image(
for j=-200 upto 200:
if ((support shifted (ecart*j*(1,0))) intersectiontimes chemin)<>(-1,-1):
draw support shifted (ecart*j*(1,0))
withcolor if str couleur="":(0,0,0) else:couleur fi;
fi
endfor;
);
clip $ to chemin;
drawoptions();
$
enddef;
color rouge;
rouge = (1,0,0);
beginfig(1);
path p,q;
p = fullcircle scaled 3cm;
draw hachurage(p,45,2mm,0)rouge;
draw p;
q = (p scaled 0.5) shifted (4cm,2cm);
draw hachurage(q,30,4mm,1);
draw q;
endfig;
def dessine(expr p,a,e,t,s)(text couleurs) =
save co,n;
color co[];
numeric n;
n := 0; forsuffixes c = couleurs: co[incr n] = c; endfor;
if n = 1: co2 = co1; fi;
draw hachurage(p,a,e,t) co1;
draw p withpen pencircle scaled s withcolor co2;
enddef;
beginfig(2);
path carre,cercle;
cercle = fullcircle scaled 2cm;
carre = ((0,0)--(3cm,0)--(3cm,3cm)--(0,3cm)--cycle) shifted (3cm,-1cm);
dessine(((3cm,1cm)..(4cm,3cm)..(1cm,2cm)..cycle),30,4mm,3,1pt,black);
dessine(cercle,60,3mm,0,2pt,green);
dessine(carre,45,5mm,2,1pt,blue,red);
endfig;
end
|