summaryrefslogtreecommitdiff
path: root/graphics/metapost/contrib/macros/repere/repere.mp
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2021-11-05 03:01:04 +0000
committerNorbert Preining <norbert@preining.info>2021-11-05 03:01:04 +0000
commitc628b1aa9cf528de739c1de45acf3739561619ed (patch)
tree07c7fadd26f7d7fb71c242459b79759c42e71274 /graphics/metapost/contrib/macros/repere/repere.mp
parente9894be38f76d67f7c8b8e5d16f16e8b14b96f40 (diff)
CTAN sync 202111050301
Diffstat (limited to 'graphics/metapost/contrib/macros/repere/repere.mp')
-rw-r--r--graphics/metapost/contrib/macros/repere/repere.mp791
1 files changed, 752 insertions, 39 deletions
diff --git a/graphics/metapost/contrib/macros/repere/repere.mp b/graphics/metapost/contrib/macros/repere/repere.mp
index 02595f91aa..0bd86dc43d 100644
--- a/graphics/metapost/contrib/macros/repere/repere.mp
+++ b/graphics/metapost/contrib/macros/repere/repere.mp
@@ -14,6 +14,8 @@
% Mars 2019 : changement spline
% Juin 2019 : demi-droites, nomme[<angle>]
+% Mars 2020 : filldraw
+% Octobre 2021 : nommerot, cote
% À faire : extratextx, extratexty
input format;
@@ -50,6 +52,7 @@ let olddraw = draw;
let olddrawarrow = drawarrow;
let olddrawdblarrow = drawdblarrow;
let oldfill = fill;
+let oldfilldraw = filldraw;
vardef theoldlabel@#(expr s,z) = % Position s near z
save p; picture p;
if picture s: p=s
@@ -155,15 +158,28 @@ def init_traces =
vardef thelabel@#(expr s,z) = % Position s near z
save p; picture p;
if picture s: p=s
-% else: p = s infont defaultfont scaled defaultscale
+ elseif path s: p=image(draw s)
+ else: p = LaTeX(s)
+ fi;
+ p shifted (_cart(z) + labeloffset*laboff@# -
+ (labxf@#*lrcorner p + labyf@#*ulcorner p
+ + (1-labxf@#-labyf@#)*llcorner p
+ )
+ )
+ enddef;
+ vardef thelabelrot@#(expr s,z,an) = % Position s near z
+ save p; picture p;
+ if picture s: p=s
else: p = LaTeX(s)
fi;
+ p:=p rotatedaround (center bbox p,an);
p shifted (_cart(z) + labeloffset*laboff@# -
(labxf@#*lrcorner p + labyf@#*ulcorner p
+ (1-labxf@#-labyf@#)*llcorner p
)
)
enddef;
+ def labelrot = draw thelabelrot enddef;
%% drawarrow
def drawarrow expr p = _apth:=p transformed _T; _finarr enddef;
def drawdblarrow expr p = _apth:=p transformed _T; _findarr enddef;
@@ -254,6 +270,7 @@ def fin =
if _nbaxes=1: olddraw _axorlab fi;
if coupe: clip currentpicture to (cadre transformed _T) fi;
if bf: oldendfig; bf:=false;_nfig:=_nfig+1 fi;
+ rep_tab:=false; % Ajout octobre 2021
traces_orig;
enddef;
@@ -987,7 +1004,7 @@ vardef thelabelang@#(expr s,z)=
else:
tmpang := scantokens tmpstr
fi;
- tmppt := tmppath intersectionpoint (0.5urcorner p-- (0.5urcorner p + 100 * (dir (180+tmpang))));
+ tmppt := tmppath intersectionpoint ((0.5urcorner p+0.5llcorner p)-- (0.5urcorner p +0.5llcorner p+ 100 * (dir (180+tmpang))));
p shifted (-tmppt + _cart(z) + labeloffset*(cosd(tmpang),sind(tmpang)) )
enddef;
@@ -1020,7 +1037,58 @@ vardef nommepoint@#(text t)=
enddef;
+% Octobre 2021
+vardef thelabelangrot@#(expr s,z,an)=
+ save tmpang,tmpfig,tmppt,tmppath,tmpstr;
+ string tmpstr;
+ numeric tmpang;
+ pair tmppt;
+ path tmppath;
+ save p; picture p;
+ tmpstr := str @#;
+ if picture s: p=s
+ else: p = LaTeX(s)
+ fi;
+ tmppath := llcorner p -- lrcorner p -- urcorner p -- ulcorner p -- cycle;
+ p:=p rotatedaround (center tmppath,an);
+ if ASCII tmpstr = 91:
+ tmpang := scantokens substring(1,length(tmpstr)-1) of tmpstr
+ else:
+ tmpang := scantokens tmpstr
+ fi;
+ tmppt := (tmppath rotatedaround (center tmppath,an)) intersectionpoint ((0.5urcorner p+0.5llcorner p)-- (0.5urcorner p +0.5llcorner p + 100 * (dir (180+tmpang))));
+ p shifted (-tmppt + _cart(z) + labeloffset*(cosd(tmpang),sind(tmpang)) )
+enddef;
+
+def labelangrot = draw thelabelangrot enddef;
+
+% Octobre 2021
+vardef nommepointrot@#(text t)(expr an)=
+ save $,ch,dess,latch;
+ pair $;
+ string ch,latch;
+ picture dess;
+ if (ASCII str @# < 58) or (ASCII str @# = 91):
+ def mylabel = labelangrot enddef
+ else:
+ def mylabel = labelrot enddef
+ fi;
+ if long_texte(t)=1:
+ dess:=image(draw MarquePointFig(t);
+ ch:=_chaine(t);
+ mylabel@#("$" & ch & "$",t,an) withcolor coullabel)
+ else:
+ dess:=image(%
+ for PP=t:
+ if pair PP: MarquePoint(PP); $:=PP
+ else: if string PP: mylabel@#(PP,$,an) else: mylabel@#(PP scaled defaultscale,$,an) fi withcolor coullabel
+ fi;
+ endfor)
+ fi;
+ dess
+enddef;
+def nommerot = draw nommepointrot enddef;
vardef nommecourbe@#(suffix p)(text t)=
save A,ch,dess;
@@ -1043,10 +1111,6 @@ vardef nommecourbe@#(suffix p)(text t)=
enddef;
-
-
-
-
vardef nommeobj@#(text t)=
save $;
picture $;
@@ -1088,7 +1152,6 @@ vardef pointnommetime(expr p)=
pair Pt,P[];
numeric nbint,pp,T[];
intercourbestimes(T)(cadre,p);
- show T[1];
Pt:=_O;pp:=0;
if known T[1]:
Pt:= point T[1] of p;
@@ -1140,8 +1203,6 @@ vardef nommeautoobjsuf(suffix p)=
enddef;
vardef estcadree primary f =
- show llcorner f; show llcorner cadre transformed _T;
- show urcorner f; show urcorner cadre;
(xpart urcorner f <= xpart urcorner (cadre transformed _T))
and (ypart urcorner f <= ypart urcorner (cadre transformed _T))
and (xpart llcorner f >= xpart llcorner (cadre transformed _T))
@@ -1674,18 +1735,6 @@ vardef splineder(text t)(text q)=
enddef;
-%% Novembre 2017
-%vardef deriveesplinecubique(suffix k)(suffix xs,ys)(expr n)=
-%% renvoie les dérivées pour interpolation avec splines cubiques
-%% source : https://en.wikipedia.org/wiki/Spline_interpolation
-%% xs[] et ys[] sont des listes, n est le nombre de valeurs
-%% Renvoie les dérivées dans la liste k[]
-% (2k[0] + k[1])/(xs[1] - xs[0]) = 3(ys[1]-ys[0])/((xs[1]-xs[0])**2);
-% for i=1 upto n-1:
-% k[i-1]/(xs[i] - xs[i-1]) + 2k[i]/(xs[i] - xs[i-1]) + 2k[i]/(xs[i+1] - xs[i]) + k[i+1]/(xs[i+1] - xs[i]) = 3(ys[i] - ys[i-1])/((xs[i]-xs[i-1])**2) + 3(ys[i+1] - ys[i])/((xs[i+1]-xs[i])**2);
-% endfor
-% (k[n-1] + 2k[n])/(xs[n]-xs[n-1]) = 3(ys[n]-ys[n-1])/((xs[n]-xs[n-1])**2);
-%enddef;
%Mars 2019
vardef deriveesplinecubique(suffix k)(suffix xs,ys)(expr n)=
@@ -1706,19 +1755,6 @@ vardef deriveesplinecubique(suffix k)(suffix xs,ys)(expr n)=
fi;
enddef;
-%% Novembre 2017
-%vardef splineinterpolfonct_pt(text t)(expr x)=
-%% t est la liste des points A,B,C...
-% save xa,ya,dd,n;
-% numeric xa[],ya[],dd[],n;
-% n:=-1;
-% for i=t:
-% n := n + 1;
-% xa[n] := xpart i; ya[n] := ypart i;
-% endfor
-% deriveesplinecubique(dd)(xa,ya)(n);
-% splinederfonct((xa[0],ya[0],dd[0]) for ii=1 upto n: , (xa[ii],ya[ii],dd[ii]) endfor)(x)
-%enddef;
% Mars 2019
vardef splineinterpolfonct_pt(text t)(expr x)=
@@ -1776,8 +1812,6 @@ enddef;
-
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%% TANGENTES %%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -2739,9 +2773,6 @@ vardef LaTeX primary sc =
else: LaTeXsetup; textext(sc) scaled defaultscale
fi
enddef;
-%vardef LaTeX primary sc =
-% LaTeXsetup; textext(sc) scaled defaultscale
-%enddef;
% Mai 2017
@@ -2754,6 +2785,49 @@ enddef;
def legende = draw thelegende enddef;
+% Octobre 2021
+% Cote sans flèche
+vardef thecote@#(expr A, B, texte)=
+ save I; pair I;
+ save an; numeric an;
+ I=0.5[A,B];
+ an=angle(B-A);
+ if str @# ="top":
+ thelabelangrot[an+90](texte,I,an)
+ else:
+ thelabelangrot[an-90](texte,I,an)
+ fi
+enddef;
+
+def cote = draw thecote enddef;
+
+% Octobre 2021
+% Cote avec flèche
+numeric dec_cote;
+dec_cote:=4mm;
+boolean traits_cote;
+traits_cote:=false;
+
+vardef thecotefleche@#(expr a,b,t)=
+ save pp,an;
+ pair pp[];numeric an;
+ an := if str @# ="top": 90 else: -90 fi;
+ pp[1]:=dec_cote*(unitvector(b-a) rotated an) transformed inverse _T;
+ pp[2]:=(dec_cote+1mm)*(unitvector(b-a) rotated an) transformed inverse _T;
+ image(%
+ if traits_cote:
+ draw a--(a shifted pp[2]) dashed evenly;
+ draw b--(b shifted pp[2]) dashed evenly;
+ fi
+ drawdblarrow ((a--b) shifted pp[1]);
+ cote@#(a shifted pp[1],b shifted pp[1],t)
+ )
+enddef;
+
+def cotefleche =
+ draw thecotefleche
+enddef;
+
%%%%%%%%%%%%%%%Figure intermédiaire%%%%%%%%%%%%%%%%%%%
def figureinter=
@@ -2917,3 +2991,642 @@ marine:=conversion_cmyn_rvb(Marine);
moutarde:=conversion_cmyn_rvb(Moutarde);
vertfonce:=conversion_cmyn_rvb(Vertfonce);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%% TABLEAUX ET DAMIERS %%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Octobre 2021
+%
+
+boolean rep_tab;
+rep_tab:=false;
+
+color coultableau[],coullignes;
+numeric eplignes;
+
+
+
+def tableau(text t)=
+ save vv,ind;
+ numeric vv[],ind;
+ ind:=0;
+ for i=t:
+ ind:=ind +1;
+ vv[ind]:=i;
+ endfor
+ vv[4]:=vv[ind];
+ coullignes:=black;
+ eplignes:=0.7;
+ tab_init;
+ deftableau(vv[1],vv[2],vv[3],vv[4]);
+ coultableau[1]:=0.45white;
+ coultableau[2]:=0.9white;
+enddef;
+
+
+def deftableau(expr n,p,u,v)=
+ rep_tab:=true;
+ repere(-1,n+2,u,-1,p+2,v);
+ rep_tab_n:=n;rep_tab_p:=p;
+enddef;
+
+
+vardef grille(expr dx,dy)=
+ save coul;color coul;
+ coul:=coullignes;
+ ep := eplignes;
+ save QuadXmin,QuadXmax,QuadYmin,QuadYmax;
+ numeric QuadXmin,QuadXmax,QuadYmin,QuadYmax;
+ QuadXmin:=0;QuadXmax:=rep_tab_n;QuadYmin:=0;QuadYmax:=rep_tab_p;
+ quadrillage(dx,dy) shifted _cart(0.5,0.5)
+enddef;
+
+vardef damier(expr dx,dy) text t=
+ save coul;color coul;
+ coul:=coullignes;
+ ep := eplignes;
+ save count_tmp,pn;
+ numeric count_tmp,pn;
+ save QuadXmin,QuadXmax,QuadYmin,QuadYmax;
+ numeric QuadXmin,QuadXmax,QuadYmin,QuadYmax;
+ QuadXmin:=0;QuadXmax:=rep_tab_n;QuadYmin:=0;QuadYmax:=rep_tab_p;
+ count_tmp:=2;pn=(((rep_tab_n-1) div dx)+1) mod 2;
+ image(%
+ for j=1 step dy until rep_tab_p:
+ for i=1 step dx until rep_tab_n:
+ count_tmp:=3-count_tmp;
+ fill ((i,j) -- (i+dx,j) -- (i+dx,j+dy) -- (i,j+dy) -- cycle) shifted (-0.5,-0.5) withcolor coultableau[count_tmp];
+ endfor
+ if pn=0: count_tmp:=3-count_tmp fi;
+ endfor
+ draw quadrillage(dx,dy) shifted _cart(0.5,0.5) t
+ )
+enddef;
+
+
+%%%%%%%%% Lignes particulières
+
+vardef segmenth(expr x,y)=
+ ((0,0)--(1,0)) shifted (x-0.5,y+0.5)
+enddef;
+
+vardef segmentv(expr x,y)=
+ ((0,0)--(0,1)) shifted (x+0.5,y-0.5)
+enddef;
+
+vardef ligneh(expr m)(text t)=
+ save ct;
+ numeric ct;
+ ct:=0;
+ image(%
+ for i=t:
+ ct:=ct+1;
+ if i=1:
+ draw segmenth(ct,m)
+ fi;
+ endfor
+ )
+enddef;
+
+vardef lignesh(text t)=
+ save lig,col;
+ numeric lig,col;
+ lig:=rep_tab_p;col:=1;
+ image(%
+ for i=t:
+ if i=1:
+ draw segmenth(col,lig)
+ fi;
+ if col=rep_tab_n:
+ lig:=lig-1;col:=1;
+ else:
+ col:=col+1;
+ fi
+ endfor
+ )
+enddef;
+
+vardef lignesv(text t)=
+ save lig,col;
+ numeric lig,col;
+ lig:=rep_tab_p;col:=0;
+ image(%
+ for i=t:
+ if i=1:
+ draw segmentv(col,lig)
+ fi;
+ if col=rep_tab_n:
+ col:=0;lig:=lig-1;
+ else:
+ col:=col+1;
+ fi
+ endfor
+ )
+enddef;
+
+
+
+
+% largeur d'une figure
+vardef largeur_fig(expr pic)=
+ abs(lrcorner pic - llcorner pic)
+enddef;
+
+
+% Coordonnées des cases du tableau %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% coordonnées dans le tableau
+vardef _tab(expr x,y)=
+ save px,py;
+ numeric px,py;
+ px := if inverse_coord_x: rep_tab_n + deb_coord_x - x else: x - deb_coord_x + 1 fi;
+ py := if inverse_coord_y: rep_tab_p + deb_coord_y - y else: y - deb_coord_y + 1 fi;
+ (px,py)
+enddef;
+
+
+def tab_init= %initialisation variables
+ % Style : "1", "i", "I", "a", "A"
+ string style_coord_x,style_coord_y;
+ style_coord_x:="1";
+ style_coord_y:="1";
+
+ % Première valeur
+ numeric deb_coord_x,deb_coord_y;
+ deb_coord_x:=1;
+ deb_coord_y:=1;
+
+ % Alignement
+ string align_coord_x,align_coord_y;
+ align_coord_x:="c";align_coord_y:="c";
+
+ % Placement des coordonnées
+ string place_coord;
+ numeric place_coord_x,place_coord_y;
+ place_coord:="bl";
+ place_coord_x:=0;
+ place_coord_y:=0;
+
+ % Inversion coordonnées
+ boolean inverse_coord_x,inverse_coord_y;
+ inverse_coord_x:=false;
+ inverse_coord_y:=false;
+enddef;
+
+
+vardef compoetiquette(expr n,t)=
+ if t=1: "$\num{" & decimal(n) & "}$"
+ elseif t=2: "\strut\romannumeral" & decimal(n)
+ elseif t=3: "\MakeUppercase{\romannumeral" & decimal(n) & "}"
+ elseif t=4: "\strut " & char(n+96)
+ else: char(n+64)
+ fi
+enddef;
+
+vardef coordx=
+ save stdeb,stfin,tt,aa;
+ string stdeb,stfin;
+ numeric tt,aa;
+ if (substring (0,1) of place_coord = "h") or (substring (0,1) of place_coord = "t") or (substring (1,2) of place_coord = "h") or (substring (1,2) of place_coord = "t"):
+ place_coord_x:=1
+ else:
+ place_coord_x:=0
+ fi;
+ if style_coord_x="1":
+ tt:=1
+ elseif style_coord_x="i":
+ tt:=2
+ elseif style_coord_x="I":
+ tt:=3
+ elseif style_coord_x="a":
+ tt:=4
+ elseif style_coord_x="A":
+ tt:=5
+ fi;
+ image(%
+ for i=1 upto rep_tab_n:
+ aa:= if inverse_coord_x: rep_tab_n+1-i else: i fi;
+ if place_coord_x=0:
+ label.bot(LaTeX(compoetiquette(i-1+deb_coord_x,tt)),(aa,0.5));
+ else:
+ label.top(LaTeX(compoetiquette(i-1+deb_coord_x,tt)),(aa,rep_tab_n+0.5));
+ fi
+ endfor
+ )
+enddef;
+
+
+vardef coordy=
+ save stdeb,stfin,tt,ll,cc;
+ string stdeb,stfin;
+ numeric tt,ll,cc;
+ if align_coord_y="g": align_coord_y:="l" fi;
+ if align_coord_y="d": align_coord_y:="r" fi;
+ ll:=0;
+ if (substring (0,1) of place_coord = "d") or (substring (0,1) of place_coord = "r") or (substring (1,2) of place_coord = "d") or (substring (1,2) of place_coord = "r"):
+ place_coord_y:=1
+ else:
+ place_coord_y:=0
+ fi;
+ if style_coord_y="1":
+ tt:=1
+ elseif style_coord_y="i":
+ tt:=2
+ elseif style_coord_y="I":
+ tt:=3
+ elseif style_coord_y="a":
+ tt:=4
+ elseif style_coord_y="A":
+ tt:=5
+ fi;
+ for i=1 upto rep_tab_p:
+ ll:=max(ll,largeur_fig(LaTeX(compoetiquette(i-1+deb_coord_y,tt))));
+ endfor
+ image(%
+ for i=1 upto rep_tab_p:
+ cc:= if inverse_coord_y: rep_tab_p+1-i else: i fi;
+ if place_coord_y=0:
+ label.lft(LaTeX("\makebox[" & decimal(ll/cm) & "cm][" & align_coord_y &"]{" & compoetiquette(i-1+deb_coord_y,tt) & "}"),(0.5,cc));
+ else:
+ label.rt(LaTeX("\makebox[" & decimal(ll/cm) & "cm][" & align_coord_y &"]{" & compoetiquette(i-1+deb_coord_y,tt) & "}"),(rep_tab_p+0.5,cc));
+ fi
+ endfor
+ )
+enddef;
+
+vardef coord=
+ image(%
+ draw coordy;
+ draw coordx;)
+enddef;
+
+
+%%%%%%%%% Numérotation dames
+
+vardef numerotationdames=
+ save ct;
+ numeric ct;
+ ct:=0;
+ image(
+ for j= rep_tab_p downto 1:
+ for i=1 upto rep_tab_n:
+ if (i+j) mod 2 = 0:
+ ct:=ct+1;
+ label("\bfseries" & decimal(ct),(i,j));
+ fi
+ endfor
+ endfor
+ )
+enddef;
+
+%%% Remplissage de cases %%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+vardef contour_case(expr n,m)=
+ ((0,0)--(1,0)--(1,1)--(0,1)--cycle) shifted (_tab(n,m)-(0.5,0.5))
+enddef;
+
+vardef case(expr n,m) text t=
+ image(%
+ fill contour_case(n,m) t;
+ draw (contour_case(n,m)) withpen pencircle scaled eplignes withcolor coullignes
+ )
+enddef;
+
+vardef cases(text pts) text t=
+ image(%
+ for i= pts:
+ draw case(xpart i,ypart i) t;
+ endfor
+ )
+enddef;
+
+%%% Placement d'un objet dans une case
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+vardef thetablabel(expr s,n,m)= % place l'objet s dans la case (n,m)
+ save p; picture p;
+ if picture s: p=s
+ elseif path s: p=image(draw s)
+ else: p = LaTeX(s)
+ fi;
+ thelabel(p,_tab(n,m))
+enddef;
+
+def tablabel = draw thetablabel enddef;
+
+vardef tablabels(expr s)(text t) text cc=
+ save li, co;
+ numeric li,co;
+ for i=t:
+ if pair i:
+ tablabel(s,xpart i,ypart i) cc;
+ else:
+ if rep_tab_p mod 2 = 1:
+ li := rep_tab_p - ((2i-2) div rep_tab_n);
+ if rep_tab_n mod 2 =0:
+ co:=(2i-1 - (li mod 2)) mod rep_tab_n + 1;
+ else:
+ co:=(2i-2) mod rep_tab_n + 1;
+ fi
+ else:
+ li := rep_tab_p - ((2i-1) div rep_tab_n);
+ if rep_tab_n mod 2 =0:
+ co:=(2i-1 - (li mod 2)) mod rep_tab_n + 1;
+ else:
+ co:=(2i-1) mod rep_tab_n + 1;
+ fi
+ fi
+ tablabel(s,co,li);
+ fi
+ endfor
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% DESSINS %%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% pions - 2 versions pioni et pionii
+vardef Pioni(expr coulint,coulext)=
+ image(%
+ fill cercle((0,0),0.4) couleur coulint;
+ draw cercle((0,0),0.4) epaisseur (0.5*Ux/cm) couleur coulext;
+ draw cercle((0,0),0.25) epaisseur (0.5*Ux/cm) couleur coulext;
+ draw (-0.05,0)--(0.05,0) epaisseur (0.5*Ux/cm) couleur coulext;
+ draw (0,0.05)--(0,-0.05) epaisseur (0.5*Ux/cm) couleur coulext
+ )
+enddef;
+
+
+%vardef Pionnoiri = Pioni(noir,0.85blanc) enddef;
+%vardef Pionblanci = Pioni(0.9blanc,noir) enddef;
+
+
+vardef Pionii(expr coulint,coulext)=
+ image(%
+ fill (cercle((0,0),0.4) yscaled 0.5) couleur coulint;
+ draw (arccercle((-0.4,0),(0,0),(0.4,0)) yscaled 0.5) epaisseur (0.5*Ux/cm) couleur coulext;
+ fill (cercle((0,0),0.4) yscaled 0.5 shifted (0,0.1)) couleur coulint;
+ draw (cercle((0,0),0.4) yscaled 0.5 shifted (0,0.1)) epaisseur (0.5*Ux/cm) couleur coulext;
+ draw (-0.4,0)--(-0.4,0.1) epaisseur (0.5*Ux/cm) couleur coulext;
+ draw (0.4,0)--(0.4,0.1) epaisseur (0.5*Ux/cm) couleur coulext;
+ )
+enddef;
+
+% dame - 2 versions damei et dameii
+vardef Damei(expr coulint,coulext)=
+ image(%
+ fill cercle((0,0),0.4) couleur coulint;
+ draw cercle((0,0),0.4) epaisseur (0.5*Ux/cm) couleur coulext;
+ fill cercle((0,0),0.08) couleur coulext;
+ draw (-0.15,0)--(0.15,0) epaisseur (0.9*Ux/cm) couleur coulext;
+ draw (0,0.15)--(0,-0.15) epaisseur (0.9*Ux/cm) couleur coulext;
+ draw (-0.1,0.1)--(0.1,-0.1) epaisseur (0.3*Ux/cm) couleur coulext;
+ draw (0.1,0.1)--(-0.1,-0.1) epaisseur (0.3*Ux/cm) couleur coulext
+ )
+enddef;
+
+%vardef Damenoirei = Dame(noir,0.85blanc) enddef;
+%vardef Dameblanchei = Dame(0.9blanc,noir) enddef;
+
+vardef Dameii(expr coulint,coulext)=
+ image(%
+ fill (cercle((0,0),0.4) yscaled 0.5) couleur coulint;
+ draw (arccercle((-0.4,0),(0,0),(0.4,0)) yscaled 0.5) epaisseur (0.5*Ux/cm) couleur coulext;
+ fill (cercle((0,0),0.4) yscaled 0.5 shifted (0,0.1)) couleur coulint;
+ draw (arccercle((-0.4,0),(0,0),(0.4,0)) yscaled 0.5 shifted (0,0.1)) epaisseur (0.5*Ux/cm) couleur coulext;
+ fill (cercle((0,0),0.4) yscaled 0.5 shifted (0,0.2)) couleur coulint;
+ draw (cercle((0,0),0.4) yscaled 0.5 shifted (0,0.2)) epaisseur (0.5*Ux/cm) couleur coulext;
+ draw (-0.4,0)--(-0.4,0.2) epaisseur (0.5*Ux/cm) couleur coulext;
+ draw (0.4,0)--(0.4,0.2) epaisseur (0.5*Ux/cm) couleur coulext;
+ )
+enddef;
+
+
+def Pion(expr v)=
+ if v=1:
+ Pioni
+ else:
+ Pionii
+ fi
+enddef;
+
+def Dame(expr v)=
+ if v=1:
+ Damei
+ else:
+ Dameii
+ fi
+enddef;
+
+% Croix
+vardef Croix=
+ interim linecap:=butt;
+ image(%
+ draw (0,0)--(1,1) epaisseur (1.2*Ux/cm);
+ draw (0,1)--(1,0) epaisseur (1.2*Ux/cm)
+ )
+enddef;
+
+% Trou
+vardef Trou=
+ image(%
+ fill fullcircle scaled 0.8)
+enddef;
+
+% Marques - 2 versions
+vardef Marquei(expr coul)=
+ save tmp;
+ save a,b,c,d;
+ pair a,b,c,d;
+ picture tmp;
+ tmp:=image(
+ fill fullcircle scaled 0.8 yscaled 0.4 shifted (0,-0.2) couleur coul);
+ a=llcorner tmp;b= lrcorner tmp; c=urcorner tmp; d=ulcorner tmp;
+ setbounds tmp to (a--b--(2.2c-1.2b)--(2.2d-1.2a)--cycle);
+ tmp
+enddef;
+
+vardef Marqueii(expr coul)=
+ image(%
+ fill((0.1,0.1)--(0.9,0.1)--(0.9,0.9)--(0.1,0.9)--cycle) couleur coul;
+ )
+enddef;
+
+def Marque(expr v)=
+ if v=1:
+ Marquei
+ else:
+ Marqueii
+ fi
+enddef;
+
+% Mur
+vardef Mur (expr coulint,coulext)=
+ image(%
+ fill ((0,0)--(1,0)--(1,1)--(0,1)--cycle) couleur coulint;
+ draw ((0,0)--(0.3,0)--(0.3,0.7)--(0,0.7)--cycle) epaisseur (Ux/cm) couleur coulext;
+ draw ((0.3,0)--(1,0)--(1,0.3)--(0.3,0.3)--cycle) epaisseur (Ux/cm) couleur coulext;
+ draw ((1,0.3)--(1,1)--(0.7,1)--(0.7,0.3)--cycle) epaisseur (Ux/cm) couleur coulext;
+ draw ((0.7,1)--(0,1)--(0,0.7)--(0.7,0.7)--cycle) epaisseur (Ux/cm) couleur coulext;
+ )
+enddef;
+
+% Plot
+vardef Plot(expr couli,coulii)=
+ image(%
+ fill cercle((0,0),0.4) yscaled 0.4 couleur coulii;
+ fill cercle((0,0),0.3) yscaled 0.4 couleur couli;
+ fill (-0.3,0)--(-0.05,0.6)--(0.05,0.6)--(0.3,0)--cycle couleur couli;
+ fill cercle((0,0),0.05) yscaled 0.4 shifted (0,0.6) couleur coulii;
+ )
+enddef;
+
+% Caisse
+vardef Caisse(expr coulint,coulext)=
+ save a,b;
+ pair a,b,c,d;
+ a=(0.1,0.1);b=(0.9,0.1);
+ c=(0.9,0.9);d=(0.1,0.9);
+ image(%
+ fill (a--b--c--d--cycle) couleur coulint;
+ for i=1 upto 7:
+ draw (a--b) shifted (0,0.1*i) epaisseur (0.7*Ux/cm) couleur coulext;
+ endfor
+ show Ux/cm;
+ draw a--b--c--d--cycle epaisseur (1.5*Ux/cm) couleur coulext;
+ draw a--c epaisseur (1.5*Ux/cm) couleur coulext;
+ draw b--d epaisseur (1.5*Ux/cm) couleur coulext;
+ )
+enddef;
+
+
+
+% Robot
+vardef Rob_chaine=
+ (1.5,1)..(1.7,0.7)..(2.4,0.4)..(4.4,0.3)..(6.4,0.3)..(7,0.5)..(7,1.2)..(6.2,2.2)..(5.3,3)..(3.9,3.5)..(3.1,3.6)..(2.3,3.2)..(1.7,2.3)..cycle
+enddef;
+
+
+vardef Rob_corps=
+ (6.28,7.33)..(7.23,6.67)..(7.5,6.36)..(7.6,5)..(7.5,3.53)..(7.35,3.23)..(7,3)..(6.43,2.82)..(5.95,2.74)..(2,3.27)..(1.64,3.98)..(1.46,5.11)..(1.46,6.41)..(1.99,7.34)..cycle
+enddef;
+
+vardef Rob_tete=
+ fullcircle xscaled 5.9 yscaled 3.8 shifted (4.1,8.8)
+enddef;
+
+vardef Rob_haut=
+ fullcircle xscaled 5.5 yscaled 1.6 shifted (4.1,10.4)
+enddef;
+
+vardef Rob_bras=
+ (3,5.5)..(3.4,5)..(3.8,4.5)..(4.2,4.1)..(5,4)..(6,4)..(6.3,4.8)..(5.9,5.4)..(4.9,5.2)..(4.9,5.7)..(4.6,6.2)..(4.1,6.5)..(3.5,6.3)..(3,5.9)..cycle
+enddef;
+
+vardef Rob_oeild=
+ fullcircle scaled 0.9 shifted (5.1,8.7)
+enddef;
+
+vardef Rob_oeilg=
+ fullcircle xscaled 0.6 yscaled 0.85 shifted (6.67,9.1)
+enddef;
+
+vardef Rob_bouche=
+ (5.9,7.8)..(6.2,7.8)..(6.4,7.9)
+enddef;
+
+vardef Robotdroite(expr couli,coulii)=
+ save tmp;
+ picture tmp;
+ tmp:=image(%
+ fill Rob_chaine shifted (2,2) withcolor couli;
+ draw Rob_chaine shifted (2,2) withcolor 0.7couli+0.3white epaisseur (8*Ux/cm);
+ fill Rob_corps withcolor coulii;
+ fill Rob_tete withcolor couli;
+ fill buildcycle(Rob_tete,Rob_haut) withcolor coulii;
+ fill Rob_oeild withcolor coulii;
+ fill Rob_oeilg withcolor coulii;
+ draw Rob_bouche withcolor coulii epaisseur (5*Ux/cm);
+ fill Rob_bras withcolor 0.7couli+0.3white;
+ fill Rob_chaine withcolor couli;
+ draw Rob_chaine withcolor 0.7couli+0.3white epaisseur (8*Ux/cm)) scaled 0.085;
+ tmp
+enddef;
+
+vardef Robotgauche(expr couli,coulii)=
+ Robotdroite(couli,coulii) xscaled -1
+enddef;
+
+
+% Bateau
+vardef Bat_coque=
+ (-0.8,0.4)--(-0.55,0.1)--(0.8,0.1)--(0.7,0.25)--(0.1,0.25)--(-0.1,0.4)--cycle
+enddef;
+
+vardef Bat_cabine=
+ (-0.6,0.4)--(-0.5,0.55)--(0.2,0.55)--(0.3,0.4)--(0.5,0.4)--(0.6,0.25)--(0.1,0.25)--(-0.1,0.4)--cycle
+enddef;
+
+vardef Bat_barre=
+ (-0.54,0.475)--(-0.15,0.475)
+enddef;
+
+vardef Bat_cheminee=
+ (0,0)--(0,0.1)--(0.15,0.1)--(0.15,0)--cycle
+enddef;
+
+
+vardef Bateau(expr num, coul)=
+ save e,fx,fy;
+ numeric e,fx,fy;
+ fx := if num=2: 1
+ elseif num=1: 0.5
+ elseif num=3: 1.6
+ elseif num=4: 2.3
+ else: 1
+ fi;
+ fy := if num=2: 1
+ elseif num=1: 0.7
+ elseif num=3: 1.2
+ elseif num=4: 1.3
+ else: 1
+ fi;
+ e:=(0.7*fx-0.15*num)/(num+1);
+ image(%
+ fill Bat_coque xscaled fx yscaled fy couleur (0.75*blanc+0.25*coul) ;
+ fill Bat_cabine xscaled fx yscaled fy couleur blanc;
+ for i=0 upto num-1:
+ fill Bat_cheminee shifted ((-0.5,0.55) xscaled fx yscaled fy) shifted (e+i*(e+0.15),0) couleur (0.75*blanc+0.25*coul);
+ draw Bat_cheminee shifted ((-0.5,0.55) xscaled fx yscaled fy) shifted (e+i*(e+0.15),0) epaisseur (0.7*Ux/cm) couleur coul;
+ endfor
+ draw Bat_coque xscaled fx yscaled fy epaisseur (0.7*Ux/cm) couleur coul;
+ draw Bat_cabine xscaled fx yscaled fy epaisseur (0.7*Ux/cm) couleur coul;
+ draw Bat_barre xscaled fx yscaled fy epaisseur (1.2*Ux/cm) couleur coul;
+ )
+enddef;
+
+% Eau
+vardef Eau(expr coul)=
+ save vague;
+ path vague;
+ vague :=(-0.3,0)..(-0.15,0.05){right}..(0,0)..(0.15,-0.05){right}..(0.3,0);
+ image(%
+ draw vague epaisseur (Ux/cm) couleur coul;
+ draw vague shifted (0,0.15) epaisseur (Ux/cm) couleur coul;
+ )
+enddef;
+
+% Flèche
+vardef Fleche(expr coulint,coulext)=
+ save tmp;
+ path tmp;
+ tmp:= ((0.45,0)--(0.45,3)--(1,3)--(0,4)--(-1,3)--(-0.45,3)--(-0.45,0)--cycle) scaled 0.2;
+ image(fill tmp couleur coulint;
+ draw tmp couleur coulext)
+enddef;
+