summaryrefslogtreecommitdiff
path: root/graphics/metapost
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/metapost')
-rw-r--r--graphics/metapost/contrib/macros/repere/README.md2
-rw-r--r--graphics/metapost/contrib/macros/repere/repere-doc.pdfbin969905 -> 988000 bytes
-rw-r--r--graphics/metapost/contrib/macros/repere/repere-doc.tex103
-rw-r--r--graphics/metapost/contrib/macros/repere/repere.mp776
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
index 30fd4ff86e..255cb2cbb1 100644
--- a/graphics/metapost/contrib/macros/repere/repere-doc.pdf
+++ b/graphics/metapost/contrib/macros/repere/repere-doc.pdf
Binary files differ
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;