diff options
author | Norbert Preining <norbert@preining.info> | 2023-02-10 03:01:41 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2023-02-10 03:01:41 +0000 |
commit | e10a52ebe817fe7ff0235c066d83f51f39d3e023 (patch) | |
tree | 9148206ad017e5947e391d1eb4f3858feb493648 /graphics/metapost/contrib | |
parent | ffdef3cddca5a0b9133dd928291b000452777ad8 (diff) |
CTAN sync 202302100301
Diffstat (limited to 'graphics/metapost/contrib')
-rw-r--r-- | graphics/metapost/contrib/macros/repere/README.md | 2 | ||||
-rw-r--r-- | graphics/metapost/contrib/macros/repere/repere-doc.pdf | bin | 969905 -> 988000 bytes | |||
-rw-r--r-- | graphics/metapost/contrib/macros/repere/repere-doc.tex | 103 | ||||
-rw-r--r-- | graphics/metapost/contrib/macros/repere/repere.mp | 776 |
4 files changed, 581 insertions, 300 deletions
diff --git a/graphics/metapost/contrib/macros/repere/README.md b/graphics/metapost/contrib/macros/repere/README.md index 77ee7c9891..f68df80743 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.01 - January 1, 2023 +Package repere - Version 23.02 - February 9, 2023 --- diff --git a/graphics/metapost/contrib/macros/repere/repere-doc.pdf b/graphics/metapost/contrib/macros/repere/repere-doc.pdf Binary files differindex 30fd4ff86e..255cb2cbb1 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 1dba224351..73b3d0e0ef 100644 --- a/graphics/metapost/contrib/macros/repere/repere-doc.tex +++ b/graphics/metapost/contrib/macros/repere/repere-doc.tex @@ -1116,17 +1116,16 @@ fin; \begin{rpdeclaration}{antecedents(<X>,<y>,<p>)} -Stocke dans le tableau de nombres \verb+X+ les antécédents de \verb+y+ par la fonction dont la courbe représentative est le chemin \verb+p+. Le tableau \verb+X+ doit être déclaré avant d'utiliser cette macro. +Stocke dans le tableau de nombres \verb+X+ (qu'il n'est pas nécessaire de déclarer) les antécédents de \verb+y+ par la fonction dont la courbe représentative est le chemin \verb+p+. \end{rpdeclaration} \begin{rpdeclaration}{ptantecedents(<P>,<y>,<p>)} -Stocke dans le tableau de points \verb+P+ les points du chemin \verb+p+ d'ordonnée \verb+y+. Le tableau \verb+P+ doit être déclaré avant d'utiliser cette macro. +Stocke dans le tableau de points \verb+P+ (qu'il n'est pas nécessaire de déclarer) les points du chemin \verb+p+ d'ordonnée \verb+y+. \end{rpdeclaration} \begin{exemple} repere(-2.5,4.5,1cm,-3.5,2.5,1cm); path p; -pair A[];numeric n[]; p=(-2,-2)..(-1,1)..(0,2)..(1,1) ..(2,-2)..(3,-3)..(3.5,-2.5) ..(4,-1); @@ -1144,12 +1143,12 @@ fin; \end{exemple} \begin{rpdeclaration}{intercourbes(<P>,<p>,<q>)} -Stocke dans le tableau de points \verb+P+ les points d'intersection des chemins \verb+p+ et \verb+q+. Il faut, avant d'utiliser cette macro, déclarer le tableau \verb+P+. +Stocke dans le tableau de points \verb+P+ (qu'il n'est pas nécessaire de déclarer) les points d'intersection des chemins \verb+p+ et \verb+q+. \end{rpdeclaration} \begin{exemple} repere(-2.5,3,1cm,-2.5,2.5,1cm); -path p,C_f; pair I[]; +path p,C_f; vardef f(expr x)= x**2-2x enddef; p=(-2,-2)..(-1,1)..(0,2)..(1,1) ..(2,-2)..(3,-3)..(3.5,-2.5) @@ -2040,6 +2039,10 @@ Certaines des macros suivantes sont inspirées des macros de \verb|geometriesyr1 Figure formée d'une marque sur le segment $[AB]$. Des paramètres permettent de contrôler la forme et la taille de la marque. \end{rpobjet} +\begin{rpobjet}{marquesegment(<p>)}{picture} +Figure formée d'une marque sur le chemin \verb|p|. Des paramètres permettent de contrôler la forme et la taille de la marque. +\end{rpobjet} + \begin{rpobjet}{marquesegment(<A>,<B>,<C>,<D>...)}{picture} Plusieurs segments peuvent être marqués simultanément. \end{rpobjet} @@ -2075,10 +2078,12 @@ sep_marque_s & numeric & 2 & Écart entre les marques dans le cas où il y en a \begin{exemple}[lefthand ratio=0.6] repere(); pair A[],B[]; -for i=1 upto 5: +path p; +for i=1 upto 6: A[i]:=(0,-i);B[i]:=(3,-i); draw A[i]--B[i]; nomme.lft(A[i]);nomme.rt(B[i]); endfor +p:=A[6]..(1,-6.5)..B[6]; draw marquesegment(A[1],B[1],"o"); draw marquesegment(A[2],B[2],"ss"); draw marquesegment(A[3],B[3],"/",3); @@ -2086,6 +2091,10 @@ sep_marque_s:=6; draw marquesegment(A[4],B[4],"xxx"); angle_marque_s:=90;echelle_marque_s:=2; draw marquesegment(A[5],B[5],"/"); +sep_marque_s:=2; +angle_marque_s:=60;echelle_marque_s:=1; +draw p; +draw marquesegment(p,"/"); fin; \end{exemple} @@ -2621,6 +2630,88 @@ draw TriangleLAA(G,H,I)(4,60,40,10) 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. + +C. \bsc{Poulain} ajoute un angle de \ang{5}. Dans son document, T. \bsc{Thurston} reprend l'idée et ajoute une composante aléatoire. + +Dans la version proposée ici, la valeur par défaut est aléatoire mais peut être modifiée. + +\medskip +\begin{rpdeclaration}{drawmainlevee} +Dessine une figure en représentant les chemins comme s'ils étaient dessinés à main levée +\end{rpdeclaration} + +\begin{exemple}[lefthand ratio=0.6] +repere(-0.5,5,1cm,-0.5,5,1cm); +pair A,B,C,D; +A=(0.5,0.5);B=(4,1);C=(3,4); +drawmainlevee axes(1,1); +drawmainlevee Triangle(A,B,C)()()() withcolor red; +drawmainlevee cercle(A,B,C) withcolor blue; +fin; +\end{exemple} + +\begin{rpparam} +type_trace & string & "" & Paramètre qui peut prendre la valeur \verb|"mainlevee"| pour indiquer que tous les dessins qui suivent seront faits « à main levée ». Toute autre valeur donne un dessin normal. +\end{rpparam} + +\begin{exemple} +repere(-0.5,5,1cm,-0.5,5,1cm); +pair A,B,C,D; +A=(0.5,0.5);B=(4,1);C=(3,4); +draw axes(1,1); +type_trace:="mainlevee"; +draw Triangle(A,B,C)()()() withcolor red; +draw cercle(A,B,C) withcolor blue; +fin; +\end{exemple} + +\begin{rpobjet}{mainlevee(<objet>)}{path ou picture} +Transforme le chemin ou la figure en un objet de même nature « dessiné à main levée ». +\end{rpobjet} + + +\begin{exemple} +repere(-0.5,5,1cm,-0.5,5,1cm); +pair A,B,C,D; +A=(0.5,0.5);B=(4,1);C=(3,4); +draw axes(1,1); +picture tri; +path cer; +tri:=mainlevee(Triangle(A,B,C)()()()); +cer:=mainlevee(cercle(A,B,C)); +draw tri withcolor red; +draw cer withcolor blue; +fin; +\end{exemple} + +\begin{rpdeclaration}{anglemainlevee(<nombre>)} +Fonction qui permet de définir comment seront dessinés les figures à main levée : le \verb|nombre| sera ajouté à l'angle de départ et à l'angle d'arrivée des chemins pour créer une déformation. \verb|nombre| peut contenir un calcul avec les fonctions \verb|normaldeviate| et \verb|uniformdeviate()|. + +Au chargement de \verb|repere|, la fonction est appelée de la façon suivante : + + \verb|anglemainlevee(5*signe(normaldeviate)+normaldeviate);| +\end{rpdeclaration} + +\begin{exemple} +repere(-0.5,5,1cm,-0.5,5,1cm); +pair A[],B[]; +draw axes(1,1); +for i=1 upto 4: + A[i]:=(1,i);B[i]:=(4,i); + nomme.lft(A[i]);nomme.rt(B[i]); +endfor +draw A[1]--B[1]; +drawmainlevee A[2]--B[2]; +anglemainlevee(10); +drawmainlevee A[3]--B[3]; +anglemainlevee(uniformdeviate 20 + 10); +drawmainlevee A[4]--B[4]; +fin; +\end{exemple} + + \section{Divers} \subsection{Compilation avec \texttt{mpost}} diff --git a/graphics/metapost/contrib/macros/repere/repere.mp b/graphics/metapost/contrib/macros/repere/repere.mp index 534d6f63b7..c3f5a1496a 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.01 (Janvier 2023) %% +%% Version 23.02 (Février 2023) %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % This work may be distributed and/or modified under the conditions of @@ -20,6 +20,7 @@ % angle_cote % segments, vecteurs, polygones complets % Octobre-Décembre 2022 : doc +% Février 2023 : Main levée input format; if not known mplib: input latexmp fi; @@ -139,7 +140,7 @@ vardef definitionrepere@#(text t) = Ux:=_def3;Uy:=_def6; _T:=identity xscaled Ux yscaled Uy slanted cosd(theta) yscaled sind(theta); _defcadre; - settout(Xmin,Xmax,Ymin,Ymax); + setrepere(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); @@ -157,7 +158,7 @@ enddef; %%%% Initialisations tracés (redéfinition draw etc.) def init_traces = %% draw - def draw expr p = + def ddraw expr p = addto currentpicture if picture p: also p @@ -166,6 +167,13 @@ def init_traces = fi _op_ enddef; + def draw expr p= + if (path p) and (type_trace="mainlevee"): + ddraw mainleveepath(p) + else: + ddraw p + fi + enddef; %% fill def fill expr c = if path c: @@ -201,8 +209,22 @@ def init_traces = 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; + def ddrawarrow expr p = _apth:=p transformed _T; _finarr enddef; + def drawarrow expr p= + if type_trace="mainlevee": + ddrawarrow mainleveepath(p) + else: + ddrawarrow p + fi + enddef; + def ddrawdblarrow expr p = _apth:=p transformed _T; _findarr enddef; + def drawdblarrow expr p= + if type_trace="mainlevee": + ddrawdblarrow mainleveepath(p) + else: + ddrawdblarrow p + fi + enddef; %% bbox vardef bbox primary p = if picture p: oldbbox p transformed inverse _T @@ -261,12 +283,80 @@ vardef arrowhead expr p = %redéfinition flèches (q rotated .5ahangle & reverse q rotated -.5ahangle -- 0.5*(point 0 of q)-- cycle) shifted e enddef; +%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%% Main levée %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%% + +vardef signe(expr n)= + if n=0: + 0 + elseif n>0: + 1 + else: + -1 + fi +enddef; + + +% D'après Toby Thurston : https://raw.githubusercontent.com/thruston/Drawing-with-Metapost/master/Drawing-with-Metapost.pdf +%%%%%%%%%%%%%%%%%%%%%%%%%% + +string type_trace; +type_trace:=""; + +def anglemainlevee(text t) = + def _anglemainlevee_ = t enddef +enddef; + +anglemainlevee(5*signe(normaldeviate)+normaldeviate); + + +%% Chemin de longueur 1, on rajoute l'angle aux extrémités +def mainleveeseg(expr p) = + point 0 of p {(direction 0 of p) rotated (_anglemainlevee_)} .. + point 1 of p {(direction 1 of p) rotated (_anglemainlevee_)} +enddef; + +%% Chemin de longueur quelconque, on divise en chemins simples +def mainleveepath(expr p) = + mainleveeseg(subpath(0,1) of p) + for i=1 upto length(p)-1: + & mainleveeseg(subpath(i,i+1) of p) + endfor + if cycle p: & cycle fi +enddef; +string _tmp_type_trace_; +_tmp_type_trace_:=""; + +def drawmainlevee text t= + _tmp_type_trace_:=type_trace; + type_trace:="mainlevee"; + draw t; + type_trace:=_tmp_type_trace_; +enddef; + +def mainlevee(text t)= + if path t: + mainleveepath(t) + else: + image(drawmainlevee t) + fi +enddef; + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + def setaxes(expr a,b,c,d)= - AxeXmin:=a;AxeXmax:=b;AxeYmin:=c;AxeYmax:=d + AxeXmin:=a;AxeXmax:=b;AxeYmin:=c;AxeYmax:=d; + setgrad(a,b,c,d); + setval(a,b,c,d); enddef; def setgrad(expr a,b,c,d)= - GradXmin:=a;GradXmax:=b;GradYmin:=c;GradYmax:=d + GradXmin:=a;GradXmax:=b;GradYmin:=c;GradYmax:=d; + setval(a,b,c,d); enddef; def setval(expr a,b,c,d)= @@ -331,32 +421,48 @@ pair _posgrady, _posgrady.lft, _posgrady.rt, _posgrady.ulft, _posgrady.top, _pos _posgrady=_posgrady.bot=_posgrady.lft=_posgrady.top=-_posgrady.rt=(-1,0); -_posgrady.llft=_posgrady.urt=(0.5,0.5);_posgrady.lrt=-_posgrady.ulft=(0.5,-0.5); +path _dessin_axe_x_,_dessin_axe_y_; + vardef _etiqx_@#(expr ab,dec,st)= %étiquettes axe des abscisses - save pic; + save pic,tmppos; picture pic; + pair tmppos; + tmppos = _dessin_axe_x_ intersectionpoint droite(ab); if numeric st: pic:=LaTeX("$\num{" & decimal(st) & extranumx & "}$") elseif string st: pic:=LaTeX(st) else: pic:=st fi; - theoldlabel.@#(pic,_cart(ab,yO) shifted (dec*_posgradx@#)) +% theoldlabel.@#(pic,_cart(ab,yO) shifted (dec*_posgradx@#)) + theoldlabel.@#(pic,_cart(tmppos) shifted (dec*_posgradx@#)) enddef; vardef _etiqy_@#(expr ro,dec,st)= %étiquettes axe des ordonnées - save pic; + save pic,tmppos; picture pic; + pair tmppos; + tmppos = _dessin_axe_y_ intersectionpoint droite(0,ro); if numeric st: pic:=LaTeX("$\num{" & decimal(st) & extranumy & "}$") elseif string st: pic:=LaTeX(st) else: pic:=st fi; - theoldlabel.@#(pic,_cart(xO,ro) shifted (dec*_posgrady@#)) +% theoldlabel.@#(pic,_cart(xO,ro) shifted (dec*_posgrady@#)) + theoldlabel.@#(pic,_cart(tmppos) shifted (dec*_posgrady@#)) enddef; vardef graduationx(expr x)= %%%%%%% graduation axe des abscisses - ((0,taillegrad)--(0,-taillegrad)) rotated (theta-90) shifted _cart(x,yO) + save tmppos; + pair tmppos; + tmppos = _dessin_axe_x_ intersectionpoint droite(x); +% ((0,taillegrad)--(0,-taillegrad)) rotated (theta-90) shifted _cart(x,yO) + ((0,taillegrad)--(0,-taillegrad)) rotated (theta-90) shifted _cart(tmppos) enddef; vardef graduationy(expr y)= %%%%%%% graduation axe des ordonnées - ((taillegrad,0)--(-taillegrad,0)) shifted _cart(xO,y) + save tmppos; + pair tmppos; + tmppos = _dessin_axe_y_ intersectionpoint droite(0,y); +% ((taillegrad,0)--(-taillegrad,0)) shifted _cart(xO,y) + ((taillegrad,0)--(-taillegrad,0)) shifted _cart(tmppos) enddef; vardef etiquettex@#(expr x)= @@ -369,9 +475,25 @@ vardef etiquettey@#(expr y)= enddef; -vardef dessinaxex=_cart(AxeXmin,yO)--_cart(AxeXmax,yO) enddef; +%vardef cheminaxex=_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)-- + if (AxeXmin<xO) and (xO<AxeXmax): + (xO,yO)-- + fi + (AxeXmax,yO) +enddef; + +vardef cheminaxey= + (xO,AxeYmin)-- + if (AxeYmin<yO) and (yO<AxeYmax): + (xO,yO)-- + fi + (xO,AxeYmax) +enddef; vardef graduationsaxex(expr grad)= %%%% ensemble des graduations abscisses @@ -404,27 +526,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; @@ -434,27 +556,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; @@ -462,42 +584,48 @@ enddef; vardef _axex_@#(expr grad,val,nn)= save $; picture $; + _dessin_axe_x_:= + if type_trace="mainlevee": + mainlevee(cheminaxex) + else: + cheminaxex + fi; $=image( % axe - if flecheaxe: olddrawarrow else: olddraw fi dessinaxex; + if flecheaxe: ddrawarrow else: ddraw fi _dessin_axe_x_; % graduations 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 ); $ @@ -506,42 +634,48 @@ enddef; vardef _axey_@#(expr grad,val,nn)= save $; picture $; + _dessin_axe_y_:= + if type_trace="mainlevee": + mainlevee(cheminaxey) + else: + cheminaxey + fi; $=image( % axe - if flecheaxe: olddrawarrow else: olddraw fi dessinaxey; + if flecheaxe: ddrawarrow else: ddraw fi _dessin_axe_y_; % graduations 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 ); $ @@ -625,15 +759,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:="-" @@ -666,27 +800,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; @@ -697,27 +831,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; @@ -727,39 +861,45 @@ vardef _axexpi_@#(expr num,den,nn)= numeric grad; picture $; grad:=num*pi/den; + _dessin_axe_x_:= + if type_trace="mainlevee": + mainlevee(cheminaxex) + else: + cheminaxex + fi; $=image( % axe - if flecheaxe: olddrawarrow else: olddraw fi dessinaxex; + if flecheaxe: ddrawarrow else: ddraw fi _dessin_axe_x_; % graduations if grad>0: draw graduationsaxex(grad) fi; % é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 ); @@ -771,40 +911,46 @@ vardef _axeypi_@#(expr num,den,nn)= numeric grad; picture $; grad:=num*pi/den; + _dessin_axe_y_:= + if type_trace="mainlevee": + mainlevee(cheminaxey) + else: + cheminaxey + fi; $=image( % axe - if flecheaxe: olddrawarrow else: olddraw fi dessinaxey; + if flecheaxe: ddrawarrow else: ddraw fi _dessin_axe_y_; % graduations if grad>0: draw graduationsaxey(grad) fi; % é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 ); @@ -886,19 +1032,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; @@ -910,20 +1056,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; @@ -1009,12 +1155,13 @@ def marquepoint(expr pp)= % compatibilité geometriesyr15 draw marquepointFig(pp) enddef; +let MarquePoint = marquepoint; def marquepoints(text t) text q = %geometriesyr15 - for p_ = t: show p_; if pair p_: marquepoint(p_) q; fi endfor; + for p_ = t: if pair p_: marquepoint(p_) q; fi endfor; enddef; -let MarquePoint = marquepoint; +let pointe = marquepoints; % Juin 2019 : placement fin des étiquettes (angle donné) vardef thelabelang@#(expr s,z)= @@ -1596,6 +1743,7 @@ vardef intercourbes(suffix P)(expr p,q)= %renvoie les points d'intersections de save i,pp; numeric i; path pp; + if unknown P: pair P[] fi; pp:=p; i:=1; forever: @@ -1629,6 +1777,7 @@ enddef; vardef antecedents(suffix P)(expr y,p)= pair PP[]; + numeric P[]; ptantecedents(PP,y,p); for i=1 upto 10: P[i]:=xpart (PP[i]); endfor enddef; @@ -1919,9 +2068,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+ ) @@ -1993,22 +2142,34 @@ enddef; %%%%%%%%%% DROITES %%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% vardef droiteeqred(expr a,b)= - save $; - path $; - if (-(Ymax-Ymin)/(Xmax-Xmin)<a) and ((Ymax-Ymin)/(Xmax-Xmin)>a): - $:=(XmiN,a*XmiN+b)--(XmaX,a*XmaX+b); + save Pdr; + pair Pdr[]; + if ((Ymin<a*Xmin+b) and (a*Xmin+b<Ymax)) or (a=0): + Pdr[1]:=(Xmin,a*Xmin+b) elseif a>0: - $:=(YmiN/a-b/a,YmiN)--(YmaX/a-b/a,YmaX); + Pdr[1]:=((Ymin-b)/a,Ymin) else: - $:=(YmaX/a-b/a,YmaX)--(YmiN/a-b/a,YmiN); + Pdr[1]:=((Ymax-b)/a,Ymax) fi; - $ + if ((Ymin<a*Xmax+b) and (a*Xmax+b<Ymax)) or (a=0): + Pdr[2]:=(Xmax,a*Xmax+b) + elseif a>0: + Pdr[2]:=((Ymax-b)/a,Ymax) + else: + Pdr[2]:=((Ymin-b)/a,Ymin) + fi; + Pdr[1]-- + if (Xmin<0) and (0<Xmax) and (Ymin<b) and (b<Ymax): (0,b)-- fi + Pdr[2] enddef; vardef droiteeqx(expr c)= - (c,2*Ymin-Ymax)--(c,2*Ymax-Ymin) + (c,Ymax)-- + if (Ymin<c) and (c<Ymax): (c,0)-- fi + (c,Ymin) enddef; + vardef droiteeqcart(expr a,b,c)= save $; path $; @@ -2030,8 +2191,8 @@ vardef droiteeq(text t)= enddef; -vardef droitept(expr A,B)= %geometrie15syr - (_diag/abs(A-B))[B,A]--(_diag/abs(A-B))[A,B] +vardef droitept(expr A,B)= + (_diag/abs(A-B))[B,A]--A--B--(_diag/abs(A-B))[A,B] enddef; vardef droite(text t)= @@ -2185,7 +2346,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; @@ -2198,20 +2359,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; @@ -2249,20 +2410,20 @@ vardef suiterecprojx@#(text t)= %projections et étiquettes sur axe x, utilis $ 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; @@ -2694,11 +2855,9 @@ vardef polygone(text t)= poly enddef; -if not known typetrace: - vardef triangle(expr A,B,C)= +vardef triangle(expr A,B,C)= polygone(A,B,C) - enddef; -fi +enddef; vardef parallelogramme(expr A,O,B)= O--A--(A+B-O)--B--cycle @@ -2859,6 +3018,9 @@ vardef marqueuniquerond_s(expr A,B)= fullcircle scaled (0.5taille_marque_s*echelle_marque_s) enddef; +%% +%% Figure de forme f, orientée en fonction de A--B +%% vardef marqueunique_s(expr A,B,f)= if f="o": marqueuniquerond_s(A,B) @@ -2872,6 +3034,23 @@ vardef marqueunique_s(expr A,B,f)= enddef; +vardef marquepathpos(expr p,n,f,t)= + save $,AA,BB; + pair AA,BB; + AA:= point 0 of p; + BB:= point (length p) of p; + picture $; + $=image( + for i=1 upto n: + draw marqueunique_s(AA,BB,f) shifted ((i-1-(n-1)/2)*sep_marque_s*unitvector(_cart(BB)-_cart(AA))) transformed inverse _T; + endfor + ); + $ shifted ((point (arctime t*(arclength p) of p) of p) transformed _T) +enddef; + +%% +%% n figures de forme f orientée en fonction de A--B et placées autour du milieu +%% vardef marqueseg(expr A,B,n,f)= save $; picture $; @@ -2883,31 +3062,42 @@ vardef marqueseg(expr A,B,n,f)= $ shifted milieu(_cart(A),_cart(B)) enddef; +%% +%% Macro utilisateur t=A,B,n,f ou t=A,B,f ou t=A,B,n +%% vardef marquesegment(text t)= - save n,N,Pti,Ptii,tmpfig,tmpforme; + save n,N,Pti,Ptii,tmpfig,tmpforme,boolpath,tmppath; numeric n,N; picture tmpfig; string tmpforme; pair Pti,Ptii; + path tmppath; + boolean boolpath; + boolpath:=false; tmpforme:=substring (0,1) of forme_marque_s; N:=0; n:=1; for i=t: if numeric i: n:=i elseif string i: tmpforme:=substring (0,1) of i;n:=length i + elseif path i: boolpath:=true;tmppath:=i fi; endfor - tmpfig:=image(% - for i=t: - N:=N+1; - if ((N mod 2) = 1) and (pair i): - Pti := i; - elseif pair i: - Ptii := i; - draw marqueseg(Pti,Ptii,n,tmpforme); - fi; - endfor - ); + if boolpath: + tmpfig:= marquepathpos(tmppath,n,tmpforme,0.5) + else: + tmpfig:=image(% + for i=t: + N:=N+1; + if ((N mod 2) = 1) and (pair i): + Pti := i; + elseif pair i: + Ptii := i; + draw marqueseg(Pti,Ptii,n,tmpforme); + fi; + endfor + ) + fi; tmpfig enddef; @@ -3183,7 +3373,7 @@ def cotepolyplacee(suffix ptA,ptB)(expr chcote,sensdirect) text t= fi enddef; -vardef TriangleComplet(suffix AA,BB,CC)(expr chAA,chBB,chCC,coteAB,coteBC,coteCA,angAA,angBB,angCC) text t = +vardef TriangleComplet(suffix AA,BB,CC)(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; numeric tmpang,tmpscale; @@ -3196,66 +3386,66 @@ vardef TriangleComplet(suffix AA,BB,CC)(expr chAA,chBB,chCC,coteAB,coteBC,coteCA tmpscale:=defaultscale; picture tmpfig; tmpfig:=image(% - draw triangle (AA,BB,CC) t; + draw triangle (AA,BB,CC); if AffPoints: tmpang:=angle(0.5BB+0.5CC-AA)+180; - nomme[tmpang](AA,chAA) t withpen currentpen; + nomme[tmpang](AA,chAA) withpen currentpen; tmpang:=angle(0.5AA+0.5CC-BB)+180; - nomme[tmpang](BB,chBB) t withpen currentpen; + nomme[tmpang](BB,chBB) withpen currentpen; tmpang:=angle(0.5BB+0.5AA-CC)+180; - nomme[tmpang](CC,chCC) t withpen currentpen; + nomme[tmpang](CC,chCC) withpen currentpen; fi if AffDonnees: - cote(AA,BB,coteAB) t; - if rep_type_triangle=0: cote(BB,CC,coteBC) t fi; - if rep_type_triangle<=1: cote(CC,AA,coteCA) t fi; + cote(AA,BB,coteAB); + if rep_type_triangle=0: cote(BB,CC,coteBC) fi; + if rep_type_triangle<=1: cote(CC,AA,coteCA) fi; % elseif AffCotes: else: - cotepolyplacee(AA,BB)(coteAB,sensdir) t; - cotepolyplacee(BB,CC)(coteBC,sensdir) t; - cotepolyplacee(CC,AA)(coteCA,sensdir) t; + cotepolyplacee(AA,BB)(coteAB,sensdir); + cotepolyplacee(BB,CC)(coteBC,sensdir); + cotepolyplacee(CC,AA)(coteCA,sensdir); fi defaultscale:=EchelleAngles; if AffDonnees and (rep_type_triangle<3): if rep_type_triangle>=1: if rep_ad_A and AutoAngleDroit: - draw marqueangledroit(BB,AA,CC) t withpen currentpen + draw marqueangledroit(BB,AA,CC) withpen currentpen else: - draw marqueangle(BB,AA,CC,1) t withpen currentpen; - nomme(BB,AA,CC,angAA) t; + draw marqueangle(BB,AA,CC) withpen currentpen; + nomme(BB,AA,CC,angAA); fi; fi; if rep_type_triangle=2: if rep_ad_B and AutoAngleDroit: - draw marqueangledroit(CC,BB,AA) t withpen currentpen + draw marqueangledroit(CC,BB,AA) withpen currentpen else: - draw marqueangle(CC,BB,AA,1) t withpen currentpen; - nomme(CC,BB,AA,angBB) t; + draw marqueangle(CC,BB,AA) withpen currentpen; + nomme(CC,BB,AA,angBB); fi; fi; else: if (nang>=1): if rep_ad_A and AutoAngleDroit: - draw marqueangledroit(BB,AA,CC) t withpen currentpen + draw marqueangledroit(BB,AA,CC) withpen currentpen else: - draw marqueangle(BB,AA,CC,1) t withpen currentpen; - nomme(BB,AA,CC,angAA) t; + draw marqueangle(BB,AA,CC); + nomme(BB,AA,CC,angAA); fi; fi if (nang>=2): if rep_ad_B and AutoAngleDroit: - draw marqueangledroit(CC,BB,AA) t withpen currentpen + draw marqueangledroit(CC,BB,AA) withpen currentpen else: - draw marqueangle(CC,BB,AA,1) t withpen currentpen; - nomme(CC,BB,AA,angBB) t; + draw marqueangle(CC,BB,AA) withpen currentpen; + nomme(CC,BB,AA,angBB); fi; fi if (nang=3): if rep_ad_C and AutoAngleDroit: - draw marqueangledroit(AA,CC,BB) t withpen currentpen + draw marqueangledroit(AA,CC,BB) withpen currentpen else: - draw marqueangle(AA,CC,BB,1) t withpen currentpen; - nomme(AA,CC,BB,angCC) t; + draw marqueangle(AA,CC,BB) withpen currentpen; + nomme(AA,CC,BB,angCC); fi; fi fi @@ -3556,11 +3746,11 @@ vardef defTriangle(text q)= rep_tri_la:=arrondi(10**ArrondiCotes,rep_tri_la); enddef; -vardef TriangleLLA(text q)(text s)(text p)(text c)(text a) text r= +vardef TriangleLLA(text q)(text s)(text p)(text c)(text a)= %% Macro utilisateur, definit le triangle et appelle la macro de tracé defTriangleLLA(q)(s); rep_type_triangle:=1; - ProcessAffTriangles(q)(p)(c)(a) r + ProcessAffTriangles(q)(p)(c)(a) enddef; vardef triangleLLA(suffix AA,BB,CC)(text s)= @@ -3570,11 +3760,11 @@ vardef triangleLLA(suffix AA,BB,CC)(text s)= triangle(AA,BB,CC) enddef; -vardef TriangleLAA(text q)(text s)(text p)(text c)(text a) text r= +vardef TriangleLAA(text q)(text s)(text p)(text c)(text a)= %% Macro utilisateur, definit le triangle et appelle la macro de tracé defTriangleLAA(q)(s); rep_type_triangle:=2; - ProcessAffTriangles(q)(p)(c)(a) r + ProcessAffTriangles(q)(p)(c)(a) enddef; vardef triangleLAA(suffix AA,BB,CC)(text s)= @@ -3584,11 +3774,11 @@ vardef triangleLAA(suffix AA,BB,CC)(text s)= triangle(AA,BB,CC) enddef; -vardef TriangleLLL(text q)(text s)(text p)(text c)(text a) text r= +vardef TriangleLLL(text q)(text s)(text p)(text c)(text a)= %% Macro utilisateur, definit le triangle et appelle la macro de tracé defTriangleLLL(q)(s); rep_type_triangle:=0; - ProcessAffTriangles(q)(p)(c)(a) r + ProcessAffTriangles(q)(p)(c)(a) enddef; vardef triangleLLL(suffix AA,BB,CC)(text s)= @@ -3599,15 +3789,15 @@ vardef triangleLLL(suffix AA,BB,CC)(text s)= enddef; -vardef Triangle(text q)(text p)(text c)(text a) text r= +vardef Triangle(text q)(text p)(text c)(text a)= defTriangle(q); rep_type_triangle:=3; - ProcessAffTriangles(q)(p)(c)(a) r + ProcessAffTriangles(q)(p)(c)(a) enddef; -vardef ProcessAffTriangles(text q)(text p)(text c)(text a) text r= +vardef ProcessAffTriangles(text q)(text p)(text c)(text a)= %% Gestion de l'affichage save chAA,chBB,chCC,cha,chb,chc,changA,changB,changC,count_tmp,ch,nang; string chAA,chBB,chCC,cha,chb,chc,changA,changB,changC,ch; @@ -3676,7 +3866,7 @@ vardef ProcessAffTriangles(text q)(text p)(text c)(text a) text r= 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) r + TriangleComplet(q)(chAA,chBB,chCC,chc,cha,chb,changA,changB,changC) enddef; |