diff options
Diffstat (limited to 'graphics/metapost/contrib/macros/repere/repere.mp')
-rw-r--r-- | graphics/metapost/contrib/macros/repere/repere.mp | 917 |
1 files changed, 639 insertions, 278 deletions
diff --git a/graphics/metapost/contrib/macros/repere/repere.mp b/graphics/metapost/contrib/macros/repere/repere.mp index c3f5a1496a..292d415a9b 100644 --- a/graphics/metapost/contrib/macros/repere/repere.mp +++ b/graphics/metapost/contrib/macros/repere/repere.mp @@ -2,7 +2,7 @@ %% repere.mp %% %% Macros pour la construction de figures dans un repère %% %% o.peault@posteo.net %% -%% Version 23.02 (Février 2023) %% +%% Version 23.05 (Mai 2023) %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % This work may be distributed and/or modified under the conditions of @@ -21,6 +21,7 @@ % segments, vecteurs, polygones complets % Octobre-Décembre 2022 : doc % Février 2023 : Main levée +% Mai 2023 : Transformations, couleur de fond, pixart input format; if not known mplib: input latexmp fi; @@ -140,7 +141,7 @@ vardef definitionrepere@#(text t) = Ux:=_def3;Uy:=_def6; _T:=identity xscaled Ux yscaled Uy slanted cosd(theta) yscaled sind(theta); _defcadre; - setrepere(Xmin,Xmax,Ymin,Ymax); + settout(Xmin,Xmax,Ymin,Ymax); _O:=_cart(0,0); xO:=0 ; yO:=0;_O_:=(0,0); _I:=_cart(1,0); _J:=_cart(0,1); taillegrad:=0.8mm;taillepoint:=3;taillecroix:=5;_nbaxes:=0;_axorlab:=nullpicture;poslabO:=(0,0); @@ -167,13 +168,14 @@ def init_traces = fi _op_ enddef; - def draw expr p= + def Draw expr p= if (path p) and (type_trace="mainlevee"): ddraw mainleveepath(p) else: ddraw p fi enddef; + def draw expr p= Draw p enddef; %% fill def fill expr c = if path c: @@ -182,6 +184,10 @@ def init_traces = olddraw c fi enddef; + %% fill + def filldraw expr c = + addto currentpicture contour (c transformed _T) withpen currentpen + _op_ enddef; %% thelabel vardef thelabel@#(expr s,z) = % Position s near z save p; picture p; @@ -214,7 +220,7 @@ def init_traces = if type_trace="mainlevee": ddrawarrow mainleveepath(p) else: - ddrawarrow p + ddrawarrow p fi enddef; def ddrawdblarrow expr p = _apth:=p transformed _T; _findarr enddef; @@ -222,7 +228,7 @@ def init_traces = if type_trace="mainlevee": ddrawdblarrow mainleveepath(p) else: - ddrawdblarrow p + ddrawdblarrow p fi enddef; %% bbox @@ -244,6 +250,9 @@ def traces_orig = fi _op_ enddef; + def filldraw expr c = + addto currentpicture contour c withpen currentpen + _op_ enddef; vardef thelabel@#(expr s,z) = % Position s near z save p; picture p; if picture s: p=s @@ -266,13 +275,13 @@ enddef; def _finarr text t = olddraw _apth t; - filldraw arrowhead _apth t + oldfilldraw arrowhead _apth t enddef; def _findarr text t = olddraw _apth t; - filldraw arrowhead _apth withpen currentpen t; - filldraw arrowhead reverse _apth withpen currentpen t + oldfilldraw arrowhead _apth withpen currentpen t; + oldfilldraw arrowhead reverse _apth withpen currentpen t enddef; vardef arrowhead expr p = %redéfinition flèches @@ -355,8 +364,7 @@ def setaxes(expr a,b,c,d)= enddef; def setgrad(expr a,b,c,d)= - GradXmin:=a;GradXmax:=b;GradYmin:=c;GradYmax:=d; - setval(a,b,c,d); + GradXmin:=a;GradXmax:=b;GradYmin:=c;GradYmax:=d enddef; def setval(expr a,b,c,d)= @@ -377,9 +385,25 @@ enddef; let setall=setrepere; let settout=setrepere; +color fond_coul; + + def fin = if _nbaxes=1: olddraw _axorlab fi; if coupe: clip currentpicture to (cadre transformed _T) fi; +% Gestion du fond + if known fond_coul: + background:=fond_coul; + save tmpfig; + picture tmpfig; + tmpfig:=currentpicture; + currentpicture:=nullpicture; + newinternal bboxmargin; + bboxmargin:=0bp; + fill bbox tmpfig withcolor background; + draw tmpfig; + fi; +% Fin gestion du fond if bf: oldendfig; bf:=false;_nfig:=_nfig+1 fi; rep_tab:=false; % Ajout octobre 2021 traces_orig; @@ -475,9 +499,9 @@ vardef etiquettey@#(expr y)= enddef; -%vardef cheminaxex=_cart(AxeXmin,yO)--_cart(AxeXmax,yO) enddef; +%vardef dessinaxex=_cart(AxeXmin,yO)--_cart(AxeXmax,yO) enddef; -%vardef cheminaxey=_cart(xO,AxeYmin)--_cart(xO,AxeYmax) enddef; +%vardef dessinaxey=_cart(xO,AxeYmin)--_cart(xO,AxeYmax) enddef; vardef cheminaxex= (AxeXmin,yO)-- @@ -504,7 +528,9 @@ vardef graduationsaxex(expr grad)= %%%% ensemble des graduations abscisses olddraw graduationx(arrondimil(i*grad)+xO) withpen pencircle scaled 0.5bp; endfor % dernière graduation - if AxeXmax*Ux-(imax*grad+xO)*Ux>ahlength: olddraw graduationx(arrondimil(imax*grad)+xO) withpen pencircle scaled 0.5bp fi); + if AxeXmax*Ux-(imax*grad+xO)*Ux>ahlength: + olddraw graduationx(arrondimil(imax*grad)+xO) withpen pencircle scaled 0.5bp + fi); $ enddef; @@ -526,27 +552,27 @@ vardef etiquettesaxex@#(expr val)= %%% ensemble des étiquettes abscisses picture $,labmin,labmax; numeric imin,imax; $=image(% - imin:=ceiling((ValXmin-xO)/val);imax:=floor((ValXmax-xO)/val); - % définition première étiquette + imin:=ceiling((ValXmin-xO)/val);imax:=floor((ValXmax-xO)/val); + % définition première étiquette if (imin<>0): - labmin:= etiquettex.@#(arrondimil(imin*val)+xO) - else: labmin:=nullpicture - fi; - % définition dernière étiquette + labmin:= etiquettex.@#(arrondimil(imin*val)+xO) + else: labmin:=nullpicture + fi; + % définition dernière étiquette if (imax<>0): - labmax:= etiquettex.@#(arrondimil(imax*val)+xO) - else: labmax:=nullpicture - fi; - % tracé première étiquette - if xpart ((ulcorner labmin) transformed inverse _T)>=Xmin: olddraw labmin fi; - % tracé autres étiquettes - for i=imin+1 upto imax-1: - if (i<>0): - olddraw etiquettex.@#(arrondimil(i*val)+xO) - fi; - endfor; - % tracé dernière étiquette - if xpart ((lrcorner labmax) transformed inverse _T)<=Xmax: olddraw labmax fi; + labmax:= etiquettex.@#(arrondimil(imax*val)+xO) + else: labmax:=nullpicture + fi; + % tracé première étiquette + if xpart ((ulcorner labmin) transformed inverse _T)>=Xmin: olddraw labmin fi; + % tracé autres étiquettes + for i=imin+1 upto imax-1: + if (i<>0): + olddraw etiquettex.@#(arrondimil(i*val)+xO) + fi; + endfor; + % tracé dernière étiquette + if xpart ((lrcorner labmax) transformed inverse _T)<=Xmax: olddraw labmax fi; ); $ enddef; @@ -556,27 +582,27 @@ vardef etiquettesaxey@#(expr val)= %%% ensemble des étiquettes ordonnées picture $,labmin,labmax; numeric imin,imax; $=image(% - imin:=ceiling((ValYmin-yO)/val);imax:=floor((ValYmax-yO)/val); - % définition première étiquette + imin:=ceiling((ValYmin-yO)/val);imax:=floor((ValYmax-yO)/val); + % définition première étiquette if (imin<>0): - labmin:= etiquettey.@#(arrondimil(imin*val)+yO) - else: labmin:=nullpicture - fi; - % définition dernière étiquette + labmin:= etiquettey.@#(arrondimil(imin*val)+yO) + else: labmin:=nullpicture + fi; + % définition dernière étiquette if (imax<>0): - labmax:= etiquettey.@#(arrondimil(imax*val)+yO) - else: labmax:=nullpicture - fi; - % tracé première étiquette - if ypart (llcorner labmin) >=ypart _cart(Xmin,Ymin): olddraw labmin fi; - % tracé autres étiquettes - for i=imin+1 upto imax-1: - if (i<>0): - olddraw etiquettey.@#(arrondimil(i*val)+yO) - fi; - endfor; - % tracé dernière étiquette - if ypart (ulcorner labmax) <=ypart _cart(Xmax,Ymax): olddraw labmax fi + labmax:= etiquettey.@#(arrondimil(imax*val)+yO) + else: labmax:=nullpicture + fi; + % tracé première étiquette + if ypart (llcorner labmin) >=ypart _cart(Xmin,Ymin): olddraw labmin fi; + % tracé autres étiquettes + for i=imin+1 upto imax-1: + if (i<>0): + olddraw etiquettey.@#(arrondimil(i*val)+yO) + fi; + endfor; + % tracé dernière étiquette + if ypart (ulcorner labmax) <=ypart _cart(Xmax,Ymax): olddraw labmax fi ); $ enddef; @@ -597,35 +623,35 @@ vardef _axex_@#(expr grad,val,nn)= if grad>0: olddraw graduationsaxex(grad) fi; % étiquettes if val>0: - if nn=1: - if str @#<>"": - olddraw etiquettesaxex@#(val); - _axorlab:=etiquettex@#(xO) - else: - olddraw etiquettesaxex.bot(val); - _axorlab:=etiquettex.bot(xO) - fi; - poslabO:=poslabO + unitvector(0,ypart _posgradx@#); - if xO<>yO: - olddraw _axorlab - elseif _nbaxes=2: - olddraw _etiqx_(xO,0,xO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) - fi - elseif nn=2: - if str @#<>"": - olddraw etiquettesaxex@#(val); - olddraw etiquettex@#(xO) - else: - olddraw etiquettesaxex.bot(val); - olddraw etiquettex.bot(xO) - fi - else: - if str @#<>"": - olddraw etiquettesaxex@#(val) - else: - olddraw etiquettesaxex.bot(val) - fi - fi + if nn=1: + if str @#<>"": + olddraw etiquettesaxex@#(val); + _axorlab:=etiquettex@#(xO) + else: + olddraw etiquettesaxex.bot(val); + _axorlab:=etiquettex.bot(xO) + fi; + poslabO:=poslabO + unitvector(0,ypart _posgradx@#); + if xO<>yO: + olddraw _axorlab + elseif _nbaxes=2: + olddraw _etiqx_(xO,0,xO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) + fi + elseif nn=2: + if str @#<>"": + olddraw etiquettesaxex@#(val); + olddraw etiquettex@#(xO) + else: + olddraw etiquettesaxex.bot(val); + olddraw etiquettex.bot(xO) + fi + else: + if str @#<>"": + olddraw etiquettesaxex@#(val) + else: + olddraw etiquettesaxex.bot(val) + fi + fi fi ); $ @@ -647,35 +673,35 @@ vardef _axey_@#(expr grad,val,nn)= if grad>0: olddraw graduationsaxey(grad) fi; % étiquettes if val>0: - if nn=1: - if str @#<>"": - olddraw etiquettesaxey@#(val); - _axorlab:=etiquettey@#(yO) - else: - olddraw etiquettesaxey.lft(val); - _axorlab:=etiquettey.lft(yO) - fi; - poslabO:=poslabO + unitvector(xpart _posgrady@#,0); - if xO<>yO: - olddraw _axorlab - elseif _nbaxes=2: - olddraw _etiqy_(yO,0,yO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) - fi - elseif nn=2: - if str @#<>"": - olddraw etiquettesaxey@#(val); - olddraw etiquettey@#(yO) - else: - olddraw etiquettesaxey.lft(val); - olddraw etiquettey.lft(yO) - fi - else: - if str @#<>"": - olddraw etiquettesaxey@#(val) - else: - olddraw etiquettesaxey.lft(val) - fi - fi + if nn=1: + if str @#<>"": + olddraw etiquettesaxey@#(val); + _axorlab:=etiquettey@#(yO) + else: + olddraw etiquettesaxey.lft(val); + _axorlab:=etiquettey.lft(yO) + fi; + poslabO:=poslabO + unitvector(xpart _posgrady@#,0); + if xO<>yO: + olddraw _axorlab + elseif _nbaxes=2: + olddraw _etiqy_(yO,0,yO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) + fi + elseif nn=2: + if str @#<>"": + olddraw etiquettesaxey@#(val); + olddraw etiquettey@#(yO) + else: + olddraw etiquettesaxey.lft(val); + olddraw etiquettey.lft(yO) + fi + else: + if str @#<>"": + olddraw etiquettesaxey@#(val) + else: + olddraw etiquettesaxey.lft(val) + fi + fi fi ); $ @@ -759,15 +785,15 @@ vardef fracmulttext(expr n,d,tt)= %%%% construction de la fraction n*tt/d else: fraction:="" fi; if dd=1: - if nn=1: - fr:=tt - else: fr:=decimal nn & tt - fi + if nn=1: + fr:=tt + else: fr:=decimal nn & tt + fi else: - if nn=1: - fr:="\" & fraction & "frac{" & tt & "}{" & decimal dd & "}" - else: fr:="\" & fraction & "frac{" & decimal nn & tt & "}{" & decimal dd & "}" - fi + if nn=1: + fr:="\" & fraction & "frac{" & tt & "}{" & decimal dd & "}" + else: fr:="\" & fraction & "frac{" & decimal nn & tt & "}{" & decimal dd & "}" + fi fi; if n<0: s:="-" @@ -800,27 +826,27 @@ vardef etiquettesaxexpi@#(expr n,d)= %%% ensemble des étiquettes multiple numeric imin,imax,val; val:=n*pi/d; $=image(% - imin:=ceiling((ValXmin-xO)/val);imax:=floor((ValXmax-xO)/val); - % définition première étiquette + imin:=ceiling((ValXmin-xO)/val);imax:=floor((ValXmax-xO)/val); + % définition première étiquette if (imin<>0): - labmin:= etiquettexpi.@#(imin*n,d) - else: labmin:=nullpicture - fi; - % définition dernière étiquette + labmin:= etiquettexpi.@#(imin*n,d) + else: labmin:=nullpicture + fi; + % définition dernière étiquette if (imax<>0): - labmax:= etiquettexpi.@#(imax*n,d) - else: labmax:=nullpicture - fi; - % tracé première étiquette - if xpart ((ulcorner labmin) transformed inverse _T)>=Xmin: draw labmin fi; - % tracé autres étiquettes - for i=imin+1 upto imax-1: - if (i<>0): - draw etiquettexpi.@#(i*n,d) - fi; - endfor; - % tracé dernière étiquette - if xpart ((lrcorner labmax) transformed inverse _T)<=Xmax: draw labmax fi; + labmax:= etiquettexpi.@#(imax*n,d) + else: labmax:=nullpicture + fi; + % tracé première étiquette + if xpart ((ulcorner labmin) transformed inverse _T)>=Xmin: draw labmin fi; + % tracé autres étiquettes + for i=imin+1 upto imax-1: + if (i<>0): + draw etiquettexpi.@#(i*n,d) + fi; + endfor; + % tracé dernière étiquette + if xpart ((lrcorner labmax) transformed inverse _T)<=Xmax: draw labmax fi; ); $ enddef; @@ -831,27 +857,27 @@ vardef etiquettesaxeypi@#(expr n,d)= %%% ensemble des étiquettes multiple numeric imin,imax,val; val:=n*pi/d; $=image(% - imin:=ceiling((ValYmin-yO)/val);imax:=floor((ValYmax-yO)/val); - % définition première étiquette + imin:=ceiling((ValYmin-yO)/val);imax:=floor((ValYmax-yO)/val); + % définition première étiquette if (imin<>0): - labmin:= etiquetteypi.@#(imin*n,d) - else: labmin:=nullpicture - fi; - % définition dernière étiquette + labmin:= etiquetteypi.@#(imin*n,d) + else: labmin:=nullpicture + fi; + % définition dernière étiquette if (imax<>0): - labmax:= etiquetteypi.@#(imax*n,d) - else: labmax:=nullpicture - fi; - % tracé première étiquette - if ypart (llcorner labmin) >=ypart _cart(Xmin,Ymin): draw labmin fi; - % tracé autres étiquettes - for i=imin+1 upto imax-1: - if (i<>0): - draw etiquetteypi.@#(i*n,d) - fi; - endfor; - % tracé dernière étiquette - if ypart (ulcorner labmax) <=ypart _cart(Xmax,Ymax): draw labmax fi + labmax:= etiquetteypi.@#(imax*n,d) + else: labmax:=nullpicture + fi; + % tracé première étiquette + if ypart (llcorner labmin) >=ypart _cart(Xmin,Ymin): draw labmin fi; + % tracé autres étiquettes + for i=imin+1 upto imax-1: + if (i<>0): + draw etiquetteypi.@#(i*n,d) + fi; + endfor; + % tracé dernière étiquette + if ypart (ulcorner labmax) <=ypart _cart(Xmax,Ymax): draw labmax fi ); $ enddef; @@ -875,31 +901,31 @@ vardef _axexpi_@#(expr num,den,nn)= % étiquettes if nn=1: if str @#<>"": - draw etiquettesaxexpi@#(num,den); - _axorlab:=etiquettexpi@#(xO/pi,1) + draw etiquettesaxexpi@#(num,den); + _axorlab:=etiquettexpi@#(xO/pi,1) else: - draw etiquettesaxexpi.bot(num,den); - _axorlab:=etiquettexpi.bot(xO/pi,1) + draw etiquettesaxexpi.bot(num,den); + _axorlab:=etiquettexpi.bot(xO/pi,1) fi; poslabO:=poslabO + unitvector(0,ypart _posgradx@#); if xO<>yO: - draw _axorlab + draw _axorlab elseif _nbaxes=2: - draw _etiqx_(xO,0,fracmultpi(xO/pi,1)) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) + draw _etiqx_(xO,0,fracmultpi(xO/pi,1)) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) fi elseif nn=2: if str @#<>"": - draw etiquettesaxexpi@#(num,den); - draw etiquettexpi@#(xO/pi,1) + draw etiquettesaxexpi@#(num,den); + draw etiquettexpi@#(xO/pi,1) else: - draw etiquettesaxexpi.bot(num,den); - draw etiquettexpi.bot(xO/pi,1) + draw etiquettesaxexpi.bot(num,den); + draw etiquettexpi.bot(xO/pi,1) fi else: if str @#<>"": - draw etiquettesaxexpi@#(num,den) + draw etiquettesaxexpi@#(num,den) else: - draw etiquettesaxexpi.bot(num,den) + draw etiquettesaxexpi.bot(num,den) fi fi ); @@ -925,32 +951,32 @@ vardef _axeypi_@#(expr num,den,nn)= % étiquettes if nn=1: if str @#<>"": - draw etiquettesaxeypi@#(num,den); - _axorlab:=etiquetteypi@#(yO/pi,1) + draw etiquettesaxeypi@#(num,den); + _axorlab:=etiquetteypi@#(yO/pi,1) else: - draw etiquettesaxeypi.lft(num,den); - _axorlab:=etiquetteypi.lft(yO/pi,1) + draw etiquettesaxeypi.lft(num,den); + _axorlab:=etiquetteypi.lft(yO/pi,1) fi; poslabO:=poslabO + unitvector(xpart _posgrady@#,0); if xO<>yO: - draw _axorlab + draw _axorlab elseif _nbaxes=2: - draw _etiqy_(yO,0,fracmultpi(yO/pi,1)) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) -% draw _etiqy_(yO,0,yO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) + draw _etiqy_(yO,0,fracmultpi(yO/pi,1)) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) +% draw _etiqy_(yO,0,yO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) fi elseif nn=2: if str @#<>"": - draw etiquettesaxeypi@#(num,den); - draw etiquetteypi@#(yO/pi,1) + draw etiquettesaxeypi@#(num,den); + draw etiquetteypi@#(yO/pi,1) else: - draw etiquettesaxeypi.lft(num,den); - draw etiquetteypi.lft(yO/pi,1) + draw etiquettesaxeypi.lft(num,den); + draw etiquetteypi.lft(yO/pi,1) fi else: if str @#<>"": - draw etiquettesaxeypi@#(num,den) + draw etiquettesaxeypi@#(num,den) else: - draw etiquettesaxeypi.lft(num,den) + draw etiquettesaxeypi.lft(num,den) fi fi ); @@ -1032,19 +1058,19 @@ vardef axexpart@#(text t)= boolean var; var:=false; $=image(% - for _i=t: - if numeric _i: - if var: if str @#="": draw _etiqx_.bot(tmp,taillegrad,tmp) else: draw _etiqx_@#(tmp,taillegrad,tmp) fi fi; - if gradxpart: - olddraw graduationx(_i) withpen pencircle scaled 0.8bp - fi; - tmp:=_i; - var:=true - else: - if str @#="": draw _etiqx_.bot(tmp,taillegrad,_i) else: draw _etiqx_@#(tmp,taillegrad,_i) fi; - var:=false - fi; - endfor; + for _i=t: + if numeric _i: + if var: if str @#="": draw _etiqx_.bot(tmp,taillegrad,tmp) else: draw _etiqx_@#(tmp,taillegrad,tmp) fi fi; + if gradxpart: + olddraw graduationx(_i) withpen pencircle scaled 0.8bp + fi; + tmp:=_i; + var:=true + else: + if str @#="": draw _etiqx_.bot(tmp,taillegrad,_i) else: draw _etiqx_@#(tmp,taillegrad,_i) fi; + var:=false + fi; + endfor; if var: if str @#="": draw _etiqx_.bot(tmp,taillegrad,tmp) else: draw _etiqx_@#(tmp,taillegrad,tmp) fi fi); $ enddef; @@ -1056,20 +1082,20 @@ vardef axeypart@#(text t)= boolean var; var:=false; $=image(% - for _i=t: - if numeric _i: - if var: if str @#="": draw _etiqy_.lft(tmp,taillegrad,tmp) else: draw _etiqy_@#(tmp,taillegrad,tmp) fi fi; -% olddraw ((taillegrad,0)--(-taillegrad,0)) shifted _cart(xO,_i) withpen pencircle scaled 0.8bp; - if gradypart: - olddraw graduationy(_i) withpen pencircle scaled 0.8bp - fi; - tmp:=_i; - var:=true - else: - if str @#="": draw _etiqy_.lft(tmp,taillegrad,_i) else: draw _etiqy_@#(tmp,taillegrad,_i) fi; - var:=false - fi; - endfor; + for _i=t: + if numeric _i: + if var: if str @#="": draw _etiqy_.lft(tmp,taillegrad,tmp) else: draw _etiqy_@#(tmp,taillegrad,tmp) fi fi; +% olddraw ((taillegrad,0)--(-taillegrad,0)) shifted _cart(xO,_i) withpen pencircle scaled 0.8bp; + if gradypart: + olddraw graduationy(_i) withpen pencircle scaled 0.8bp + fi; + tmp:=_i; + var:=true + else: + if str @#="": draw _etiqy_.lft(tmp,taillegrad,_i) else: draw _etiqy_@#(tmp,taillegrad,_i) fi; + var:=false + fi; + endfor; if var: if str @#="": draw _etiqy_.lft(tmp,taillegrad,tmp) else: draw _etiqy_@#(tmp,taillegrad,tmp) fi fi); $ enddef; @@ -1187,7 +1213,6 @@ enddef; def labelang = draw thelabelang enddef; - vardef nommepoint@#(text t)= save $,ch,dess,latch; pair $; @@ -1200,13 +1225,18 @@ vardef nommepoint@#(text t)= fi; if long_texte(t)=1: dess:=image(draw marquepointFig(t); - ch:=_chaine(t); - mylabel@#("$" & ch & "$",t) withcolor coullabel) + ch:="$" & _chaine(t) & "$"; + if _ext_tr_<>"": ch:=aj_extr_trsf(t,ch) fi; + mylabel@#(ch,t) withcolor coullabel) else: dess:=image(% for PP=t: - if pair PP: marquepoint(PP); $:=PP - else: if string PP: mylabel@#(PP,$) else: mylabel@#(PP scaled defaultscale,$) fi withcolor coullabel + if pair PP: + marquepoint(PP); $:=PP + elseif string PP: + mylabel@#(PP,$) withcolor coullabel; + else: + mylabel@#(PP scaled defaultscale,$) withcolor coullabel fi; endfor) fi; @@ -1262,8 +1292,9 @@ vardef nommepointrot@#(text t)(expr an)= fi; if long_texte(t)=1: dess:=image(draw marquepointFig(t); - ch:=_chaine(t); - mylabel@#("$" & ch & "$",t,an) withcolor coullabel) + ch:="$" & _chaine(t) & "$"; + if _ext_tr_<>"": ch:=aj_extr_trsf(t,ch) fi; + mylabel@#(ch,t,an) withcolor coullabel) else: dess:=image(% for PP=t: @@ -1301,10 +1332,12 @@ enddef; vardef nommeFig@#(text t)= save $; picture $; - if long_texte(t)=4: $:=nommeangle@#(t) + if long_texte(t)=4: $:=nommeangle@#(t,0) + elseif long_texte(t)=5: $:=nommeangle@#(t) else: for i=t: - if pair i: $:=nommepoint@#(t) + if pair i: + $:=nommepoint@#(t) elseif str @#="": $:=nommeautoobj(t) else: $:=nommecourbe@#(t) fi; @@ -2068,9 +2101,9 @@ senstan.gauche=(1,0);senstan.droite=(0,1);senstan.double=(1,1); c:= ypart direction t of p; _v:=N2*unitvector(direction t of p); $=image(% - marquepoint(M); - if (xpart senstan@#) <> 0: olddrawarrow _cart(M)--_cart(M)-_v*(xpart senstan@#) fi; - if (ypart senstan@#) <> 0: olddrawarrow _cart(M)--_cart(M)+_v*(ypart senstan@#) fi; + marquepoint(M); + if (xpart senstan@#) <> 0: olddrawarrow _cart(M)--_cart(M)-_v*(xpart senstan@#) fi; + if (ypart senstan@#) <> 0: olddrawarrow _cart(M)--_cart(M)+_v*(ypart senstan@#) fi; ); % $=image(% % drawdblarrow (M-)--(M+ ) @@ -2346,7 +2379,7 @@ numeric _suiterecdeb_, _suiterecfin_, _suiterecinit_; vardef suiterec(suffix f)(expr deb,fin,init)= %escalier un+1=f(un), u_deb=init vardef _suiterecfonc_(expr x)=f(x) enddef; - _suiterecdeb_:=deb;_suiterecfin_:=fin;_suiterecinit_:=init; %stocke les valeurs pour réutilisation + _suiterecdeb_:=deb;_suiterecfin_:=fin;_suiterecinit_:=init; %stocke les valeurs pour réutilisation save $,un; path $; numeric un; @@ -2359,20 +2392,20 @@ vardef suiterec(suffix f)(expr deb,fin,init)= %escalier un+1=f(un), u_deb=init $ enddef; -vardef suiterecprojx@#(text t)= %projections et étiquettes sur axe x, utilise les valeurs de suiterec +vardef suiterecprojx@#(text t)= %projections et étiquettes sur axe x, utilise les valeurs de suiterec save $,deb,fin,nom,_qw_,un,lab; picture $; string nom,lab; numeric deb,fin,_qw_,un,_prec; deb:=_suiterecdeb_;fin:=_suiterecfin_;un:=_suiterecinit_; _qw_:=1; - for i=t: %récupère les éventuelles nouvelles valeurs pour deb et fin + for i=t: %récupère les éventuelles nouvelles valeurs pour deb et fin if _qw_ =1: if string i: nom:=i else: nom:="_val";_prec:=i fi; elseif _qw_=2: - deb:=i; - for j=_suiterecdeb_ upto i-1: - un:=_suiterecfonc_(un); - endfor + deb:=i; + for j=_suiterecdeb_ upto i-1: + un:=_suiterecfonc_(un); + endfor elseif _qw_=3: fin:=i fi; _qw_:=_qw_+1; @@ -2410,20 +2443,20 @@ vardef suiterecprojx@#(text t)= %projections et étiquettes sur axe x, utili $ enddef; -vardef suiterecprojy@#(text t)= %projections et étiquettes sur axe y, utilise les valeurs de suiterec +vardef suiterecprojy@#(text t)= %projections et étiquettes sur axe y, utilise les valeurs de suiterec save $,deb,fin,nom,_qw_,un,lab; picture $; string nom,lab; numeric deb,fin,_qw_,un,_prec; deb:=_suiterecdeb_;fin:=_suiterecfin_;un:=_suiterecinit_; _qw_:=1; - for i=t: %récupère les éventuelles nouvelles valeurs pour deb et fin + for i=t: %récupère les éventuelles nouvelles valeurs pour deb et fin if _qw_ =1: if string i: nom:=i else: nom:="_val";_prec:=i fi; elseif _qw_=2: - deb:=i; - for j=_suiterecdeb_ upto i-2: - un:=_suiterecfonc_(un); - endfor + deb:=i; + for j=_suiterecdeb_ upto i-2: + un:=_suiterecfonc_(un); + endfor elseif _qw_=3: fin:=i fi; _qw_:=_qw_+1; @@ -2970,10 +3003,11 @@ vardef marqueangle(text t)= fi enddef; -vardef nommeangle@#(expr A,O,B,p)= +vardef nommeangle@#(expr A,O,B,p,n)= save P,a;pair P;path a; save marque_p; string marque_p; marque_p:=""; + if n>0: draw marqueangle(A,O,B,n) fi; a:=arc_marqueangle(A,O,B,taille_marque_a); P:= point (arctime 0.5*arclength a of a) of a; if str @# = "": @@ -3139,20 +3173,29 @@ enddef; % "\ang[round-mode=places,round-pad = false,drop-zero-decimal,round-precision=" & decimal(arr) & "]{" & decimal(nb) & "}" %enddef; +numeric _tmp_puiss_dix_; vardef AffichageAngle(expr nb,arr)= - "\ang{" & decimal(arrondi(10**(arr),nb)) & "}" + _tmp_puiss_dix_:=round(10**arr); + "\ang{" & decimal(arrondi(_tmp_puiss_dix_,nb)) & "}" +% "\ang{" & decimal(arrondi(10**arr,nb)) & "}" enddef; % %%%%%%%%%%%%%%%% Segments %%%%%%%%%%%%%%% vardef Segment(suffix AA,BB)(text t)(text s)= - save ll_seg,posAA,anghh,count_tmp,chAA,chBB,chcote; + save ll_seg,posAA,anghh,count_tmp,chAA,chBB,chcote,pA,pB; numeric ll_seg,anghh,count_tmp; string chAA,chBB,chcote; + pair pA,pB; + pA:=AA;pB:=BB; count_tmp:=0; if AffCotes: - chcote:=decimal(abs(BB-AA)); + if _tr_rapp_<>1: + chcote:=decimal(_tr_rapp_*abs(BB-AA)) + else: + chcote:=decimal(abs(BB-AA)) + fi; if UnitCotes<>"": chcote:="\SI[round-pad = false,round-mode=places,round-precision=" & decimal(ArrondiCotes) & "]{" & chcote & "}{" & UnitCotes & "}" else: @@ -3173,31 +3216,44 @@ vardef Segment(suffix AA,BB)(text t)(text s)= elseif count_tmp=2: chBB:=i fi; endfor + % On modifie les noms si on est dans une transformation et on définit les points + if _ext_tr_<>"": + chAA:=aj_extr_trsf(AA,chAA); + chBB:=aj_extr_trsf(BB,chBB); + fi + % On modifie les points si on est dans une transformation + if _tr_bool_: + def _transform_fig_= enddef; + pA:=_transform_pt_(AA); + pB:=_transform_pt_(BB); + fi for i=s: chcote:=i; endfor - SegmentComplet(AA,BB)(chAA,chBB,chcote) + SegmentComplet(pA,pB)(chAA,chBB,chcote) enddef; -vardef SegmentComplet(expr AA,BB)(expr chAA,chBB,cotei) text t= +vardef SegmentComplet(expr AA,BB)(expr chAA,chBB,cotei)= %% Les extrémités étant données, trace le segment, le nom des points et la cote %% La position du nom est calculée automatiquement - save tmp,anghh,tmpana,tmpanb; + save tmp,anghh,tmpana,tmpanb,chA,chB; picture tmp; + string chA,chB; + chA:=chAA;chB:=chBB; numeric anghh,tmpana,tmpanb; anghh:=angle(BB-AA); tmpana=anghh+180 ; tmpanb=anghh ; tmp:=image(% - draw AA--BB t; - nomme[tmpana](AA,chAA) t withpen currentpen; - nomme[tmpanb](BB,chBB) t withpen currentpen; + draw AA--BB; + nomme[tmpana](AA,chA) withpen currentpen; + nomme[tmpanb](BB,chB) withpen currentpen; if xpart AA <= xpart BB: - cote(AA,BB,cotei) t + cote(AA,BB,cotei) else: - cote(BB,AA,cotei) t + cote(BB,AA,cotei) fi; ); tmp @@ -3357,25 +3413,38 @@ numeric rep_tri_la,rep_tri_lb,rep_tri_lc, boolean rep_ad_A,rep_ad_B,rep_ad_C; -def cotepolyplacee(suffix ptA,ptB)(expr chcote,sensdirect) text t= +def cotepolyplacee(suffix ptA,ptB)(expr chcote,sensdirect)= if xpart ptA<= xpart ptB: if sensdirect: - cote(ptA,ptB,chcote) t + cote(ptA,ptB,chcote) else: - cote.top(ptA,ptB,chcote) t + cote.top(ptA,ptB,chcote) fi else: if sensdirect: - cote.top(ptB,ptA,chcote) t + cote.top(ptB,ptA,chcote) else: - cote(ptB,ptA,chcote) t + cote(ptB,ptA,chcote) fi fi enddef; -vardef TriangleComplet(suffix AA,BB,CC)(expr chAA,chBB,chCC,coteAB,coteBC,coteCA,angAA,angBB,angCC) = +def nommeangleaigu(expr B,A,C,chang,sensdirect)= + if sensdirect: + nomme(B,A,C,chang,1) + else: + nomme(C,A,B,chang,1) + fi +enddef; + + +vardef TriangleComplet(expr pAA,pBB,pCC)(expr chAA,chBB,chCC,coteAB,coteBC,coteCA,angAA,angBB,angCC) = %% Trace le triangle, les noms des points, les cotes et les angles - save tmpang,tmpfig,tmpscale,sensdir; + save tmpang,tmpfig,tmpscale,sensdir,chA,chB,chC,AA,BB,CC; + pair AA,BB,CC; + AA:=pAA;BB:=pBB;CC:=pCC; + string chA,chB,chC; + chA:=chAA;chB:=chBB;chC:=chCC; numeric tmpang,tmpscale; boolean sensdir; if angle(CC rotatedaround(AA,-angle(BB-AA)) - AA)>0: @@ -3411,16 +3480,14 @@ vardef TriangleComplet(suffix AA,BB,CC)(expr chAA,chBB,chCC,coteAB,coteBC,coteCA if rep_ad_A and AutoAngleDroit: draw marqueangledroit(BB,AA,CC) withpen currentpen else: - draw marqueangle(BB,AA,CC) withpen currentpen; - nomme(BB,AA,CC,angAA); + nommeangleaigu(BB,AA,CC,angAA,sensdir); fi; fi; if rep_type_triangle=2: if rep_ad_B and AutoAngleDroit: draw marqueangledroit(CC,BB,AA) withpen currentpen else: - draw marqueangle(CC,BB,AA) withpen currentpen; - nomme(CC,BB,AA,angBB); + nommeangleaigu(CC,BB,AA,angBB,sensdir); fi; fi; else: @@ -3428,24 +3495,21 @@ vardef TriangleComplet(suffix AA,BB,CC)(expr chAA,chBB,chCC,coteAB,coteBC,coteCA if rep_ad_A and AutoAngleDroit: draw marqueangledroit(BB,AA,CC) withpen currentpen else: - draw marqueangle(BB,AA,CC); - nomme(BB,AA,CC,angAA); + nommeangleaigu(BB,AA,CC,angAA,sensdir); fi; fi if (nang>=2): if rep_ad_B and AutoAngleDroit: draw marqueangledroit(CC,BB,AA) withpen currentpen else: - draw marqueangle(CC,BB,AA) withpen currentpen; - nomme(CC,BB,AA,angBB); + nommeangleaigu(CC,BB,AA,angBB,sensdir); fi; fi if (nang=3): if rep_ad_C and AutoAngleDroit: draw marqueangledroit(AA,CC,BB) withpen currentpen else: - draw marqueangle(AA,CC,BB) withpen currentpen; - nomme(AA,CC,BB,angCC); + nommeangleaigu(AA,CC,BB,angCC,sensdir); fi; fi fi @@ -3730,9 +3794,9 @@ vardef defTriangle(text q)= rep_tri_lc:=abs(rep_tri_BB-rep_tri_AA); rep_tri_lb:=abs(rep_tri_CC-rep_tri_AA); rep_tri_la:=abs(rep_tri_BB-rep_tri_CC); - rep_tri_angA:=(angle(rep_tri_CC-rep_tri_AA) -angle(rep_tri_BB-rep_tri_AA) ) mod 360; - rep_tri_angB:=(angle(rep_tri_AA-rep_tri_BB)-angle(rep_tri_CC-rep_tri_BB)) mod 360; - rep_tri_angC:=180 - rep_tri_angB - rep_tri_angA; + rep_tri_angA:=abs(angle(rep_tri_CC-rep_tri_AA) -angle(rep_tri_BB-rep_tri_AA) ); + rep_tri_angB:=abs(angle(rep_tri_AA-rep_tri_BB)-angle(rep_tri_CC-rep_tri_BB)); + rep_tri_angC:=(180 - rep_tri_angB - rep_tri_angA); % Angles droits ? if arrondi(10**rep_int_arr,rep_tri_lc**2)=arrondi(10**rep_int_arr,(rep_tri_la)**2+(rep_tri_lb)**2): rep_ad_C:=true @@ -3797,26 +3861,21 @@ enddef; -vardef ProcessAffTriangles(text q)(text p)(text c)(text a)= +vardef ProcessAffTriangles(suffix A,B,C)(text p)(text c)(text a)= %% Gestion de l'affichage - save chAA,chBB,chCC,cha,chb,chc,changA,changB,changC,count_tmp,ch,nang; + save chAA,chBB,chCC,cha,chb,chc,changA,changB,changC,count_tmp,ch,nang,AA,BB,CC; string chAA,chBB,chCC,cha,chb,chc,changA,changB,changC,ch; chAA=chBB=chCC=cha=chb=chc=changA=changB=changC=""; + pair AA,BB,CC; + AA:=A;BB:=B;CC:=C; numeric count_tmp,nang; boolean tmpaffcotes,tmpaffangles; tmpaffcotes:=AffCotes;tmpaffangles:=AffAngles; if AffDonnees: AffCotes:=true;AffAngles:=true fi; % Noms des points passés en argument - count_tmp:=0; - forsuffixes i=q: - count_tmp:=count_tmp+1; - ch:=_chaine(i); - if count_tmp=1: chAA:= - elseif count_tmp=2: chBB:= - else: chCC:= - fi - "$" & ch & "$"; - endfor + chAA:="$" & _chaine(A) & "$"; + chBB:="$" & _chaine(B) & "$"; + chCC:="$" & _chaine(C) & "$"; % On modifie le nom des points si des valeurs sont passées dans p count_tmp:=0; for i=p: @@ -3827,8 +3886,26 @@ vardef ProcessAffTriangles(text q)(text p)(text c)(text a)= fi i; endfor + % On modifie les noms si on est dans une transformation et on définit les points + if _ext_tr_<>"": + chAA:=aj_extr_trsf(A,chAA); + chBB:=aj_extr_trsf(B,chBB); + chCC:=aj_extr_trsf(C,chCC); + fi + % On modifie les points si on est dans une transformation + if _tr_bool_: + def _transform_fig_= enddef; + AA:=_transform_pt_(A); + BB:=_transform_pt_(B); + CC:=_transform_pt_(C); + fi % Cotes données par les longueurs if AffCotes: + if _tr_rapp_<>1: + rep_tri_la:=rep_tri_la*_tr_rapp_; + rep_tri_lb:=rep_tri_lb*_tr_rapp_; + rep_tri_lc:=rep_tri_lc*_tr_rapp_; + fi; if UnitCotes<>"": cha:=AffichageCoteAvecUnite(rep_tri_la,ArrondiCotes,UnitCotes); chb:=AffichageCoteAvecUnite(rep_tri_lb,ArrondiCotes,UnitCotes); @@ -3866,11 +3943,193 @@ vardef ProcessAffTriangles(text q)(text p)(text c)(text a)= if count_tmp>0: nang:= count_tmp elseif AffAngles: nang:=3 else: nang:=0 fi; AffCotes:=tmpaffcotes;AffAngles:=tmpaffangles; % - TriangleComplet(q)(chAA,chBB,chCC,chc,cha,chb,changA,changB,changC) + TriangleComplet(AA,BB,CC)(chAA,chBB,chCC,chc,cha,chb,changA,changB,changC) +enddef; + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%% TRANSFORMATIONS %%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +string extratransf; % Chaine à ajouter aux nom des points +boolean _tr_bool_; % Indique qu'il faudra traiter la chaine précédente +extratransf:=""; + _tr_bool_:=false; + +numeric _tr_ang_rot_; % Angle à gérer pour l'affichage des points +_tr_ang_rot_:=0; +numeric _tr_rapp_; %Rapport d'agrandissement-réduction +_tr_rapp_:=1; + + +%% Translation + +vardef translationpoint(expr u)(expr A)= + A+u +enddef; + +vardef translation(expr u)(text t)= + type_tr:=1; + if path t: + t shifted u + elseif pair t: + t+u + else: + def _transform_pt_= translationpoint(u) enddef; + def _transform_fig_= shifted u enddef; + _ext_tr_:=extratransf; + _tr_bool_ := true; + t + hide(_ext_tr_:=""; _tr_bool_:=false; + def _transform_pt_= enddef; + def _transform_fig_= enddef;) + fi +enddef; + + +%% Rotation + +vardef rotationpoint(expr O,a)(expr A)= + A rotatedaround(O,a) +enddef; + +vardef rotation(expr O,a)(text t)= + type_tr:=1; + if path t: + t rotatedaround(O,a) + elseif pair t: + t rotatedaround(O,a) + else: + def _transform_pt_= rotationpoint(O,a) enddef; + def _transform_fig_= rotatedaround(_cart(O),a) enddef; + _tr_ang_rot_:=a; + _ext_tr_:=extratransf; + _tr_bool_ := true; + t _transform_fig_ + hide(_ext_tr_:="";_tr_bool_:=false; + def _transform_pt_= enddef; + def _transform_fig_= enddef; + _tr_ang_rot_:=0;) + fi +enddef; + +%% Symétrie centrale + +vardef symetriecentralepoint(expr O)(expr A)= + A rotatedaround(O,180) +enddef; + +vardef symetriecentrale(expr O)(text t)= + type_tr:=1; + if path t: + t rotatedaround(O,180) + elseif pair t: + t rotatedaround(O,180) + else: + def _transform_pt_= symetriecentralepoint(O) enddef; + def _transform_fig_= rotatedaround(_cart(O),180) enddef; + _tr_ang_rot_:=180; + _ext_tr_:=extratransf; + _tr_bool_ := true; + t _transform_fig_ + hide(_ext_tr_:="";_tr_bool_:=false; + def _transform_pt_= enddef; + def _transform_fig_= enddef; + _tr_ang_rot_:=0;) + fi +enddef; + +%% Symétrie axiale + +vardef symetrieaxialepoint(expr B,C)(expr A)= + A reflectedabout(B,C) +enddef; + +vardef symetrieaxiale(expr B,C)(text t)= + type_tr:=1; + if path t: + t reflectedabout(B,C) + elseif pair t: + t reflectedabout(B,C) + else: + def _transform_pt_= symetrieaxialepoint(O) enddef; + def _transform_fig_= reflectedabout(_cart(B),_cart(C)) enddef; +% _tr_ang_rot_:=180; + _ext_tr_:=extratransf; + _tr_bool_ := true; + t _transform_fig_ + hide(_ext_tr_:="";_tr_bool_:=false; + def _transform_pt_= enddef; + def _transform_fig_= enddef; + _tr_ang_rot_:=0;) + fi enddef; +%% Symétrie +vardef symetrie(text r)(text t)= + if long_texte(r)=1: + symetriecentrale(r)(t) + else: + symetrieaxiale(r)(t) + fi +enddef; + + + +%% Homothétie + +vardef homothetiepoint(expr O,k)(expr A)= + k[O,A] +enddef; + +vardef homothetie(expr O,k)(text t)= + type_tr:=1; + if path t: + t shifted -O scaled k shifted O + elseif pair t: + k[O,t] + else: + def _transform_pt_= homothetiepoint(O,k) enddef; + def _transform_fig_= shifted -O scaled k shifted O enddef; + _ext_tr_:=extratransf; + _tr_bool_ := true; + _tr_rapp_:=abs(k); + t _transform_fig_ + hide(_ext_tr_:=""; _tr_bool_:=false; + def _transform_pt_= enddef; + def _transform_fig_= enddef; + _tr_rapp_:=1;) + fi +enddef; + +%% Similitude + +vardef similitudepoint(expr O,k,a)(expr A)= + k[O,A] rotatedaround(O,a) +enddef; +vardef similitude(expr O,k,a)(text t)= + type_tr:=1; + if path t: + t rotatedaround(O,a) shifted -O scaled k shifted O + elseif pair t: + k[O,t] rotatedaround(O,a) + else: + def _transform_pt_= similitudepoint(O,k,a) enddef; + def _transform_fig_=rotatedaround(_cart(O),a) shifted -O scaled k shifted O enddef; + _ext_tr_:=extratransf; + _tr_bool_ := true; + _tr_rapp_:=abs(k); + t _transform_fig_ + hide(_ext_tr_:=""; _tr_bool_:=false; + def _transform_pt_= enddef; + def _transform_fig_= enddef; + _tr_rapp_:=1;) + fi +enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%% FONCTIONS USUELLES %%%%%%%%% @@ -4148,11 +4407,54 @@ vardef _chaine(suffix s)= %met les termes en indice si le 2e est un chiffre c enddef; +string _ext_tr_; % Chaine à rajouter aux étiquette lors d'une transformation +_ext_tr_:=""; + +vardef ajout_extra_trsf(expr ch)= % ajoute _ext_tr_ en dernière ou avant dernière pos + save n; + numeric n; + n:=length(ch); + if n>1: + if substring (n-1,n) of ch = "$": + substring (0,n-1) of ch & _ext_tr_ & substring (n-1,n) of ch + else: + ch & _ext_tr_ + fi + else: + ch + fi +enddef; + +vardef aj_extr_trsf(expr A,ch)= + save tmpch,tmpchi,n; + numeric n; + string tmpch,tmpchi; + n:=length(ch); + if substring (n-1,n) of ch = "$": + tmpchi:=substring (1,n-1) of ch; % Sans les $ + if (ASCII _ext_tr_ > 47) and (ASCII _ext_tr_ < 58): + tmpch:="$" & tmpchi & "_" & _ext_tr_ & "$"; + tmpchi:= tmpchi & "[]"; + scantokens("pair " & tmpchi & ";"); + tmpchi:= substring(0,n-1) of tmpchi & _ext_tr_ & "]"; + else: + tmpchi:= tmpchi & _ext_tr_; + tmpch:="$" & tmpchi & "$"; + scantokens("pair " & tmpchi & ";"); + fi + scantokens(tmpchi) := _transform_pt_(A); + else: + tmpch:=ch; + fi + tmpch +enddef; + %%%%%%%%%%%%%%% MATHS %%%%%%%%%%%%%%%%% vardef arrondi(expr p,x)= %arrondi de x au p-ième - round((x-floor(x))*p)/p+floor(x) +% round((x-floor(x))*p)/p+floor(x) + round(p*x)/p enddef; vardef arrondimil(expr x)= @@ -4635,6 +4937,65 @@ vardef tablabels(expr s)(text t) text cc= endfor enddef; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% PIXEL ART %%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +color pixart_coul[],pixart_grille_coul; +numeric pixart_ep; +pixart_ep:=0.3; +pixart_grille_coul:=background; + + +def pixcoul(text t)= + save cnt; + numeric cnt; + cnt:=0; + for i=t: + pixart_coul[cnt]:=i; + cnt := cnt +1; + endfor +enddef; + +pixcoul(white,black,red,green,blue,cyan,magenta,jaune); + +vardef contour_case_pix(expr n,m)= + save tmpne,tmpse; + pair tmpne,tmpse; + tmpne:=0.5*(pixart_ep,pixart_ep) transformed inverse _T; + tmpse:=0.5*(pixart_ep,-pixart_ep) transformed inverse _T; + (((0,0)+tmpne)--((1,0)-tmpse)--((1,1)-tmpne)--((0,1)+tmpse)--cycle) + shifted (_tab(n,m)-(0.5,0.5)) +enddef; + + +vardef pixart(text t)= + save _; + numeric _; + _:=-1; + grille_ep:=pixart_ep; + save cnt,lig,col; + numeric cnt,lig,col; + cnt:=0; + lig:=rep_tab_p;col:=1; + image(% + for i=t: + if numeric i: + if i>-1: filldraw contour_case_pix(col,lig) withcolor pixart_coul[i] fi + elseif color i: + filldraw contour_case_pix(col,lig) withcolor i + fi; + if col=rep_tab_n: + lig:=lig-1;col:=1; + else: + col:=col+1; + fi + endfor + ) +enddef; + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%% DESSINS %%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |