diff options
author | Norbert Preining <norbert@preining.info> | 2023-05-03 03:01:08 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2023-05-03 03:01:08 +0000 |
commit | faf23b00f32bf5f3a94d891369bc55db1d305074 (patch) | |
tree | e28be735ce28e34e4a278408107115788dc8db47 /graphics/metapost | |
parent | 809279687ad6a85c7a45c9a469725248da509220 (diff) |
CTAN sync 202305030301
Diffstat (limited to 'graphics/metapost')
-rw-r--r-- | graphics/metapost/contrib/macros/repere/README.md | 2 | ||||
-rw-r--r-- | graphics/metapost/contrib/macros/repere/repere-doc.pdf | bin | 988000 -> 1032694 bytes | |||
-rw-r--r-- | graphics/metapost/contrib/macros/repere/repere-doc.tex | 304 | ||||
-rw-r--r-- | graphics/metapost/contrib/macros/repere/repere.mp | 917 |
4 files changed, 933 insertions, 290 deletions
diff --git a/graphics/metapost/contrib/macros/repere/README.md b/graphics/metapost/contrib/macros/repere/README.md index f68df80743..e96a0a0292 100644 --- a/graphics/metapost/contrib/macros/repere/README.md +++ b/graphics/metapost/contrib/macros/repere/README.md @@ -1,4 +1,4 @@ -Package repere - Version 23.02 - February 9, 2023 +Package repere - Version 23.05 - May 2, 2023 --- diff --git a/graphics/metapost/contrib/macros/repere/repere-doc.pdf b/graphics/metapost/contrib/macros/repere/repere-doc.pdf Binary files differindex 255cb2cbb1..67f192c9eb 100644 --- a/graphics/metapost/contrib/macros/repere/repere-doc.pdf +++ b/graphics/metapost/contrib/macros/repere/repere-doc.pdf diff --git a/graphics/metapost/contrib/macros/repere/repere-doc.tex b/graphics/metapost/contrib/macros/repere/repere-doc.tex index 73b3d0e0ef..deddf7cef7 100644 --- a/graphics/metapost/contrib/macros/repere/repere-doc.tex +++ b/graphics/metapost/contrib/macros/repere/repere-doc.tex @@ -48,7 +48,6 @@ \usepackage{luamplib} \everymplib{verbatimtex \leavevmode etex; -% input geometriesyr16; input repere;} \mplibnumbersystem{decimal} @@ -80,7 +79,6 @@ } \makeatother -%\definecolor{CoulParam}{rgb}{0.281,0.275,0.485} \definecolor{CoulParam}{rgb}{0.4,0,0.5} \definecolor{TestC}{rgb}{0.963,0.971,0.994} @@ -525,7 +523,6 @@ Définit les valeurs minimales et maximales pour l'étiquetage. repere.larg(110,160,5cm,2000,7000,5cm); interaxes(120,3000); setaxes(120,160,3000,7000); - setgrad(120,160,3000,7000); draw axex(10,10); draw axey(1000,1000); fin; @@ -1156,8 +1153,8 @@ p=(-2,-2)..(-1,1)..(0,2)..(1,1) C_f= courbefonc(f)(-2,2.5); draw axes(1,1); drawoptions(withpen pencircle scaled 1); -draw p withcolor bleu; -draw C_f withcolor rouge; +draw p withcolor blue; +draw C_f withcolor red; intercourbes(I,C_f,p); drawoptions(withcolor black); nomme.lft(I1);nomme.rt(I2); @@ -1689,13 +1686,13 @@ vardef f(expr x)= x**2-2x enddef; Cf= courbefonc(f)(); ptantecedents(A,2,Cf); draw axes(1,1); -drawoptions(dashed evenly withcolor rouge); +drawoptions(dashed evenly withcolor red); draw Projectionx.lrt(A1,"$x_1$"); draw Projectionx(A2); draw Projectiony(A1); draw Projectiony.urt(A2,"$y$"); drawoptions(); -draw Cf withpen pencircle scaled 1 withcolor bleu; +draw Cf withpen pencircle scaled 1 withcolor blue; fin; \end{exemple} @@ -1711,12 +1708,12 @@ Cf= courbefonc(f)(); A1=(-0.5,f(-0.5));A2=(2.8,f(2.8)); A3=(0.75,f(0.75)); draw axes(1,1); -drawoptions(dashed evenly withcolor rouge); +drawoptions(dashed evenly withcolor red); draw Projectionaxes(A1,"$x$","$f(x)$"); draw Projectionaxes(A2,"$x$","$f(x)$"); draw Projectionaxes(A3,"$x$","$f(x)$"); drawoptions(); -draw Cf withpen pencircle scaled 1 withcolor bleu; +draw Cf withpen pencircle scaled 1 withcolor blue; fin; \end{exemple} @@ -1840,7 +1837,7 @@ repere(-0.5,5,1cm,-0.5,5,1cm); picture diag; draw axes(1,1); diag:=diagrammebatons((1,2),(2,4),(3,2),(4,1)); - draw diag withcolor rouge; + draw diag withcolor red; fin \end{exemple} @@ -2048,7 +2045,7 @@ Plusieurs segments peuvent être marqués simultanément. \end{rpobjet} \begin{rpobjet}{marquesegment(<A>,<B>,<n>)}{picture} -Figure formée d'une marque sur le segment $[AB]$. L'espace entre les marques est contrôlé par le paramètre \verb|sep_marque_s|. +Figure formée de \verb|n| marques sur le segment $[AB]$. L'espace entre les marques est contrôlé par le paramètre \verb|sep_marque_s|. \end{rpobjet} \begin{exemple} @@ -2172,6 +2169,26 @@ nomme(C,B,A,"$\alpha$"); fin; \end{exemple} +\begin{rplabel}{nomme.pos(<A>,<O>,<B>,<texte>,<n>)} +Même chose que précédemment avec en plus le tracé de \verb|n| arcs de cercle pour marquer l'angle. +\end{rplabel} + + +\begin{rplabel}{nomme(<A>,<O>,<B>,<texte>,<n>)} +Même chose que précédemment mais la position est calculée automatiquement en fonction de l'angle. +\end{rplabel} + +\begin{exemple} +repere(); +pair A,B,C; +A=(0,0);B=(4,0);C=(3,2.5); +draw A--B--C--cycle; +nomme.llft(A);nomme.lrt(B);nomme.top(C); +nomme[15](B,A,C,"\ang{45}",1); +nomme(C,B,A,"$\alpha$",2); +fin; +\end{exemple} + \subsection{Cotes} @@ -2630,6 +2647,149 @@ draw TriangleLAA(G,H,I)(4,60,40,10) fin; \end{exemple} +\subsection{Transformations} +Un certain nombre de transformations sont prédéfinies dans \MP{}. Elles sont ici reprises et, parfois, légèrement modifiées, notamment en ce qui concerne la syntaxe. + + +\begin{rpobjet}{translation(<vect>)(<obj>)}{pair, path ou picture} +Image de \verb|obj| par la translation de vecteur \verb|vect|. +\end{rpobjet} + + +\begin{exemple} +repere(); +pair A,B,C,C',u; +path c; +u=(1,-2); +A=(1,1);B=(2,2);C=(4,2); +nomme.ulft(B); +c=cercle(B,A);draw c; +draw translation(u)(c); +C'=translation(u)(C); +nomme.urt(C);nomme.urt(C'); +drawvecteur(B,u) withcolor red; +fin; +\end{exemple} + + +\begin{rpobjet}{rotation(<pt>,<ang>)(<obj>)}{pair, path ou picture} +Image de \verb|obj| par la rotation de centre \verb|pt| et d'angle \verb|ang|. +\end{rpobjet} + + +\begin{exemple} +repere(); +pair A,B,C,B'; +A=(2,1);B=(3,3);C=(5,2); +nomme.lrt(A);nomme.ulft(B); +nomme.urt(C); +B'=rotation(A,110)(B); +nomme.llft(B'); +draw B--A--B'; +nomme(B,A,B',"\ang{110}",1); +draw marquesegment(B,A,A,B'); +path seg; seg:=B--C; +draw seg withcolor blue; +draw rotation(A,110)(seg) withcolor blue; +fin; +\end{exemple} + +\begin{rpobjet}{symetrie(<pt>)(<obj>)}{pair, path ou picture} +Image de \verb|obj| par la symétrie de centre \verb|pt|. +\end{rpobjet} + +\begin{exemple} +repere(); + pair C,D,O; + path s,c; + C=(3,3);D=(1,4); + O=(0,2.5); + s=C--D; + c=cercle(D,1); + draw s;draw c; + nomme.bot(O) withcolor blue; + draw symetrie(O)(s); + draw symetrie(O)(c); +fin; +\end{exemple} + + +\begin{rpobjet}{symetrie(<A>,<B>)(<obj>)}{pair, path ou picture} +Image de \verb|obj| par la symétrie d'axe \verb|(AB)|. +\end{rpobjet} + + +\begin{exemple} +repere(-4,4,1cm,0,5,1cm); + pair C,D,O,I; + path s,c; + C=(3,3);D=(1,4); + O=(1,0);I=(-1,4); + s=C--D; + c=cercle(D,1); + draw s;draw c; + draw droite(O,I) withcolor blue; + draw symetrie(O,I)(s); + draw symetrie(O,I)(c); +fin; +\end{exemple} + +\begin{rpobjet}{homothetie(<pt>,<rap>)(<obj>)}{pair, path ou picture} +Image de \verb|obj| par l'homothétie de centre \verb|pt| et de rapport \verb|rap|. +\end{rpobjet} + +\begin{exemple} +repere(); + pair O,A,B,C,D; + O=(1,1); + A=(2,1);B=(3,2);C=(3,3);D=(1,3); + path p;p:= polygone(A,B,C,D); + nomme.llft(O); + draw p; + draw homothetie(O,2)(p); +fin +\end{exemple} + +\begin{rpobjet}{similitude(<pt>,<rap>,<ang>)(<obj>)}{pair, path ou picture} +Image de \verb|obj| par la similitude de centre \verb|pt|, de rapport \verb|rap| et d’angle \verb|ang|. +\end{rpobjet} + +\bigskip + +À titre expérimental, on dispose du paramètre suivant qui permet de définir les points créés par l'image d'une figure par transformation. + +\begin{rpparam} +extratransf & string & "" & Chaine qui désigne les caractères à ajouter au nom des points lors du dessin de l'image de certaines figures (notamment \verb|Triangle|, \verb|Segment|) par transformation. La valeur peut être \verb|"'", "''",...| ou un nombre. Les nouveaux points sont créés. +\end{rpparam} + +\begin{exemple}[lefthand ratio=0.55] +repere(); +extratransf:="'"; +pair A,B,C,u; +u=(1,-2); +A=(1,1);B=(2,2);C=(4,2); +draw Triangle(A,B,C)()()(); +draw translation(u)(Triangle(A,B,C)()()()); +draw B'--C withcolor blue; +drawvecteur(A,u) withcolor red; +fin; +\end{exemple} + +\begin{exemple}[lefthand ratio=0.55] +repere(); +extratransf:="1"; +pair A,B,C,D,u,O; +A=(2,1);B=(3,3);C=(5,2); +O=(0,1); +nomme.llft(O); +draw Triangle(A,B,C)()()() withcolor blue; +draw rotation(O,60)(Triangle(A,B,C)()()()) + withcolor blue; +draw B--O--B1 dashed evenly; +fin; +\end{exemple} + + \section{Dessin à main levée} L'idée de dessiner une figure comme si elle était faite à main levée vient de Christophe \bsc{Poulain} dans les macros de \verb|geometriesyr16.mp|\footnote{\url{https://melusine.eu.org/syracuse/poulecl/geometriesyr16/}} . Cette idée est reprise par Toby \bsc{Thurston} dans le document « Drawing with MetaPost »\footnote{\url{https://github.com/thruston/Drawing-with-Metapost/blob/master/Drawing-with-Metapost.pdf}}. Le principe est de modifier le tracé des chemins en changeant légèrement les angles de départ et d'arrivée pour créer une déformation qui rappelle le dessin à main levée. @@ -2905,6 +3065,22 @@ draw c1;draw c2; fin; \end{exemple} +\subsection{Couleur de fond} + +Il est possible de modifier la couleur de fond en modifiant la couleur \verb|fond_coul|. +\begin{rpparam} +fond_coul & color & white & Couleur du fond de la figure +\end{rpparam} + +\begin{exemple} +repere(-3.5,3.5,1cm,-3.5,3.5,1cm); + fond_coul:=(0.9,0.9,1); + setquad(-3,3,-3,3); + draw quadrillage(1,1); + draw axes(1,1); +fin; +\end{exemple} + \subsection{Francisation} @@ -3173,7 +3349,72 @@ tableau(5,5,0.8cm); fin; \end{exemple} +\section{Pixel art} +Il est possible d'utiliser les tableaux pour dessiner des figures en pixel art. + +\begin{rpobjet}{pixart(<liste d'entiers> ou <liste de couleurs>)}{picture} +Figure composée de carrés remplis d'une couleur qui est soit la couleur indiquée explicitement soit une couleur qui dépend de l'entier indiqué (celles-ci sont définies au départ mais peuvent être modifiées). On peut remplacer un entier par \verb|_| pour que la case ne soit pas remplie. Les pixels doivent être donnés de gauche à droite et de haut en bas. +\end{rpobjet} + + +\begin{exemple} +tableau(3,3,1cm); +draw pixart(0,1,2, + 3,4,5, + 6,7,_); +fin; +\end{exemple} + +\begin{exemple} +tableau(3,3,1cm); +fond_coul:=grisclair; +draw pixart(0,1,2, + 3,4,5, + 6,7,_); +fin; +\end{exemple} + + +\begin{exemple} +tableau(3,3,1cm); +draw pixart(blanc,noir,rouge, + vert,bleu,cyan, + magenta,jaune,_); +fin; +\end{exemple} + +\begin{rpdeclaration}{pixcoul(<liste de couleurs>)} +Macro qui permet de définir les couleurs qui seront utilisées. La première correspond à 0, la deuxième à 1... + +Au départ la macro est appelée de la façon suivante : + +\qquad \verb|pixcoul(blanc,noir,rouge,vert,bleu,cyan,magenta,jaune);| +\end{rpdeclaration} + +\begin{exemple} +tableau(3,3,1cm); +pixcoul(marron,lime,orange,rose, + pourpre,olive,violet,beige); +draw pixart(0,1,2, + 3,4,5, + 6,7,_); +fin; +\end{exemple} + + +\begin{rpparam} +pixart_ep & numeric & 0.3 & Écart laissé vide entre les cases. +\end{rpparam} + +\begin{exemple} +tableau(3,3,1cm); +pixart_ep:=2; +draw pixart(0,1,2, + 3,4,5, + 6,7,_); +fin; +\end{exemple} \section{Quelques dessins} @@ -3491,6 +3732,47 @@ tableau(13,5,1cm); fin; \end{exemple} +\subsection{Pixel art} + +\begin{exemple} +tableau(11,8,0.4cm); +pixart_ep:=0; +draw pixart(0,0,1,0,0,0,0,0,1,0,0, + 0,0,0,1,0,0,0,1,0,0,0, + 0,0,1,1,1,1,1,1,1,0,0, + 0,1,1,0,1,1,1,0,1,1,0, + 1,1,1,1,1,1,1,1,1,1,1, + 1,0,1,1,1,1,1,1,1,0,1, + 1,0,1,0,0,0,0,0,1,0,1, + 0,0,0,1,1,0,1,1,0,0,0); +fin; +\end{exemple} + +\begin{exemple} +tableau(14,15,0.3cm); +pixart_ep:=0; +color b,n,v,r,c; +b:=blanc;n:=noir;v:=0.6vert; +r:=0.7rouge;c:=(1,0.2,0.2); +draw pixart(_,_,_,_,_,_,_,_,_,_,_,n,n,_, + _,_,_,_,_,_,_,_,_,_,n,v,v,n, + _,_,_,_,_,_,_,n,n,n,n,v,v,n, + _,_,_,_,_,_,n,v,v,v,v,v,n,_, + _,_,_,_,_,n,v,n,n,n,v,n,_,_, + _,_,n,n,n,v,n,_,_,n,v,n,_,_, + _,n,c,c,v,c,n,_,n,v,n,_,_,_, + n,c,c,c,c,c,c,n,v,n,n,_,_,_, + n,c,c,c,c,c,n,c,v,c,c,n,_,_, + n,c,b,c,c,n,c,c,v,c,c,c,n,_, + n,c,c,b,r,n,c,c,c,c,c,c,n,_, + _,n,r,r,r,n,c,c,c,c,c,r,n,_, + _,_,n,n,n,n,c,c,c,b,r,r,n,_, + _,_,_,_,_,_,n,r,r,r,r,n,_,_, + _,_,_,_,_,_,_,n,n,n,n,_,_,_ + ); +fin; +\end{exemple} + \end{document} 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 %%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |