diff options
Diffstat (limited to 'Master/texmf-dist')
-rw-r--r-- | Master/texmf-dist/doc/metapost/repere/README | 12 | ||||
-rw-r--r-- | Master/texmf-dist/doc/metapost/repere/README.md | 11 | ||||
-rw-r--r-- | Master/texmf-dist/doc/metapost/repere/repere-doc.pdf | bin | 621123 -> 653215 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/metapost/repere/repere-doc.tex | 526 | ||||
-rw-r--r-- | Master/texmf-dist/metapost/repere/repere.mp | 793 |
5 files changed, 965 insertions, 377 deletions
diff --git a/Master/texmf-dist/doc/metapost/repere/README b/Master/texmf-dist/doc/metapost/repere/README deleted file mode 100644 index b4fe5d2ceb0..00000000000 --- a/Master/texmf-dist/doc/metapost/repere/README +++ /dev/null @@ -1,12 +0,0 @@ -repere.mp - -This package provides MetaPost macros for drawing in a coordinate system : -- axis, grids -- points, vectors -- functions (curves, tangents, integrals, sequences) -- statistic diagrams - -The doc is in french, sorry for that - -License LPPL - diff --git a/Master/texmf-dist/doc/metapost/repere/README.md b/Master/texmf-dist/doc/metapost/repere/README.md new file mode 100644 index 00000000000..abb5bde1d9f --- /dev/null +++ b/Master/texmf-dist/doc/metapost/repere/README.md @@ -0,0 +1,11 @@ +This package provides MetaPost macros for drawing secondary school mathematics figures in a coordinate system : +- axis, grids +- points, vectors +- functions (curves, tangents, integrals, sequences) +- statistic diagrams +- plane geometry (polygons, circles) + +The doc is in french... + +License LPPL + diff --git a/Master/texmf-dist/doc/metapost/repere/repere-doc.pdf b/Master/texmf-dist/doc/metapost/repere/repere-doc.pdf Binary files differindex 4ebe22e1ee5..ae6f4c21c21 100644 --- a/Master/texmf-dist/doc/metapost/repere/repere-doc.pdf +++ b/Master/texmf-dist/doc/metapost/repere/repere-doc.pdf diff --git a/Master/texmf-dist/doc/metapost/repere/repere-doc.tex b/Master/texmf-dist/doc/metapost/repere/repere-doc.tex index b51602fd4f9..840b870c565 100644 --- a/Master/texmf-dist/doc/metapost/repere/repere-doc.tex +++ b/Master/texmf-dist/doc/metapost/repere/repere-doc.tex @@ -1,5 +1,8 @@ \documentclass[11pt,a4paper,french]{article} -% to compile this doc (needs geometriesyr16.mp http://melusine.eu.org/syracuse/poulecl/macros/): +% Needs geometriesyr16.mp +%http://melusine.eu.org/syracuse/poulecl/geometriesyr16/distrib/geometriesyr16-050408.tgz + +% To compile: % (pdf)latex repere-doc.tex % mpost repere-doc.mp % mpost repere-doc.mp @@ -11,9 +14,12 @@ \usepackage[T1]{fontenc} \usepackage{lmodern} \usepackage{textcomp} + \usepackage{mathtools} \usepackage{geometry} \geometry{twoside,hmargin=2cm,vmargin={1.5cm,1.8cm},includefoot} + + \usepackage[bottom]{footmisc} \usepackage{mflogo} @@ -51,7 +57,8 @@ \lstset{columns=flexible,% language=MetaPost,% showstringspaces=false,% - basicstyle=\ttfamily} + basicstyle=\ttfamily, + literate={é}{{\'e}}1} \usepackage{babel} @@ -219,7 +226,7 @@ \title{Documentation de \texttt{repere.mp}} \date{\today} \author{Olivier \textsc{Péault}% -\footnote{E-mail : \href{mailto:o.peault@gmail.com}{\texttt{o.peault@gmail.com}}}} +\footnote{E-mail : \href{mailto:o.peault@openmailbox.org}{\texttt{o.peault@openmailbox.org}}}} \maketitle \setcounter{tocdepth}{2} @@ -233,7 +240,6 @@ \begin{codecache} input geometriesyr16; -input latexmp; input repere; \end{codecache} @@ -241,12 +247,12 @@ input repere; \section{Utilisation du fichier} Les macros du fichier \verb+repere.mp+ ont pour but de simplifier la création de figures dans un repère du plan avec \MP{}. L'idée de départ est de coller le plus possibles aux besoins de l'enseignement secondaire de mathématiques. -Il est possible d'utiliser \verb+repere+ et \verb+geometriesyr+ (les macros de Christophe \textsc{Poulain} pour la géométrie disponibles à l'adresse \url{http://melusine.eu.org/syracuse/poulecl/macros/}) dans une même figure comme le montrent les exemples page \pageref{exgeom}. +Il est possible d'utiliser \verb+repere+ et \verb+geometriesyr+ (les macros de Christophe \textsc{Poulain} pour la géométrie disponibles à l'adresse \url{http://melusine.eu.org/syracuse/poulecl/macros/}) dans une même figure comme le montre l'exemple page \pageref{exgeom}. -Le fichier \verb+repere.mp+ doit être placé dans un répertoire accessible à \MP{} (Par ex. le répertoire \verb+metapost+ du \verb+texmf+ local). De plus, la ligne \verb+input repere;+ doit apparaître dans le document contenant les figures. +Le fichier \verb+repere.mp+ doit être placé dans un répertoire accessible à \MP{} (Par ex. le répertoire \verb+metapost+ du \verb+texmf+). De plus, la ligne \verb+input repere;+ doit apparaître dans le document contenant les figures. -Certaines des étiquettes (noms de points, de courbes, de vecteurs...) sont composées automatiquement au format \LaTeX{} mais la compilation peut devenir assez longue pour un nombre important de figures car un fichier est créé et compilé automatiquement par \MP{} pour chaque étiquette. Il est alors possible d'utiliser le fichier \verb+latexmp.mp+ à condition de placer l'instruction \verb+input latexmp;+ avant l'instruction \verb+input repere;+. Attention, utiliser \verb+latexmp.mp+ oblige à compiler deux fois les documents. +Les étiquettes (noms de points, de courbes, de vecteurs...) sont composées automatiquement au format \LaTeX{} avec le package \verb+latexmp.mp+. Il est donc nécessaire de compiler deux fois les documents. \section{Repère utilisateur} @@ -325,8 +331,6 @@ Au niveau de l'intersection des axes, les étiquettes sont tracées à la positi \end{description} -Les axes sont dessinés, gradués et étiquetés par défaut sur toute la longueur du repère utilisateur. Pour des valeurs différentes on peut utiliser les macros suivantes : - \begin{exemple} @@ -362,6 +366,9 @@ draw axey(1,1) withcolor bleu; fin; \end{exemple} + + + \subsubsection{Réglages des axes} Les axes sont dessinés, gradués et étiquetés par défaut sur toute la longueur du repère utilisateur. Pour des valeurs différentes on peut utiliser les macros suivantes : @@ -438,6 +445,8 @@ fin; \begin{description} \item[axexpart.pos(x1,lab1,x2,lab2,...)] graduation et étiquetage partiels de l'axe des abscisses pour les valeurs \verb+x1+, \verb+x2+... et les étiquettes \verb+lab1+, \verb+lab2+... à la position \verb+pos+. Si \verb+pos+ est omis, les étiquettes sont placées à la position \verb+bot+. Les étiquettes peuvent être soit des chaînes de caractères ("aa", "bonjour"), soit des expressions du type \verb+btex $\pi$ etex+ (ou \verb|LaTeX("$\pi$")| voir page \pageref{latex}), soit d'autres figures. Si \verb+labn+ est omis, la valeur de \verb+xn+ sera utilisée comme étiquette. Pour obtenir une graduation sans étiquette, on peut utiliser la chaîne vide \verb+""+. +On peut désactiver le dessin de la graduation en donnant la valeur \verb|false| à \verb|boolgradxpart|. + \item[axeypart.pos(y1,lab1,y2,lab2,...)] même chose sur l'axe des ordonnées. Si \verb+pos+ est omis, les étiquettes sont placées à la position \verb+lft+. \end{description} @@ -560,12 +569,15 @@ draw cadre; fin; \end{exemple} + + + \section{Points, vecteurs} \subsection{Points} \label{points} \begin{description} -\item[\_c(x,y)] désigne le point (ou le vecteur) de coordonnées cartésiennes \verb+x+ et \verb+y+ dans le repère utilisateur. +\item[(x,y)] désigne le point (ou le vecteur) de coordonnées cartésiennes \verb+x+ et \verb+y+ dans le repère utilisateur. \item[pol(r,t)] désigne le point (ou le vecteur) de coordonnées $(r\cos t;r\sin t)$ dans le repère utilisateur. @@ -587,8 +599,8 @@ Les macros suivantes sont directement inspirées des macros similaires de \verb+ \begin{exemple}[0.6] repere(-3,3,0.9cm,-2.5,5,0.9cm); pair A,B,C[],D,E,F; -A=_c(1,1);B=_c(2,3); -D=_c(-2,-1);E=_c(-1,-1);F=_c(-1,-2); +A=(1,1);B=(2,3); +D=(-2,-1);E=(-1,-1);F=(-1,-2); draw axes(1,0); marque_p:="";drawoptions(withcolor magenta); nomme.llft(A);nomme.top(B);draw A--B; @@ -597,15 +609,18 @@ pointe(D,E,F); marque_p:="creux";drawoptions(withcolor orange); nomme.bot(pol(sqrt(2),-pi/4), LaTeX("$\sqrt{2}e^{-i\frac{\pi}{4}}$")); -nomme.bot(_c(-1.5,1),LaTeX("$(-1,5;1)$")); +nomme.bot((-1.5,1),LaTeX("$(-1,5;1)$")); marque_p:="plein";drawoptions(withcolor violet); for i=2 upto 4: - C[i]=_c(-3+i/2,i);nomme.lft(C[i]); + C[i]=(-3+i/2,i);nomme.lft(C[i]); endfor draw cadre; fin; \end{exemple} + + + \subsection{Vecteurs} \begin{description} \item[vecteur.pos(A,u,nom)] figure formée du représentant du vecteur \verb+u+ d'origine \verb+A+ ainsi que de \verb+nom+ placé à la position \verb+pos+ par rapport au milieu de la flèche. Si \verb+nom+ est une chaine de caractère, il sera affiché avec une flèche. Si \verb+nom+ est omis, \verb+u+ surmonté d'une flèche est utilisé. S'il s'agit d'un élément d'un tableau de points (\verb+u1+, \verb+u2+...), le nombre est affiché en indice. @@ -615,8 +630,8 @@ fin; \begin{exemple}[0.6] repere(-1,5.5,0.7cm,-4,4,0.8cm); pair A,B,C[],u,v,w[]; -u=_c(2,2);v=_c(2,-1); -A=_c(1,1);B=A+u; +u=(2,2);v=(2,-1); +A=(1,1);B=A+u; draw axes(1,0); draw base(O,i,j); drawoptions(withcolor cyan); @@ -627,7 +642,7 @@ draw vecteur.bot(A,u+v,% LaTeX("$\vect{u}+\vect{v}$")); drawoptions(withcolor marine); for i=1 upto 3: - C[i]=_c(1,i-4);w[i]=_c(1.5,0.5*i-1); + C[i]=(1,i-4);w[i]=(1.5,0.5*i-1); draw vecteur.bot(C[i],w[i]); endfor draw cadre; @@ -635,6 +650,7 @@ fin; \end{exemple} + \section{Droites, courbes...} \subsection{Droites} @@ -652,7 +668,7 @@ fin; \begin{exemple}[0.65] repere(-2,3,1cm,-2,3,1cm); pair A,B; -A=_c(-0.5,-1);B=_c(1.5,1.5); +A=(-0.5,-1);B=(1.5,1.5); draw axes(1,0); nomme.ulft(A); nomme.lrt(B); @@ -669,9 +685,13 @@ fin; \verb|vardef f(expr x)=2x+1 enddef;|) et de définir des courbes passant par des points donnés (\verb+A..B..C+). Ces possibilités sont utilisées dans les macros qui suivent. \begin{description} -\item[courbefonc(f,xmin,xmax,n) ou courbefonc(f)(xmin,xmax,n)] courbe représentant la fonction \verb+f+ entre \verb+xmin+ et \verb+xmax+ en utilisant \verb+n+ points d'interpolation. +\item[courbefonc(f)()] courbe représentant la fonction $f$ sur l'intervalle définissant le repère. + +\item[courbefonc(f)(xmin,xmax)] courbe représentant la fonction $f$ sur l'intervalle $[xmin;xmax]$. + +\item[courbefonc(f)(xmin,xmax,n)] courbe représentant la fonction $f$ sur l'intervalle $[xmin;xmax]$ en utilisant \verb+n+ points d'interpolation. La valeur par défaut de \verb|n| est 60. -\item[courbepoints(f,xmin,xmax,n)] ne trace que les \verb+n+ points sans les relier. Les points sont dessinés en fonction de la valeur de \verb+marque_p+ (voir \ref{points}). +\item[courbepoints(f)(xmin,xmax,n)] ne trace que les \verb+n+ points sans les relier. Les points sont dessinés en fonction de la valeur de \verb+marque_p+ (voir \ref{points}). \item[fonccourbe.p(x)] image de \verb+x+ par la fonction dont la courbe représentative est le chemin \verb+p+. La macro renvoie 0 si la fonction n'est pas définie. @@ -686,11 +706,11 @@ vardef g(expr x)=exp(x)/10-3 enddef; path C_f; draw axes(1,1); drawoptions(withcolor moutarde); -C_f=courbefonc(f)(-2,5,50); +C_f= courbefonc(f)(); draw C_f withpen pencircle scaled 1; nomme.llft(C_f,4.7); drawoptions(withcolor beige); -draw courbepoints(g,0,4,9); +draw courbepoints(g)(0,4,9); fin; \end{exemple} @@ -708,10 +728,10 @@ repere(-2.5,4.5,1cm,-3.5,2.5,1cm); path p,C_f; pair I[],A[]; vardef f(expr x)= x**2-2x enddef; -p=_c(-2,-2).._c(-1,1).._c(0,2).._c(1,1) - .._c(2,-2).._c(3,-3).._c(3.5,-2.5) - .._c(4,-1); -C_f=courbefonc(f,-2,4,40); +p=(-2,-2)..(-1,1)..(0,2)..(1,1) + ..(2,-2)..(3,-3)..(3.5,-2.5) + ..(4,-1); +C_f= courbefonc(f)(-2,2.5); draw axes(1,1); drawoptions(withpen pencircle scaled 1); draw p withcolor bleu; @@ -729,7 +749,7 @@ fin; \begin{description} \item[marquepointcourbe(p,x1,x2,...)] marque les points de la courbe \verb+p+ d'abscisses \verb+x1+, \verb+x2+... La marque dépend de la valeur de \verb+marque_p+. -\item[marquepointchemin(p,n1,n2,...)] dans le cas d'un chemin défini par \verb+A..B..C..+, marque le \verb+n1+ème point, le \verb+n2+ième point... La marque dépend de la valeur de \verb+marque_p+. Attention, le premier point est numéroté 0. +\item[marquepointchemin(p,n1,n2,...)] dans le cas d'un chemin défini par \verb+A..B..C..+, marque le \verb+n1+-ième point, le \verb+n2+-ième point... La marque dépend de la valeur de \verb+marque_p+. Attention, le premier point est numéroté 0. \end{description} @@ -740,10 +760,10 @@ repere(-2.5,4.5,1cm,-3.5,2.5,1cm); path p,C_f; pair I[],A[]; vardef f(expr x)= x**2-2x enddef; -p=_c(-2,-2).._c(-1,1).._c(0,2) - .._c(1,1).._c(2,-2).._c(3,-3) - .._c(3.5,-2.5).._c(4,-1); -C_f=courbefonc(f,-2,4,40); +p=(-2,-2)..(-1,1)..(0,2) + ..(1,1)..(2,-2)..(3,-3) + ..(3.5,-2.5)..(4,-1); +C_f= courbefonc(f)(-2,3); draw axes(1,1); drawoptions(withpen pencircle scaled 1); draw p withcolor bleu; @@ -754,7 +774,6 @@ marquepointchemin(p,0,2,3,5); fin; \end{exemple} - \subsection{Dérivée et tangentes} \begin{description} \item[der.p(x)] image de \verb+x+ par la dérivée de la fonction dont la courbe représentative est \verb+p+. @@ -773,10 +792,10 @@ fin; \begin{exemple} repere(-2.5,4.5,1cm,-3.5,2.5,1cm); path p,q; -p=_c(-2,-2){dir 60}.._c(-1,1) - .._c(0,2){right}.._c(1,1).._c(2,-2) - .._c(3,-3){right}.._c(4,-2){(1,2)}; -q=courbefonc(der.p,-1,4,40); +p=(-2,-2){dir 60}..(-1,1) + ..(0,2){right}..(1,1)..(2,-2) + ..(3,-3){right}..(4,-2){(1,2)}; +q= courbefonc(der.p)(-1,4); draw axes(1,1); drawoptions(withpen pencircle scaled 1); draw p withcolor bleu; @@ -823,7 +842,7 @@ fin; repere(-2,4.5,1cm,-1,4,1cm); vardef f(expr x)=sqrt(2*x+4) enddef; path C_f,sr; -C_f=courbefonc(f,-2,5,50); +C_f= courbefonc(f)(); sr=suiterec(f,0,3,-1.2); draw axes(1,0); drawoptions(withpen pencircle scaled 1); @@ -840,7 +859,7 @@ fin; repere(-0.5,5,1cm,-0.5,5,1cm); vardef f(expr x)=4-0.8*x enddef; path C_f,sr; -C_f=courbefonc(f,-1,5,10); +C_f= courbefonc(f)(); sr=suiterec(f,0,5,0.2); draw axes(1,0); drawoptions(withpen pencircle scaled 1); @@ -858,7 +877,6 @@ fin; - \section{Surfaces} \subsection{Calcul intégral} @@ -874,8 +892,8 @@ repere(-3.5,6,0.7cm,-2.5,4.5,0.7cm); vardef f(expr x)= -(x/4)**3+0.75x enddef; vardef g(expr x)= -((x-2)**2)/9+4 enddef; path C_f,C_g,p,q; -C_f:=courbefonc(f,-3.5,6,40); -C_g:=courbefonc(g,-3.5,6,40); +C_f:= courbefonc(f)(); +C_g:= courbefonc(g)(); p:=entrecourbes(C_f,C_g,-2,1); q:=souscourbe(C_f,3,5); fill p withcolor 0.5Violet; @@ -902,7 +920,7 @@ vardef f(expr x)= -((x-2)**4)/32+((x-2)**2)/2+1 enddef; path Cf,r[]; -Cf=courbefonc(f,-2.5,6.5,50); +Cf= courbefonc(f)(); r1=rectangles.max(Cf,2,5.5,8); r2=rectangles.min(Cf,2,5.5,8); r3=rectangles.droite(Cf,-2,1,10); @@ -947,50 +965,7 @@ draw cadre; fin; \end{exemple} -\subsection{Remplissage} -Pour remplir des chemins fermés avec autre chose que de la couleur, \verb+repere+ permet l'utilisation de la syntaxe \verb+fill p avec motif+ où \verb+motif+ est un des motifs décrits ci-dessous. Cette instruction peut être complétée par des options de dessin (\verb+withpen+, \verb+withcolor+...). -\begin{description} -\item[hachures(pas,angle)] hachures espacées de \verb+pas+ et formant un angle en degrés de \verb+angle+ avec l'horizontale. Si les valeurs sont omises, \verb|pas| vaut 5 et \verb+angle+ vaut 60. - - -\item[briques(larg,haut,dec)] briques de largeur \verb+larg+, de hauteur \verb+haut+ et décalées d'une ligne à l'autre de \verb+dec+. Si les valeurs sont omises, \verb|larg| vaut 12, \verb|haut| vaut 6 et \verb+dec+ vaut 6. - - -\item[vagues(per,amp,dec)] (d'après le manuel de l'utilisateur) \og vagues \fg{} de période \verb+per+, d'amplitude \verb+amp+ et décalées d'une ligne à l'autre de \verb+dec+. Si les valeurs sont omises, \verb|per| vaut 20, \verb|amp| vaut 3 et \verb+dec+ vaut 10. -\end{description} - - - -\begin{exemple}[0.55] -repere(-1.5,4.5,1cm,-1.5,7.5,1cm); -path c[];picture lab;numeric u;u:=3cm; -c1=fullcircle scaled 2.5cm; -for k=1 upto 6: - i:=(k-1) mod 2;j:=(k-1) div 2; - c[k]:=c1 shifted (u*i,u*j); -endfor; -fill c1 withcolor lime; -fill c1 avec hachures(10,30) dashed evenly; -fill c2 withcolor lime; -fill c2 avec hachures(); -fill c3 withcolor (0,0.65,0.8,0.48); -fill c3 avec briques(15,5,4); -fill c4 withcolor (0,0.65,0.8,0.48); -fill c4 avec briques(); -fill c5 withcolor (1,0,0,0.2); -fill c5 avec vagues(30,10,20) - withpen pencircle scaled 2; -fill c6 withcolor (1,0,0,0.2); -fill c6 avec vagues(); -for k=1 upto 6: - i:=(k-1) mod 2;j:=(k-1) div 2; - draw c[k]; - lab:=thelabel("c"&decimal(k),u*(i,j)); - unfill bbox lab;draw lab; -endfor; -fin; -\end{exemple} @@ -1015,12 +990,12 @@ fin; repere(-1.5,3.5,1cm,-2.2,2.5,1cm); path Cf; pair A[]; vardef f(expr x)= x**2-2x-0.5 enddef; -Cf=courbefonc(f,-2,4,40); +Cf= courbefonc(f)(); ptantecedents(A,2,Cf); draw axes(1,1); draw Cf withpen pencircle scaled 1 withcolor bleu; drawoptions(dashed evenly withcolor rouge); -draw projectionaxes(_c(1.3,f(1.3)), +draw projectionaxes((1.3,f(1.3)), LaTeX("$x$"),LaTeX("$f(x)$")); draw projectionx.urt(A1,LaTeX("$x_1$")); draw projectionx.llft(A2,LaTeX("$x_2$"),-6); @@ -1040,23 +1015,23 @@ fin; repere(-1,5,0.9cm,-1,4.5,1cm); vardef f(expr x)=x**2-5x+7 enddef; draw axes(1,1); -draw courbefonc(f,-1,5,50) +draw courbefonc(f)() withpen pencircle scaled 1 withcolor bleu; drawoptions(dashed evenly withcolor rouge); -draw projectionx.bot(_c(1,f(1))); -draw projectiony.llft(_c(2.5,f(2.5)),"0,75"); -draw projectionaxes(_c(4,f(4))); +draw projectionx.bot((1,f(1))); +draw projectiony.llft((2.5,f(2.5)),"0,75"); +draw projectionaxes((4,f(4))); drawoptions(withcolor violet); draw intervallex.OF(1,4); draw intervalley.FF(0.75,3); -label(LaTeX("$f(]1;4])=[0,75;3]$"),_c(2.5,4)); +label(LaTeX("$f(]1;4])=[0,75;3]$"),(2.5,4)); draw cadre; fin; \end{exemple} -\section{Statistiques} +\section{Statistiques et probabilités} \subsection{Boite à moustache} \begin{description} @@ -1086,27 +1061,235 @@ repere(-1,11,0.8cm,-1,5,0.7cm); draw projboitemoustache.bot(1) dashed evenly; drawoptions(withcolor blue); draw boitemoustache(0,3.14,6,8,10,2cm,0.7cm); - draw projboitemoustache.bot(0.00456,"$\pi$","$\num{2x3}$","$x$","Max") - dashed evenly; + draw projboitemoustache.bot(0.0456,"$\pi$","$\num{2x3}$","$x$","Max") dashed evenly; fin; \end{exemplev} + +\subsection{Diagrammes} +\begin{description} +\item[diagrammebatons((v1,e1),(v2,e2),...(vn,en))] Figure formée des \verb|n| segments joignant les points \verb|(v1,e1),(v2,e2),...(vn,en)| et leur projeté sur l'axe des abscisses. Les bâtons sont surmontés d'un point dont le diamètre est égal à la largeur des segments multiplié par \verb|diampointsbatons|. \verb|diampointsbatons| est égal à 5 par défaut. On peut lui donner la valeur 0 pour ne pas avoir ces points. +\end{description} + +\begin{exemple}[0.6] +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 epaisseur 2 withcolor rouge; +fin +\end{exemple} + + +\begin{description} +\item[diagrammebarres((a1,h1),(a2,h2),...(an,hn))] Figure formée de \verb|n| barres rectangulaires de hauteurs \verb|h1| \dots \verb|hn| aux abscisses \verb|a1| \dots \verb|an|. La largeur de ces barres est le nombre \verb|largbarres| qui vaut 20 par défaut. +\end{description} + +\begin{exemple}[0.6] +repere(-0.5,5,1cm,-0.5,5,1cm); + path diag; + draw axey(1,1); + diag:=diagrammebarres((1,2),(2,4),(3,2),(4,1)); + fill diag withcolor cyan; + draw diag epaisseur 1 withcolor marine; + flecheaxe:=false; + draw axex(0,0); + boolgradxpart:=false; + draw axexpart.bot(1,"A",2,"B",3,"C",4,"D"); +fin +\end{exemple} + +\subsection{Probabilités} + +Quelques fonctions mathématiques sont proposées. Pour les grandes valeurs, on dépasse rapidement les capacités de \MP. Il est dans ce cas conseillé de compiler en utilisant la ligne de commande \verb|mpost -numbersystem="double" <fichier>.mp|. + + +\begin{description} +\item[factorielle(n)] Entier égal à $n!$. +\item[binom(n,k)] Entier égal à $\binom{n}{k}$. +\item[binomiale(n,p,k)] $P(X=k)$ pour $X$ suivant la loi binomiale de paramètres $n$ et $p$. +\item[diagrammebinomiale(n,p)] Diagramme en bâtons de la loi binomiale de paramètres $n$ et $p$. +\end{description} + + +\begin{exemple} +repere(-2,16,0.45cm,-0.1,0.25,15cm); +setall(0,16,0,0.25); +draw axex(1,1); +draw axey(0.1,0.1); +picture diag; +diampointsbatons:=0; +diag:=diagrammebinomiale(15,0.6); +draw diag withcolor blue epaisseur 4; +fin; +\end{exemple} + + +\section{Géométrie} +Certaines des macros suivantes sont largement inspirées des macros de \verb|geometriesyr16.mp| de Christophe \bsc{Poulain}. + +\subsection{Polygones} +\begin{description} +\item[polygone(A,B,C,...)] Chemin fermé représentant le polygone $ABC...$ + +\item[triangle(A,B,C)] Cas particulier du précédent. Chemin fermé représentant le triangle $ABC$. + +\item[parallélogramme(A,B,C)] Chemin fermé représentant $ABCD$ où $D$ est le quatrième point du parallélogramme. + +\item[polygoneregulier(A,B,n)] Chemin fermé représentant le polygone régulier de sens direct à $n$ côtés dont un des côtés est $[AB]$. + +\item[equilateral(A,B)] Cas particulier du précédent. Triangle équilatéral de sens direct de côté $[AB]$. + +\item[carre(A,B)] Autre cas particulier. Carré de sens direct de côté $[AB]$. +\end{description} + +\begin{exemple}[0.51] +repere(-1,5,1cm,-1,4,1cm); +draw axes(1,1); +pair A,B,C,D,E,F,G; +A=(0,1);B=(2,0);C=(4,2);D=(3,3);E=(1,3); +F=(4,0);G=(3,2); +fill triangle(A,F,G) withcolor orange; +draw triangle(A,F,G); +draw polygone(A,B,C,D,E); +draw parallelogramme(D,G,E) withcolor vert; +fin; +\end{exemple} + + +\begin{exemple}[0.53] +repere(-1,5,1cm,-1,4,1cm); +draw axes(1,1); +pair A,B; +A=(1,1);B=(3,0.5); +fill polygoneregulier(A,B,5) withcolor bleu; +fill equilateral(A,B) withcolor cyan; +draw polygoneregulier(A,B,5); +draw equilateral(A,B); +fin; +\end{exemple} + +\subsection{Cercles et arcs} + +\begin{description} +\item[cercle(A,B,C)] Cercle circonscrit au triangle $ABC$. +\item[cercle(O,A)] Cercle de centre $O$ passant par $A$. +\item[cercle(O,r)] Cercle de centre $O$ et de rayon $r$. L'unité de longueur est l'unité de l'axe des abscisses. +\item[arccercle(A,O,B)] Arc de cercle de sens direct de centre $O$, passant par $A$ et s'appuyant sur la demi-droite $[OA)]$. +\end{description} + + +\begin{exemple} +repere(-1,5,1cm,-0.5,4,1cm); +draw axes(1,1); +pair A,B,C; +A=(1,1);B=(2,0);C=(3.5,2); +nomme.lft(A);nomme.urt(C);nomme.top(B); +draw triangle(A,B,C) withcolor bleu; +draw cercle(A,B,C) withcolor marine; +draw A--B withcolor rouge epaisseur 1; +draw cercle(A,B) withcolor rouge; +fin; +\end{exemple} + + +\begin{exemple} +repere(-1,5,1cm,-2,8,0.5cm); +draw axes(1,1); +pair A,M,B; +A=(2,2);M=(2,6);B=(3,2); +nomme.bot(A);nomme.rt(B);nomme.top(M); +draw B--A--M; +draw cercle(A,2); +draw arccercle(B,A,M); +fin; +\end{exemple} + + + +\subsection{Codage des segments et des angles} + +\begin{description} +\item[marqueangle(A,O,B,n)] Figure formée de \verb|n| arcs de cercle de centre $O$ et de rayon moyen \verb|taille_marque_a| (qui vaut par défaut \verb|0.4cm|) permettant de marquer l'angle géométrique $\widehat{AOB}$. Les arcs son séparés de \verb|sep_marque_a| qui vaut par défaut \verb|1.5|. + +Il s'agit d'un chemin fermé qui peut donc être rempli. + +\item[marqueangle(A,O,B)] Arc de cercle de centre \verb|O| et de rayon \verb|taille_marque_a| permettant de marquer l'angle orienté avec \verb|drawarrow|. + +\item[nomme.pos(A,O,B,texte)] Place le texte entre \verb|A| et \verb|B|, à une distance \verb|taille_marque_a| du centre, à la position \verb|pos|. +\end{description} + + +\begin{exemple} +repere(-2,12,0.4cm,-2,10,0.4cm); +pair A,B,C; +A=(1,2);B=(11,2);C=(8,9); +draw axes(0,0); +draw triangle(A,B,C); +nomme.llft(A);nomme.lrt(B);nomme.top(C); +fill marqueangle(C,B,A,3) withcolor red; +draw marqueangle(C,B,A,3); +drawarrow marqueangle(A,C,B); +fill marqueangle(B,A,C,1) withcolor vert; +draw marqueangle(B,A,C,1); +nomme.rt(B,A,C,LaTeX("\ang{45}")); +fin; +\end{exemple} + +\begin{description} +\item[marqueangledroit(A,O,B)] Chemin fermé permettant de marquer l'angle droit $\widehat{AOB}$ sous forme d'un losange (il s'agit donc d'un carré si l'angle est réellement droit). Le côté du losange est \verb|taille_marque_ad| et vaut \verb|0.3cm| par défaut. +\item[marquesegment(A,B,n)] Figure formées de \verb|n| marques sur le segment $[AB]$. Ces marques ont une taille de \verb|taille_marque_s| (\verb|0.3cm| par défaut), forment un angle en degrés de \verb|angle_marque_s| avec le segment (\verb|60| par défaut) et sont séparées de \verb|sep_marque_s| (\verb|2| par défaut). +\end{description} + +\begin{exemple}[0.6] +repere(-1,10,0.5cm,-1,9,0.5cm); +pair A,B,C,A',B',C',u; +A=(3,1);B=(5,2);C=(1,5);u=(3,3); +A'-A=B'-B=C'-C=u; +draw projectionaxes(A,LaTeX("$x_A$"), + LaTeX("$y_A$")) dashed evenly; +draw axes(0,0); +drawoptions(withcolor pourpre); +draw triangle(A,B,C);draw triangle(A',B',C'); +draw marqueangledroit(B,A,C); +draw marqueangledroit(B',A',C'); +draw marquesegment(B,C,2); +draw marquesegment(B',C',2); +nomme.llft(A);nomme.lrt(B);nomme.ulft(C); +nomme.llft(A');nomme.lrt(B');nomme.ulft(C'); +drawoptions(withcolor vertfonce); +draw vecteur.lrt(B,u);draw vecteur.lrt(C,u); +fin; +\end{exemple}% + \section{Divers} \subsection{Composition des étiquettes} -Tous les textes et étiquettes peuvent être composés en utilisant la macro ci-dessous. Cette macro utilise \verb+latexmp+ si ce fichier est chargé ou l'écriture dans un fichier externe (adaptation de la macro \verb+TEX+) dans le cas contraire. +Tous les textes et étiquettes peuvent être composés en utilisant la macro ci-dessous. \begin{description} - \item[LaTeX(ch)] \label{latex} Figure formée de la chaîne \verb+ch+ composée avec \LaTeX. Il est donc possible d'utiliser la macro \verb|decimal()| de \MP. + \item[LaTeX(ch)] \label{latex} Figure formée de la chaîne \verb+ch+ composée avec \LaTeX{} et mise à l'échelle \verb|defaultscale|. Cette macro utilise la commande \verb|textext| de \verb|luamplib| dans le cas de l'utilsation de Lua\LaTeX{} et \verb|textext| de \verb|latexmp| dans le cas d'une compilation \MP{} \og standard \fg. Ce dernier cas nécessite alors deux compilations. \end{description} \begin{exemple}[0.65] repere(-1,7,1cm,-1,1,1cm); for i=2 upto 6: -label(LaTeX("$\frac{1}{"&decimal(i)&"}$"),(i*cm,0)); +label(LaTeX("$\frac{1}{"&decimal(i)&"}$"),(i,0)); endfor fin; \end{exemple} +\begin{description} +\item[label.pos(fig,point)] Commande de \MP{} qui permet de placer la figure \verb|fig| au niveau du point \verb|point|. +\end{description} + +\begin{exemple}[0.55] +repere(-1,5,1cm,-1,4,1cm); +draw axes(1,1); +label.ulft(LaTeX("Abscisses"),(5,0.1)); +label.lrt(LaTeX("Ordonnées"),(0.1,4)); +label(LaTeX("$f(x)=\pi^2\sqrt{x}$"),(2,2)); +fin; +\end{exemple} \subsection{Couleurs} Certaines couleurs sont définies par leur nom et peuvent être utilisées directement : @@ -1117,11 +1300,11 @@ repere(0,18,1cm,-3,1,1cm); path rectangle; save a,b,dech,decv; a:=25;b:=12;dech:=70;decv:=-20; - rectangle = (0,0)--(a,0)--(a,b)--(0,b)--cycle; + rectangle = ((0,0)--(a,0)--(a,b)--(0,b)--cycle) transformed inverse _T; vardef couleur(expr t)= image(% fill rectangle withcolor scantokens(t); - label.rt(LaTeX("\smash{" & t & "}"),(a,b/4)) + label.rt(LaTeX("\smash{" & t & "}"),(a,b/4) transformed inverse _T) ) enddef; draw couleur("rouge"); @@ -1151,6 +1334,54 @@ fin; Toutes ces couleurs sont définies selon le modèle \og rgb \fg. Pour les obtenir selon le modèle \og cmyk \fg, remplacer la première lettre par une majuscule. + +\subsection{Remplissage} +Pour remplir des chemins fermés avec autre chose que de la couleur, \verb+repere+ permet l'utilisation de la syntaxe \verb+fill p avec motif+ où \verb+motif+ est un des motifs décrits ci-dessous. Cette instruction peut être complétée par des options de dessin (\verb+withpen+, \verb+withcolor+...). + +\begin{description} +\item[hachures(pas,angle)] hachures espacées de \verb+pas+ et formant un angle en degrés de \verb+angle+ avec l'horizontale. Si les valeurs sont omises, \verb|pas| vaut 5 et \verb+angle+ vaut 60. + + +\item[briques(larg,haut,dec)] briques de largeur \verb+larg+, de hauteur \verb+haut+ et décalées d'une ligne à l'autre de \verb+dec+. Si les valeurs sont omises, \verb|larg| vaut 12, \verb|haut| vaut 6 et \verb+dec+ vaut 6. + + +\item[vagues(per,amp,dec)] (d'après le manuel de l'utilisateur) \og vagues \fg{} de période \verb+per+, d'amplitude \verb+amp+ et décalées d'une ligne à l'autre de \verb+dec+. Si les valeurs sont omises, \verb|per| vaut 20, \verb|amp| vaut 3 et \verb+dec+ vaut 10. +\end{description} + + + +\begin{exemple}[0.55] +repere(-1.5,4.5,1cm,-1.5,7.5,1cm); +path c[];picture lab; +c1=fullcircle scaled 2.5; +for k=1 upto 6: + i:=(k-1) mod 2;j:=(k-1) div 2; + c[k]:=c1 shifted (3*i,3*j); +endfor; +fill c1 withcolor lime; +fill c1 avec hachures(10,30) dashed evenly; +fill c2 withcolor lime; +fill c2 avec hachures(); +fill c3 withcolor (0,0.65,0.8,0.48); +fill c3 avec briques(15,5,4); +fill c4 withcolor (0,0.65,0.8,0.48); +fill c4 avec briques(); +fill c5 withcolor (1,0,0,0.2); +fill c5 avec vagues(30,10,20) + withpen pencircle scaled 2; +fill c6 withcolor (1,0,0,0.2); +fill c6 avec vagues(); +for k=1 upto 6: + i:=(k-1) mod 2;j:=(k-1) div 2; + draw c[k]; + lab:=thelabel("c"&decimal(k),3*(i,j)); + unfill bbox lab;draw lab; +endfor; +fin; +\end{exemple} + + + \subsection{Figures pour une présentation} \begin{description} \item[figureinter] exporte la figure telle qu'elle est au moment où cette commande apparait. La numérotation est incrémentée et la figure peut continuer. @@ -1161,12 +1392,12 @@ Toutes ces couleurs sont définies selon le modèle \og rgb \fg. Pour les obteni repere(-3,3,0.7cm,-1,5,0.7cm); path C_f; vardef f(expr x)=x**2 enddef; - C_f=courbefonc(f,-3,3,50); + C_f= courbefonc(f)(); draw quadrillage(1,1); draw axes(1,1); draw cadre; figureinter; - draw courbepoints(f,-2,2,9) withcolor rouge; + draw courbepoints(f)(-2,2,9) withcolor rouge; figureinter; draw C_f withcolor bleu withpen pencircle scaled 1; fin; @@ -1193,6 +1424,9 @@ Si ces trois figures s'appellent \verb|mafigure.1|, \verb|mafigure.2| et \verb|m \end{minipage} \end{center} + + + \subsection{Code embarqué dans un document \LaTeX} Certains packages permettent d'écrire du code \MP{} directement dans un document \LaTeX. \verb|repere| est compatible avec, entre autres, \verb|emp| et \verb|mpgraphics|. @@ -1223,13 +1457,12 @@ Certains packages permettent d'écrire du code \MP{} directement dans un documen \begin{document} \begin{empfile} \begin{empcmds} - input latexmp; input repere; \end{empcmds} \begin{emp}(0,0) - repere(-3,3,0.8cm,-2.5,2.5,1cm); - draw axes(1,1); - fin; + repere(-3,3,1cm,-2,2,1cm); + draw axes(1,1); + fin; \end{emp} \end{empfile} \end{document} @@ -1247,41 +1480,77 @@ Certains packages permettent d'écrire du code \MP{} directement dans un documen \usepackage[runs=2]{mpgraphics} \begin{document} \begin{mpdefs} - input latexmp; input repere; \end{mpdefs} \begin{mpdisplay} - repere(-3,3,0.8cm,-2.5,2.5,1cm); - draw axes(1,1); - fin; + repere(-3,3,1cm,-2,2,1cm); + draw axes(1,1); + fin; \end{mpdisplay} \end{document} \end{lstlisting} \end{minipage} -\section{Exemples d'utilisation simultanée de \texttt{repere} et \texttt{geometriesyr}} +Il est aussi possible d'utiliser Lua\LaTeX{} avex le package \verb|luamplib|. Il faut alors charger les packages \verb|siunitx| et \verb|esvect| utilisés par \verb|repere|. -\label{exgeom}Il est possible, dans une figure créée avec \verb+repere+, d'utiliser certaines macros de \verb+geometriesyr+. Il faut alors charger \verb+geometriesyr+ \emph{avant} \verb|repere|. +\begin{center} +\begin{minipage}[t]{0.45\linewidth} +{\centering \textbf{Utilisation de Lua\LaTeX}\par} -\begin{exemple}[0.6] -repere(-1,10,0.5cm,-1,9,0.5cm); -pair A,B,C,A',B',C',u; -A=_c(3,1);B=_c(5,2);C=_c(1,5);u=_c(3,3); -A'-A=B'-B=C'-C=u; -draw projectionaxes(A,LaTeX("$x_A$"), - LaTeX("$y_A$")) dashed evenly; -draw axes(0,0); -drawoptions(withcolor pourpre); -draw triangle(A,B,C);draw triangle(A',B',C'); -draw codeperp(B,A,C,7);draw codeperp(B',A',C',7); -draw codesegments(B,C,B',C',2); -nomme.llft(A);nomme.lrt(B);nomme.ulft(C); -nomme.llft(A');nomme.lrt(B');nomme.ulft(C'); + +\verb|lualatex monfichier.tex| + +\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightSteelBlue},language={[LaTeX]TeX}] +\documentclass{article} +\usepackage{fontspec} +\usepackage{siunitx} +\usepackage{esvect} +\usepackage{luamplib} +\begin{document} +\everymplib{input repere;} +\begin{mplibcode} + repere(-3,3,1cm,-2,2,1cm); + draw axes(1,1); +fin; +\end{mplibcode} +\end{document} +\end{lstlisting} +\end{minipage} +\end{center} + +\section{Dessin à main levée avec \texttt{geometriesyr}} + +\label{exgeom}Il est possible, dans une figure créée avec \verb+repere+, d'utiliser le \og dessin à main levée \fg{} de \verb+geometriesyr+. Il faut alors charger \verb+geometriesyr+ \emph{avant} \verb|repere| et utiliser les fonctions de dessin telles que \verb|cercles|, \verb|triangle|... + +\begin{exemple} +repere(-0.5,5,1cm,-0.5,5,1cm); +coulpoint:=blue;coullabel:=blue; +pair A,B,C,D; +A=(0.5,0.5);B=(4,1);C=(3,4); +typetrace:="mainlevee"; +draw axes(1,1); +drawoptions(withcolor violet); +draw triangle(A,B,C); +nomme.llft(A);nomme.lrt(B); +nomme.top(C); +draw marqueangle(B,A,C,1); drawoptions(withcolor vertfonce); -draw vecteur.lrt(B,u);draw vecteur.lrt(C,u); +draw cercles(CentreCercleC(A,B,C),A); fin; -\end{exemple}% +\end{exemple} + + + +\begin{codecache} +end +\end{codecache} + +\makeatletter +\immediate\closeout\verbatim@out +\makeatother +\end{document} + \vspace{2em} @@ -1357,7 +1626,6 @@ end \makeatletter \immediate\closeout\verbatim@out \makeatother -%\addtocontents{toc}{\protect\end{multicols}} \end{document} diff --git a/Master/texmf-dist/metapost/repere/repere.mp b/Master/texmf-dist/metapost/repere/repere.mp index 1d8b70c73a5..2b6d86e5b8b 100644 --- a/Master/texmf-dist/metapost/repere/repere.mp +++ b/Master/texmf-dist/metapost/repere/repere.mp @@ -1,8 +1,8 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% repere.mp %% %% Macros pour la construction de figures dans un repère %% -%% o.peault@gmail.com %% -%% Version 13.12 (Décembre 2013) %% +%% o.peault@openmailbox.org %% +%% Version 16.06 (Juin 2016) %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % This work may be distributed and/or modified under the conditions of @@ -13,18 +13,20 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% input format; +if not known mplib: input latexmp fi; warningcheck:=0; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%% REPERE %%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% numeric _nfig,_nbaxes,theta,taillegrad,taillepoint,taillecroix,facteurx,facteury; -boolean flecheaxe,displayfrac,coupe; +boolean flecheaxe,displayfrac,coupe,boolgradxpart,boolgradypart; _nfig:=1; path cadre; numeric _diag,_largcadre,_hautcadre,_tfig; -pair _O,_I,_J; +pair _O,_I,_J,_O_; transform _T; picture _axorlab; pair poslabO; @@ -35,10 +37,35 @@ facteury:=1; boolean rep_groupe; rep_groupe:=false; +%%%%%%%%%%% Sauvegarde macros plain let oldbeginfig=beginfig; let oldendfig=endfig; +let olddraw = draw; +let olddrawarrow = drawarrow; +let olddrawdblarrow = drawdblarrow; +let oldfill = fill; +vardef theoldlabel@#(expr s,z) = % Position s near z + save p; picture p; + if picture s: p=s + else: p = s infont defaultfont scaled defaultscale + fi; + p shifted (z + labeloffset*laboff@# - + (labxf@#*lrcorner p + labyf@#*ulcorner p + + (1-labxf@#-labyf@#)*llcorner p + ) + ) +enddef; +vardef oldbbox primary p = + llcorner p-(bboxmargin,bboxmargin) -- lrcorner p+(bboxmargin,-bboxmargin) + -- urcorner p+(bboxmargin,bboxmargin) -- ulcorner p+(-bboxmargin,bboxmargin) + -- cycle +enddef; + + +%%%%%%% Redéfinition beginfig + def beginfig(expr c)= oldbeginfig(c); _nfig:=c; @@ -51,9 +78,11 @@ def endfig= rep_groupe:=false enddef; + +%%%%%%%%%% Définition du repère + vardef repere@#(text t)= if (str @#="") or (str @#="larg") or (str @#="orth") or (str @#="prop"): -% _nfig:=_nfig+1;definitionrepere@#(t) definitionrepere@#(t) else: reperenum@#(t) @@ -84,15 +113,73 @@ vardef definitionrepere@#(text t) = _T:=identity xscaled Ux yscaled Uy slanted cosd(theta) yscaled sind(theta); _defcadre; settout(Xmin,Xmax,Ymin,Ymax); - _O:=_c(0,0); xO:=0 ; yO:=0; - _I:=_c(1,0); _J:=_c(0,1); + _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:=1mm;_nbaxes:=0;_axorlab:=nullpicture;poslabO:=(0,0); marque_p := "plein";displayfrac:=false;flecheaxe:=true;coupe:=true; + boolgradxpart:=true;boolgradypart:=true; defaultscale:=1; unitex:=abs(_I);unitey:=abs(_J);unite:=unitex; facteurx:=1;facteury:=1; string extranumx,extranumy; extranumx=extranumy=""; + init_traces; +enddef; + +%%%% Initialisations tracés (redéfinition draw etc.) +def init_traces = + %% draw + def draw expr p = + addto currentpicture + if picture p: + also p + else: + doublepath p transformed _T withpen currentpen + fi + _op_ + enddef; + %% fill + def fill expr c = + if path c: + addto currentpicture contour (c transformed _T) _op_ + else: + olddraw c + fi + enddef; + %% thelabel + vardef thelabel@#(expr s,z) = % Position s near z + save p; picture p; + if picture s: p=s + else: p = s infont defaultfont scaled defaultscale + fi; + p shifted (_cart(z) + labeloffset*laboff@# - + (labxf@#*lrcorner p + labyf@#*ulcorner p + + (1-labxf@#-labyf@#)*llcorner p + ) + ) + enddef; + %% drawarrow + def drawarrow expr p = _apth:=p transformed _T; _finarr enddef; + def drawdblarrow expr p = _apth:=p transformed _T; _findarr enddef; + %% bbox + vardef bbox primary p = + if picture p: oldbbox p transformed inverse _T + else: oldbbox p + fi + enddef; +enddef; + +def _finarr text t = + olddraw _apth t; + filldraw arrowhead _apth t +enddef; + +vardef arrowhead expr p = %redéfinition flèches + save q,e; path q; pair e; + e = point length p of p; + q = gobble(p shifted -e cutafter makepath(pencircle scaled 2ahlength)) + cuttings; + (q rotated .5ahangle & reverse q rotated -.5ahangle -- 0.5*(point 0 of q)-- cycle) shifted e enddef; def setaxes(expr a,b,c,d)= @@ -121,16 +208,19 @@ enddef; let setall=settout; def fin = - if _nbaxes=1: draw _axorlab fi; - if coupe: clip currentpicture to cadre fi; + if _nbaxes=1: olddraw _axorlab fi; + if coupe: clip currentpicture to (cadre transformed _T) fi; if bf: oldendfig; bf:=false;_nfig:=_nfig+1 fi; enddef; def _defcadre= - cadre:=_c(Xmin,Ymin)--_c(Xmin,Ymax)--_c(Xmax,Ymax)--_c(Xmax,Ymin)--cycle; + cadre:=(Xmin,Ymin)--(Xmin,Ymax)--(Xmax,Ymax)--(Xmax,Ymin)--cycle; _diag:=abs(llcorner cadre - urcorner cadre); + _diag_:=abs(llcorner _cart(cadre) - urcorner _cart(cadre)); _largcadre:=abs(llcorner cadre - lrcorner cadre); + _largcadre_:=abs(llcorner _cart(cadre) - lrcorner _cart(cadre)); _hautcadre:=abs(llcorner cadre - ulcorner cadre); + _hautcadre_:=abs(llcorner _cart(cadre) - ulcorner _cart(cadre)); _tfig:=max(_largcadre,_hautcadre); % compatibilité geometriesyr enddef; @@ -139,7 +229,7 @@ enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def interaxes(expr a,b) = - _O:=_c(a,b); + _O:=_cart(a,b);_O_:=(a,b); xO:=a; yO:=b; enddef; @@ -163,7 +253,7 @@ vardef _etiqx_@#(expr ab,dec,st)= %étiquettes axe des abscisses if numeric st: pic:=LaTeX("$\num{" & decimal(st) & extranumx & "}$") elseif string st: pic:=LaTeX(st) else: pic:=st fi; - thelabel.@#(pic,_c(ab,yO) shifted (dec*_posgradx@#)) + theoldlabel.@#(pic,_cart(ab,yO) shifted (dec*_posgradx@#)) enddef; vardef _etiqy_@#(expr ro,dec,st)= %étiquettes axe des ordonnées @@ -172,17 +262,17 @@ vardef _etiqy_@#(expr ro,dec,st)= %étiquettes axe des ordonnées if numeric st: pic:=LaTeX("$\num{" & decimal(st) & extranumy & "}$") elseif string st: pic:=LaTeX(st) else: pic:=st fi; - thelabel.@#(pic,_c(xO,ro) shifted (dec*_posgrady@#)) + theoldlabel.@#(pic,_cart(xO,ro) shifted (dec*_posgrady@#)) enddef; vardef graduationx(expr x)= %%%%%%% graduation axe des abscisses - ((0,taillegrad)--(0,-taillegrad)) rotated (theta-90) shifted _c(x,yO) + ((0,taillegrad)--(0,-taillegrad)) rotated (theta-90) shifted _cart(x,yO) enddef; vardef graduationy(expr y)= %%%%%%% graduation axe des ordonnées - ((taillegrad,0)--(-taillegrad,0)) shifted _c(xO,y) + ((taillegrad,0)--(-taillegrad,0)) shifted _cart(xO,y) enddef; vardef etiquettex@#(expr x)= @@ -195,9 +285,9 @@ vardef etiquettey@#(expr y)= enddef; -vardef dessinaxex=_c(AxeXmin,yO)--_c(AxeXmax,yO) enddef; +vardef dessinaxex=_cart(AxeXmin,yO)--_cart(AxeXmax,yO) enddef; -vardef dessinaxey=_c(xO,AxeYmin)--_c(xO,AxeYmax) enddef; +vardef dessinaxey=_cart(xO,AxeYmin)--_cart(xO,AxeYmax) enddef; vardef graduationsaxex(expr grad)= %%%% ensemble des graduations abscisses @@ -205,10 +295,10 @@ vardef graduationsaxex(expr grad)= %%%% ensemble des graduations abscisses $=image(% imax:=floor((GradXmax-xO)/grad);imin:=ceiling((GradXmin-xO)/grad); for i=imin upto imax-1: - draw graduationx(arrondimil(i*grad)+xO) withpen pencircle scaled 0.5bp; + olddraw graduationx(arrondimil(i*grad)+xO) withpen pencircle scaled 0.5bp; endfor % dernière graduation - if AxeXmax*Ux-(imax*grad+xO)*Ux>ahlength: draw 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; @@ -217,10 +307,10 @@ vardef graduationsaxey(expr grad)= %%%% ensemble des graduations ordonnées $=image(% imax:=floor((GradYmax-yO)/grad);imin:=ceiling((GradYmin-yO)/grad); for i=imin upto imax-1: - draw graduationy(arrondimil(i*grad)+yO) withpen pencircle scaled 0.5bp; + olddraw graduationy(arrondimil(i*grad)+yO) withpen pencircle scaled 0.5bp; endfor; % dernière graduation - if AxeYmax*Uy-(imax*grad+yO)*Uy>ahlength: draw graduationy(arrondimil(imax*grad)+yO) withpen pencircle scaled 0.5bp fi); + if AxeYmax*Uy-(imax*grad+yO)*Uy>ahlength: olddraw graduationy(arrondimil(imax*grad)+yO) withpen pencircle scaled 0.5bp fi); $ enddef; @@ -242,15 +332,15 @@ vardef etiquettesaxex@#(expr val)= %%% ensemble des étiquettes abscisses else: labmax:=nullpicture fi; % tracé première étiquette - if xpart ((ulcorner labmin) transformed inverse _T)>=Xmin: draw labmin fi; + if xpart ((ulcorner labmin) transformed inverse _T)>=Xmin: olddraw labmin fi; % tracé autres étiquettes for i=imin+1 upto imax-1: if (i<>0): - draw etiquettex.@#(arrondimil(i*val)+xO) + olddraw etiquettex.@#(arrondimil(i*val)+xO) fi; endfor; % tracé dernière étiquette - if xpart ((lrcorner labmax) transformed inverse _T)<=Xmax: draw labmax fi; + if xpart ((lrcorner labmax) transformed inverse _T)<=Xmax: olddraw labmax fi; ); $ enddef; @@ -272,15 +362,15 @@ vardef etiquettesaxey@#(expr val)= %%% ensemble des étiquettes ordonnées else: labmax:=nullpicture fi; % tracé première étiquette - if ypart (llcorner labmin) >=ypart _c(Xmin,Ymin): draw labmin fi; + if ypart (llcorner labmin) >=ypart _cart(Xmin,Ymin): olddraw labmin fi; % tracé autres étiquettes for i=imin+1 upto imax-1: if (i<>0): - draw etiquettey.@#(arrondimil(i*val)+yO) + olddraw etiquettey.@#(arrondimil(i*val)+yO) fi; endfor; % tracé dernière étiquette - if ypart (ulcorner labmax) <=ypart _c(Xmax,Ymax): draw labmax fi + if ypart (ulcorner labmax) <=ypart _cart(Xmax,Ymax): olddraw labmax fi ); $ enddef; @@ -290,38 +380,38 @@ vardef _axex_@#(expr grad,val,nn)= picture $; $=image( % axe - if flecheaxe: drawarrow else: draw fi dessinaxex; + if flecheaxe: olddrawarrow else: olddraw fi dessinaxex; % graduations - if grad>0: draw graduationsaxex(grad) fi; + if grad>0: olddraw graduationsaxex(grad) fi; % étiquettes if val>0: if nn=1: if str @#<>"": - draw etiquettesaxex@#(val); + olddraw etiquettesaxex@#(val); _axorlab:=etiquettex@#(xO) else: - draw etiquettesaxex.bot(val); + olddraw etiquettesaxex.bot(val); _axorlab:=etiquettex.bot(xO) fi; poslabO:=poslabO + unitvector(0,ypart _posgradx@#); if xO<>yO: - draw _axorlab + olddraw _axorlab elseif _nbaxes=2: - draw _etiqx_(xO,0,xO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) + olddraw _etiqx_(xO,0,xO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) fi elseif nn=2: if str @#<>"": - draw etiquettesaxex@#(val); - draw etiquettex@#(xO) + olddraw etiquettesaxex@#(val); + olddraw etiquettex@#(xO) else: - draw etiquettesaxex.bot(val); - draw etiquettex.bot(xO) + olddraw etiquettesaxex.bot(val); + olddraw etiquettex.bot(xO) fi else: if str @#<>"": - draw etiquettesaxex@#(val) + olddraw etiquettesaxex@#(val) else: - draw etiquettesaxex.bot(val) + olddraw etiquettesaxex.bot(val) fi fi fi @@ -334,38 +424,38 @@ vardef _axey_@#(expr grad,val,nn)= picture $; $=image( % axe - if flecheaxe: drawarrow else: draw fi dessinaxey; + if flecheaxe: olddrawarrow else: olddraw fi dessinaxey; % graduations - if grad>0: draw graduationsaxey(grad) fi; + if grad>0: olddraw graduationsaxey(grad) fi; % étiquettes if val>0: if nn=1: if str @#<>"": - draw etiquettesaxey@#(val); + olddraw etiquettesaxey@#(val); _axorlab:=etiquettey@#(yO) else: - draw etiquettesaxey.lft(val); + olddraw etiquettesaxey.lft(val); _axorlab:=etiquettey.lft(yO) fi; poslabO:=poslabO + unitvector(xpart _posgrady@#,0); if xO<>yO: - draw _axorlab + olddraw _axorlab elseif _nbaxes=2: - draw _etiqy_(yO,0,yO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) + olddraw _etiqy_(yO,0,yO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) fi elseif nn=2: if str @#<>"": - draw etiquettesaxey@#(val); - draw etiquettey@#(yO) + olddraw etiquettesaxey@#(val); + olddraw etiquettey@#(yO) else: - draw etiquettesaxey.lft(val); - draw etiquettey.lft(yO) + olddraw etiquettesaxey.lft(val); + olddraw etiquettey.lft(yO) fi else: if str @#<>"": - draw etiquettesaxey@#(val) + olddraw etiquettesaxey@#(val) else: - draw etiquettesaxey.lft(val) + olddraw etiquettesaxey.lft(val) fi fi fi @@ -535,7 +625,7 @@ vardef etiquettesaxeypi@#(expr n,d)= %%% ensemble des étiquettes multiple else: labmax:=nullpicture fi; % tracé première étiquette - if ypart (llcorner labmin) >=ypart _c(Xmin,Ymin): draw labmin fi; + if ypart (llcorner labmin) >=ypart _cart(Xmin,Ymin): draw labmin fi; % tracé autres étiquettes for i=imin+1 upto imax-1: if (i<>0): @@ -543,7 +633,7 @@ vardef etiquettesaxeypi@#(expr n,d)= %%% ensemble des étiquettes multiple fi; endfor; % tracé dernière étiquette - if ypart (ulcorner labmax) <=ypart _c(Xmax,Ymax): draw labmax fi + if ypart (ulcorner labmax) <=ypart _cart(Xmax,Ymax): draw labmax fi ); $ enddef; @@ -555,7 +645,7 @@ vardef _axexpi_@#(expr num,den,nn)= grad:=num*pi/den; $=image( % axe - if flecheaxe: drawarrow else: draw fi dessinaxex; + if flecheaxe: olddrawarrow else: olddraw fi dessinaxex; % graduations if grad>0: draw graduationsaxex(grad) fi; % étiquettes @@ -599,7 +689,7 @@ vardef _axeypi_@#(expr num,den,nn)= grad:=num*pi/den; $=image( % axe - if flecheaxe: drawarrow else: draw fi dessinaxey; + if flecheaxe: olddrawarrow else: olddraw fi dessinaxey; % graduations if grad>0: draw graduationsaxey(grad) fi; % étiquettes @@ -715,8 +805,9 @@ vardef axexpart@#(text t)= for _i=t: if numeric _i: if var: if str @#="": draw _etiqx_.bot(tmp,taillegrad,tmp) else: draw _etiqx_@#(tmp,taillegrad,tmp) fi fi; -% draw ((0,taillegrad)--(0,-taillegrad)) shifted _c(_i,yO) withpen pencircle scaled 0.8bp; - draw graduationx(_i) withpen pencircle scaled 0.8bp; + if boolgradxpart: + draw graduationx(_i) withpen pencircle scaled 0.8bp + fi; tmp:=_i; var:=true else: @@ -738,7 +829,7 @@ vardef axeypart@#(text t)= for _i=t: if numeric _i: if var: if str @#="": draw _etiqy_.lft(tmp,taillegrad,tmp) else: draw _etiqy_@#(tmp,taillegrad,tmp) fi fi; - draw ((taillegrad,0)--(-taillegrad,0)) shifted _c(xO,_i) withpen pencircle scaled 0.8bp; + draw ((taillegrad,0)--(-taillegrad,0)) shifted _cart(xO,_i) withpen pencircle scaled 0.8bp; tmp:=_i; var:=true else: @@ -758,8 +849,8 @@ vardef axesunit= draw axes(0,0); draw axexpart(1); draw axeypart(1); - label.llft(LaTeX("$0$"),_c(0,0)); - % label.llft("0",_c(0,0)); + label.llft(LaTeX("$0$"),_cart(0,0)); + % label.llft("0",_cart(0,0)); ); $ enddef; @@ -773,22 +864,33 @@ vardef _ccoord(expr xA,yA)= (xA,yA) transformed _T enddef; +vardef _coord(expr xA,yA)= + (xA,yA) +enddef; + vardef _cobjet(expr obj)= obj transformed _T enddef; -vardef _c(text t)= +vardef _cart(text t)= if long_texte(t)=2: _ccoord(t) else: _cobjet(t) fi enddef; +vardef _c(text t)= + if long_texte(t)=2: _coord(t) + else: t + fi +enddef; + + vardef pol(expr r,theta)= - _c(r*cos(theta),r*sin(theta)) + (r*cos(theta),r*sin(theta)) enddef; vardef pold(expr r,theta)= - _c(r*cosd(theta),r*sind(theta)) + (r*cosd(theta),r*sind(theta)) enddef; color coulpoint,coullabel,coullabelfonc; @@ -799,15 +901,15 @@ vardef MarquePointFig(expr pp)= % compatibilité geometriesyr15 save $; picture $; if marque_p = "plein": - $:=image(fill fullcircle scaled taillepoint shifted pp withcolor coulpoint); + $:=image(oldfill fullcircle scaled taillepoint shifted _cart(pp) withcolor coulpoint); elseif marque_p = "creux": $:=image(% - fill fullcircle scaled taillepoint shifted pp withcolor background; - draw fullcircle scaled taillepoint shifted pp withcolor coulpoint); + oldfill fullcircle scaled taillepoint shifted _cart(pp) withcolor background; + olddraw fullcircle scaled taillepoint shifted _cart(pp) withcolor coulpoint); elseif marque_p = "croix": $:=image(% - draw ((-taillecroix,0)--(taillecroix,0)) shifted pp withcolor coulpoint; - draw ((0,-taillecroix)--(0,taillecroix)) shifted pp withcolor coulpoint) + olddraw ((-taillecroix,0)--(taillecroix,0)) shifted _cart(pp) withcolor coulpoint; + olddraw ((0,-taillecroix)--(0,taillecroix)) shifted _cart(pp) withcolor coulpoint) else: $:=nullpicture fi; $ @@ -850,12 +952,12 @@ vardef nommecourbe@#(suffix p)(text t)= picture dess; if long_texte(t)=1: dess:=image(ch:=_chaine(p); - A:=_c(t,fonccourbe.p(t)); + A:=(t,fonccourbe.p(t)); label@#(LaTeX("$" & ch & "$"),A) withcolor coullabelfonc) else: dess:=image(% for _a=t: - if numeric _a: A:=_c(_a,fonccourbe.p(_a)) + if numeric _a: A:=(_a,fonccourbe.p(_a)) else: if string _a: label@#(_a,A) else: label@#(_a scaled defaultscale,A) fi withcolor coullabelfonc fi; endfor) @@ -868,12 +970,15 @@ enddef; vardef nommeobj@#(text t)= save $; picture $; + if long_texte(t)=4: $:=nommeangle@#(t) + else: for i=t: if pair i: $:=nommepoint@#(t) else: $:=nommecourbe@#(t) fi; exitif true; endfor + fi; $ enddef; @@ -886,11 +991,11 @@ vardef vecteur@#(expr A)(text t)= pair m; string ch; $=image(% - if long_texte(t)=1: drawarrow A--A+t;ch:=_chaine(t);label@#(LaTeX("$\vect{" & ijmath(ch) & "}$"),A+t/2) + if long_texte(t)=1: drawarrow A--A+t;ch:=_chaine(t);label@#(LaTeX("$\vv{" & ijmath(ch) & "}$"),A+t/2) else: for u=t: if pair u: drawarrow A--A+u; m:=A+u/2 - else: if string u: if u<>"": label@#(LaTeX("$\vect{" & u & "}$"),m) fi else: label@#(u,m) fi + else: if string u: if u<>"": label@#(LaTeX("$\vv{" & u & "}$"),m) fi else: label@#(u,m) fi fi; endfor fi); @@ -902,7 +1007,7 @@ vardef marquepointcourbefig(suffix p)(text t)= picture $; $=image(% for i=t: - MarquePoint(_c(i,fonccourbe.p(i))); + MarquePoint((i,fonccourbe.p(i))); endfor); $ enddef; @@ -924,24 +1029,24 @@ def marquepointchemin= draw marquepointcheminfig enddef; vardef marquecheminouvertdroitefig(expr p)= halfcircle shifted (0,-0.5) scaled (2*taillepoint) - rotated (90+angle(direction infinity of p)) - shifted (point infinity of p) + rotated (90+angle(direction infinity of _cart(p))) + shifted (point infinity of _cart(p)) enddef; -def marquecheminouvertdroite= draw marquecheminouvertdroitefig enddef; +def marquecheminouvertdroite= olddraw marquecheminouvertdroitefig enddef; vardef marquecheminouvertgauchefig(expr p)= halfcircle shifted (0,-0.5) scaled (2*taillepoint) - rotated (-90+angle(direction 0 of p)) - shifted (point 0 of p) + rotated (-90+angle(direction 0 of _cart(p))) + shifted (point 0 of _cart(p)) enddef; -def marquecheminouvertgauche= draw marquecheminouvertgauchefig enddef; +def marquecheminouvertgauche= olddraw marquecheminouvertgauchefig enddef; -vardef marquecheminouvert(expr p)= - marquecheminouvertdroite(p); - marquecheminouvertgauche(p) +def marquecheminouvert(expr p) text t= + marquecheminouvertdroite(p) t; + marquecheminouvertgauche(p) t enddef; @@ -964,9 +1069,9 @@ vardef base(suffix a,b,c)= picture $; O:=_chaine(a); I:=_chaine(b); J:=_chaine(c); $:=image(% - draw vecteur.bot(_O,_c(1,0),ijmath(I)) withpen pencircle scaled 0.8 withcolor coulbase; - draw vecteur.lft(_O,_c(0,1),ijmath(J)) withpen pencircle scaled 0.8 withcolor coulbase; - nomme.llft(_O,LaTeX("$" & O & "$")) withcolor coulbase + draw vecteur.bot(_O_,(1,0),ijmath(I)) withpen pencircle scaled 0.8 withcolor coulbase; + draw vecteur.lft(_O_,(0,1),ijmath(J)) withpen pencircle scaled 0.8 withcolor coulbase; + nomme.llft(_O_,LaTeX("$" & O & "$")) withcolor coulbase ); $ enddef; @@ -978,7 +1083,7 @@ vardef basep(suffix a,b,c)= picture $; O:=_chaine(a); I:=_chaine(b); J:=_chaine(c); $:=image(% - nomme.llft(_O,LaTeX("$" & O & "$")) withcolor coulbase; + nomme.llft(_O_,LaTeX("$" & O & "$")) withcolor coulbase; draw axexpart(1,LaTeX("$" & I & "$")) withcolor coulbase; draw axeypart(1,LaTeX("$" & J & "$")) withcolor coulbase; ); @@ -990,7 +1095,7 @@ enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% numeric ep; color coul; - ep:= .2bp; %%%%%%%% épaisseur du trait + ep:= .3bp; %%%%%%%% épaisseur du trait coul := .7white; %%%%%%%% couleur du trait def quadstyle= enddef; @@ -999,12 +1104,12 @@ enddef; picture $; $=image(if quadx>0: for i=ceiling((QuadXmin-xO)/quadx) upto floor((QuadXmax-xO)/quadx): - draw _c(arrondimil(i*quadx)+xO,QuadYmin)--_c(arrondimil(i*quadx)+xO,QuadYmax) quadstyle withpen pencircle scaled ep withcolor coul; + olddraw _cart(arrondimil(i*quadx)+xO,QuadYmin)--_cart(arrondimil(i*quadx)+xO,QuadYmax) quadstyle withpen pencircle scaled ep withcolor coul; endfor; fi; if quady>0: for i=ceiling((QuadYmin-yO)/quady) upto floor((QuadYmax-yO)/quady): - draw _c(QuadXmin,arrondimil(i*quady)+yO)--_c(QuadXmax,arrondimil(i*quady)+yO) withpen pencircle scaled ep withcolor coul quadstyle; + olddraw _cart(QuadXmin,arrondimil(i*quady)+yO)--_cart(QuadXmax,arrondimil(i*quady)+yO) withpen pencircle scaled ep withcolor coul quadstyle; endfor; fi); $ @@ -1016,7 +1121,7 @@ enddef; $=image(if (quadx>0) and (quady>0): for i=ceiling(QuadXmin/quadx) upto floor(QuadXmax/quadx): for j=ceiling(QuadYmin/quady) upto floor(QuadYmax/quady): - draw (0,0) shifted _c(i*quadx,j*quady) withpen pencircle scaled 2; + olddraw (0,0) shifted _cart(i*quadx,j*quady) withpen pencircle scaled 2; endfor; endfor; fi); @@ -1033,24 +1138,24 @@ vardef papiermillimetre = picture $; $=image(% for i= ceiling(QuadXmin*Ux*10/cm) upto floor(QuadXmax*Ux*10/cm): - if i mod 5 <> 0: draw (i*cm/10,QuadYmin*Uy)--(i*cm/10,QuadYmax*Uy) withpen pencircle scaled pm_epa withcolor pm_coula fi; + if i mod 5 <> 0: olddraw (i*cm/10,QuadYmin*Uy)--(i*cm/10,QuadYmax*Uy) withpen pencircle scaled pm_epa withcolor pm_coula fi; endfor for i= ceiling(QuadYmin*Uy*10/cm) upto floor(QuadYmax*Uy*10/cm): - if i mod 5<> 0: draw (QuadXmin*Ux,i*cm/10)--(QuadXmax*Ux,i*cm/10) withpen pencircle scaled pm_epa withcolor pm_coula fi; + if i mod 5<> 0: olddraw (QuadXmin*Ux,i*cm/10)--(QuadXmax*Ux,i*cm/10) withpen pencircle scaled pm_epa withcolor pm_coula fi; endfor % for i= ceiling(QuadXmin*Ux/cm)*2+1 step 2 until floor(QuadXmax*Ux/cm)*2-1: - draw (i*cm/2,QuadYmin*Uy)--(i*cm/2,QuadYmax*Uy) withpen pencircle scaled pm_epb withcolor pm_coulb; + olddraw (i*cm/2,QuadYmin*Uy)--(i*cm/2,QuadYmax*Uy) withpen pencircle scaled pm_epb withcolor pm_coulb; endfor for i= ceiling(QuadYmin*Uy/cm)*2+1 step 2 until floor(QuadYmax*Uy/cm)*2-1: - draw (QuadXmin*Ux,i*cm/2)--(QuadXmax*Ux,i*cm/2) withpen pencircle scaled pm_epb withcolor pm_coulb; + olddraw (QuadXmin*Ux,i*cm/2)--(QuadXmax*Ux,i*cm/2) withpen pencircle scaled pm_epb withcolor pm_coulb; endfor % for i= ceiling(QuadXmin*Ux/cm) upto floor(QuadXmax*Ux/cm): - draw (i*cm,QuadYmin*Uy)--(i*cm,QuadYmax*Uy) withpen pencircle scaled pm_epc withcolor pm_coulc; + olddraw (i*cm,QuadYmin*Uy)--(i*cm,QuadYmax*Uy) withpen pencircle scaled pm_epc withcolor pm_coulc; endfor for i= ceiling(QuadYmin*Uy/cm) upto floor(QuadYmax*Uy/cm): - draw (QuadXmin*Ux,i*cm)--(QuadXmax*Ux,i*cm) withpen pencircle scaled pm_epc withcolor pm_coulc; + olddraw (QuadXmin*Ux,i*cm)--(QuadXmax*Ux,i*cm) withpen pencircle scaled pm_epc withcolor pm_coulc; endfor); $ enddef; @@ -1060,47 +1165,51 @@ enddef; %%%%%%%%%% FONCTIONS - COURBES %%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -vardef courbefonc(suffix f)(expr xmin, xmax, n) = %Courbe représentative d'une fonction +vardef courbef_(suffix f)(expr xmin, xmax, n) = %Courbe représentative d'une fonction save $,x; path $; - $=( _c(xmin,f(xmin)) + $=((xmin,f(xmin)) for i=1 upto n-1: - .._c(xmin+i*(xmax-xmin)/(n-1),f(xmin+i*(xmax-xmin)/(n-1))) + ..(xmin+i*(xmax-xmin)/(n-1),f(xmin+i*(xmax-xmin)/(n-1))) endfor ); $ enddef; -%%%%%%%%%% TEST %%%%%%%%%%%%% -vardef courbefonct@#(expr xmin, xmax, n) = %Courbe représentative d'une fonction - save $,x; - path $; - $=( _c(xmin,@#(xmin)) - for i=1 upto n-1: - .._c(xmin+i*(xmax-xmin)/(n-1),@#(xmin+i*(xmax-xmin)/(n-1))) - endfor ); - $ + +vardef courbefonc(suffix f)(text t)= + save cc;path cc; + save k,Val;numeric k,Val[]; + Val[1]:=Xmin;Val[2]:=Xmax;Val[3]:=60; + k:=1; + for i=t: + Val[k]:=i; + k:=k+1; + endfor + courbef_(f,Val[1],Val[2],Val[3]) enddef; -%%%%%%%%%% FINTEST %%%%%%%%%%%%% + + + vardef courbepoints(suffix f)(expr xmin, xmax, n) = %Points non reliés save $,x; picture $; - $=image(MarquePoint(_c(xmin,f(xmin))); + $=image(MarquePoint((xmin,f(xmin))); for i=1 upto n-1: - MarquePoint(_c(xmin+i*(xmax-xmin)/(n-1),f(xmin+i*(xmax-xmin)/(n-1)))); + MarquePoint((xmin+i*(xmax-xmin)/(n-1),f(xmin+i*(xmax-xmin)/(n-1)))); endfor ); $ enddef; vardef fonccourbe@#(expr x)= %Ordonnée du point de la courbe @# d'abscisse x (dans le repère utilisateur) - ypart ((pointcourbe@#(x)) transformed inverse _T) + ypart pointcourbe@#(x) enddef; vardef pointcourbe@#(expr x)= %Point de la courbe @# d'abscisse x dans le repère utilisateur save _P_,t; numeric t; pair _P_; - (t,whatever)=@# intersectiontimes (_c(x,2*Ymin-Ymax)--_c(x,2*Ymax-Ymin)); - if t=-1: _P_:=_c(x,0) + (t,whatever)=@# intersectiontimes ((x,2*Ymin-Ymax)--(x,2*Ymax-Ymin)); + if t=-1: _P_:=(x,0) else: _P_:=point t of @# fi; _P_ @@ -1111,10 +1220,10 @@ vardef der@#(expr x)= %Fonction dérivée path pp; pair v,w; pp:=@#; - (t,whatever) = pp intersectiontimes (_c(x,2*Ymin-Ymax)--_c(x,2*Ymax-Ymin)); + (t,whatever) = pp intersectiontimes ((x,2*Ymin-Ymax)--(x,2*Ymax-Ymin)); v:=direction t of pp; - w:=unitvector(v transformed inverse _T); - if xpart w = 0: d:=0 else: d:= (ypart w)/(xpart w) fi; +% w:=unitvector(v transformed inverse _T); + if xpart v = 0: d:=0 else: d:= (ypart v)/(xpart v) fi; d enddef; @@ -1134,13 +1243,13 @@ vardef intercourbes(suffix P)(expr p,q)= %renvoie les points d'intersections de enddef; vardef ptantecedents(suffix P)(expr y,p)= - intercourbes(P,_c(Xmin,y)--_c(Xmax,y),p) + intercourbes(P,(Xmin,y)--(Xmax,y),p) enddef; vardef antecedents(suffix P)(expr y,p)= pair PP[]; ptantecedents(PP,y,p); - for i=1 upto 10: P[i]:=xpart (PP[i] transformed inverse _T); endfor + for i=1 upto 10: P[i]:=xpart (PP[i]); endfor enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1160,13 +1269,13 @@ senstan.gauche=(1,0);senstan.droite=(0,1);senstan.double=(1,1); picture $; for n=tt: i:=incr i ; N[i]:=n; endfor; if i=1: N2:=longtan fi; - (t,whatever) = p intersectiontimes (_c(N1,Ymin)--_c(N1,Ymax)); + (t,whatever) = p intersectiontimes ((N1,Ymin)--(N1,Ymax)); M:=point t of p; _v:=N2*unitvector(direction t of p); $=image(% MarquePoint(M); - if (xpart senstan@#) <> 0: drawarrow M--M-_v*(xpart senstan@#) fi; - if (ypart senstan@#) <> 0: drawarrow M--M+_v*(ypart senstan@#) fi; + 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; ); $ enddef; @@ -1176,7 +1285,7 @@ vardef tangentedroite(expr p,a) = path $; numeric m,t; pair M; - (t,whatever) = p intersectiontimes (_c(a,Ymin)--_c(a,Ymax)); + (t,whatever) = p intersectiontimes ((a,Ymin)--(a,Ymax)); M:=point t of p; $=M-_diag*unitvector(direction t of p)--M+_diag*unitvector(direction t of p); $ @@ -1198,7 +1307,7 @@ vardef entrecourbes(expr p,q,xmin,xmax)= enddef; vardef souscourbe(expr p,xmin,xmax)= - buildcycle(droiteeqx(xmax),p,droiteeqx(xmin),_c(Xmin,0)--_c(Xmax,0)) + buildcycle(droiteeqx(xmax),p,droiteeqx(xmin),(Xmin,0)--(Xmax,0)) enddef; @@ -1209,9 +1318,9 @@ vardef rectangles@#(suffix p)(expr a,b,n)= %Riemann, renvoie un chemin fermé pas=(b-a)/n; _rect_ = for i=0 upto n-1: - _c(a+i*pas,yO)--_segmrect_@#(p,a+i*pas,pas)-- + (a+i*pas,yO)--_segmrect_@#(p,a+i*pas,pas)-- endfor - _c(b,yO)--cycle; + (b,yO)--cycle; _rect_ enddef; @@ -1224,8 +1333,8 @@ vardef _segmrect_@#(suffix p)(expr a,pas)= _sousp=subpath (xpart(p intersectiontimes droiteeqx(a)),xpart(p intersectiontimes droiteeqx(a+pas))) of p; if _typerect@#=1: llcorner _sousp -- lrcorner _sousp elseif _typerect@#=2: ulcorner _sousp -- urcorner _sousp - elseif _typerect@#=3: (pointcourbe.p(a))--(pointcourbe.p(a) shifted _c(pas,0)) - elseif _typerect@#=4: (pointcourbe.p(a+pas) shifted _c(-pas,0))--(pointcourbe.p(a+pas)) + elseif _typerect@#=3: (pointcourbe.p(a))--(pointcourbe.p(a) shifted (pas,0)) + elseif _typerect@#=4: (pointcourbe.p(a+pas) shifted (-pas,0))--(pointcourbe.p(a+pas)) fi enddef; @@ -1236,15 +1345,15 @@ vardef droiteeqred(expr a,b)= save $; path $; if (-(Ymax-Ymin)/(Xmax-Xmin)<a) and ((Ymax-Ymin)/(Xmax-Xmin)>a): - $:=_c(Xmin,a*Xmin+b)--_c(Xmax,a*Xmax+b); + $:=(Xmin,a*Xmin+b)--(Xmax,a*Xmax+b); else: - $:=_c(Ymin/a-b/a,Ymin)--_c(Ymax/a-b/a,Ymax); + $:=(Ymin/a-b/a,Ymin)--(Ymax/a-b/a,Ymax); fi; $ enddef; vardef droiteeqx(expr c)= - _c(c,2*Ymin-Ymax)--_c(c,2*Ymax-Ymin) + (c,2*Ymin-Ymax)--(c,2*Ymax-Ymin) enddef; vardef droiteeqcart(expr a,b,c)= @@ -1296,10 +1405,10 @@ vardef demiplaninf(expr d)= else: B:=point 0 of d; A:= point infinity of d fi; $=A-- - if ypart A>=ypart _c(Xmin,Ymax): _c(Xmin,Ymax)-- fi - if ypart A>ypart _c(Xmin,Ymin): _c(Xmin,Ymin)-- fi - if ypart B>ypart _c(Xmax,Ymin): _c(Xmax,Ymin)-- fi - if ypart B>=ypart _c(Xmax,Ymax): _c(Xmax,Ymax)-- fi + if ypart A>=ypart (Xmin,Ymax): (Xmin,Ymax)-- fi + if ypart A>ypart (Xmin,Ymin): (Xmin,Ymin)-- fi + if ypart B>ypart (Xmax,Ymin): (Xmax,Ymin)-- fi + if ypart B>=ypart (Xmax,Ymax): (Xmax,Ymax)-- fi B--cycle; $ enddef; @@ -1313,10 +1422,10 @@ vardef demiplansup(expr d)= else: B:=point 0 of d; A:= point infinity of d fi; $=A-- - if ypart A<=ypart _c(Xmin,Ymin): _c(Xmin,Ymin)-- fi - if ypart A<ypart _c(Xmin,Ymax): _c(Xmin,Ymax)-- fi - if ypart B<ypart _c(Xmax,Ymax): _c(Xmax,Ymax)-- fi - if ypart B<=ypart _c(Xmax,Ymin): _c(Xmax,Ymin)-- fi + if ypart A<=ypart (Xmin,Ymin): (Xmin,Ymin)-- fi + if ypart A<ypart (Xmin,Ymax): (Xmin,Ymax)-- fi + if ypart B<ypart (Xmax,Ymax): (Xmax,Ymax)-- fi + if ypart B<=ypart (Xmax,Ymin): (Xmax,Ymin)-- fi B--cycle; $ enddef; @@ -1325,11 +1434,11 @@ enddef; %%%%%%%%%% PROJECTIONS %%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% vardef projetex(expr A)= - _c(xpart (A transformed inverse _T),yO) + (xpart (A),yO) enddef; vardef projetey(expr A)= - _c(xO,ypart (A transformed inverse _T)) + (xO,ypart (A)) enddef; vardef projectionx@#(text t)= @@ -1369,8 +1478,8 @@ vardef projectionaxes(text t)= for i=t: if not numeric i: if pair i: _A:=i; - elseif n=1: if ypart _A > ypart _O: draw projectionx.bot(_A,i,-dd) else: draw projectionx.top(_A,i,dd) fi;n:=n+1 - else: if xpart _A > xpart _O: draw projectiony.lft(_A,i,-dd) else: draw projectiony.rt(_A,i,dd) fi;n:=n+1 + elseif n=1: if ypart _A > ypart _O_: draw projectionx.bot(_A,i,-dd) else: draw projectionx.top(_A,i,dd) fi;n:=n+1 + else: if xpart _A > xpart _O_: draw projectiony.lft(_A,i,-dd) else: draw projectiony.rt(_A,i,dd) fi;n:=n+1 fi; fi; endfor; @@ -1391,16 +1500,16 @@ enddef; vardef _suiterecfonc_(expr x)=0 enddef; numeric _suiterecdeb_, _suiterecfin_, _suiterecinit_; -vardef suiterec(suffix f)(expr deb,fin,init)= %escalier un+1=f(un), u_deb=init +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 save $,un; path $; numeric un; un=init; - $=_c(un,yO) + $=(un,yO) for i=deb upto fin-1: - --_c(un,f(un))--_c(f(un),f(un)) + --(un,f(un))--(f(un),f(un)) hide(un:=f(un)) endfor; $ @@ -1430,29 +1539,27 @@ vardef suiterecprojx@#(text t)= %projections et étiquettes sur axe x, utilis deb:=deb+1;un:=_suiterecfonc_(un) fi; for i=deb upto fin: - draw projectionx.@#(_c(un,un)); + draw projectionx.@#((un,un)); un:=_suiterecfonc_(un); endfor elseif nom="_val": if deb=_suiterecdeb_: -% label.@#(format("%10f",arrondi(10**_prec,un)),_c(un,yO)); draw etiquettex.@#(arrondi(10**_prec,un)); deb:=deb+1;un:=_suiterecfonc_(un) fi; for i=deb upto fin: -% draw projectionx.@#(_c(un,un),format("%10f",arrondi(10**_prec,un))); lab:=LaTeX("$\num{" & decimal(arrondi(10**_prec,un)) & "}$"); - draw projectionx.@#(_c(un,un),lab,-taillegrad); + draw projectionx.@#((un,un),lab,-taillegrad); un:=_suiterecfonc_(un); endfor else: if deb=_suiterecdeb_: - label.@#(LaTeX("$" & nom & "_{" & decimal(deb) & "}" & "$"),_c(un,yO)); + label.@#(LaTeX("$" & nom & "_{" & decimal(deb) & "}" & "$"),(un,yO)); deb:=deb+1;un:=_suiterecfonc_(un) fi; for i=deb upto fin: lab:=LaTeX("$" & nom & "_{" & decimal(i) & "}" & "$"); - draw projectionx.@#(_c(un,un),lab); + draw projectionx.@#((un,un),lab); un:=_suiterecfonc_(un); endfor fi); @@ -1483,7 +1590,7 @@ vardef suiterecprojy@#(text t)= %projections et étiquettes sur axe y, utilis deb:=deb+1; fi; for i=deb-1 upto fin-1: - draw projectiony.@#(_c(un,_suiterecfonc_(un))); + draw projectiony.@#((un,_suiterecfonc_(un))); un:=_suiterecfonc_(un); endfor elseif nom="_val": @@ -1492,7 +1599,7 @@ vardef suiterecprojy@#(text t)= %projections et étiquettes sur axe y, utilis fi; for i=deb-1 upto fin-1: lab:=LaTeX("$\num{" & decimal(arrondi(10**_prec,un)) & "}$"); - draw projectiony.@#(_c(un,_suiterecfonc_(un)),lab,-taillegrad); + draw projectiony.@#((un,_suiterecfonc_(un)),lab,-taillegrad); un:=_suiterecfonc_(un); endfor else: @@ -1501,7 +1608,7 @@ vardef suiterecprojy@#(text t)= %projections et étiquettes sur axe y, utilis fi; for i=deb-1 upto fin-1: lab:=LaTeX("$" & nom & "_{" & decimal(i+1) & "}" & "$"); - draw projectiony.@#(_c(un,_suiterecfonc_(un)),lab); + draw projectiony.@#((un,_suiterecfonc_(un)),lab); un:=_suiterecfonc_(un); endfor fi); @@ -1523,11 +1630,11 @@ enddef; %%%%%%%%%% INTERVALLES %%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% vardef bornex[](expr val)= - ((1mm,-2mm)--(0,-2mm)--(0,2mm)--(1mm,2mm)) if @<0: xscaled -1 fi shifted _c(val,xO) + ((1mm,-2mm)--(0,-2mm)--(0,2mm)--(1mm,2mm)) if @<0: xscaled -1 fi shifted _cart(val,xO) enddef; vardef borney[](expr val)= - ((2mm,1mm)--(2mm,0)--(-2mm,0)--(-2mm,1mm)) if @<0: yscaled -1 fi shifted _c(yO,val) + ((2mm,1mm)--(2mm,0)--(-2mm,0)--(-2mm,1mm)) if @<0: yscaled -1 fi shifted _cart(yO,val) enddef; pair sensborne.FF,sensborne.FO,sensborne.OF,sensborne.OO; @@ -1537,9 +1644,9 @@ vardef intervallex@#(expr vmin,vmax)= save $; picture $; $=image(% - draw _c(vmin,xO)--_c(vmax,xO) withpen pencircle scaled 2pt; - draw bornex[xpart sensborne@#](vmin) withpen pencircle scaled 2pt; - draw bornex[ypart sensborne@#](vmax) withpen pencircle scaled 2pt); + olddraw _cart(vmin,xO)--_cart(vmax,xO) withpen pencircle scaled 2pt; + olddraw bornex[xpart sensborne@#](vmin) withpen pencircle scaled 2pt; + olddraw bornex[ypart sensborne@#](vmax) withpen pencircle scaled 2pt); $ enddef; @@ -1547,9 +1654,9 @@ vardef intervalley@#(expr vmin,vmax)= save $; picture $; $=image(% - draw _c(yO,vmin)--_c(yO,vmax) withpen pencircle scaled 2pt; - draw borney[xpart sensborne@#](vmin) withpen pencircle scaled 2pt; - draw borney[ypart sensborne@#](vmax) withpen pencircle scaled 2pt); + olddraw _cart(yO,vmin)--_cart(yO,vmax) withpen pencircle scaled 2pt; + olddraw borney[xpart sensborne@#](vmin) withpen pencircle scaled 2pt; + olddraw borney[ypart sensborne@#](vmax) withpen pencircle scaled 2pt); $ enddef; @@ -1574,12 +1681,12 @@ vardef boitemoustache(text t)= if known _valeursboitemoustache_[6]: _decboitemoustache_:=_valeursboitemoustache_[6] fi; if known _valeursboitemoustache_[7]: _largboitemoustache_:=_valeursboitemoustache_[7] fi; $=image(% - fill fullcircle scaled 3 shifted _c(_valeursboitemoustache_[1],yO); - draw _c(_valeursboitemoustache_[1],yO)--_c(_valeursboitemoustache_[2],yO); - draw _c(_valeursboitemoustache_[2],yO) shifted (0,-_largboitemoustache_/2)--_c(_valeursboitemoustache_[2],yO) shifted (0,_largboitemoustache_/2)--_c(_valeursboitemoustache_[4],yO) shifted (0,_largboitemoustache_/2)--_c(_valeursboitemoustache_[4],yO) shifted (0,-_largboitemoustache_/2)--cycle; - draw _c(_valeursboitemoustache_[3],yO) shifted (0,-_largboitemoustache_/2)--_c(_valeursboitemoustache_[3],yO) shifted (0,_largboitemoustache_/2); - draw _c(_valeursboitemoustache_[4],yO)--_c(_valeursboitemoustache_[5],yO); - fill fullcircle scaled 3 shifted _c(_valeursboitemoustache_[5],yO)% + oldfill fullcircle scaled 3 shifted _cart(_valeursboitemoustache_[1],yO); + olddraw _cart(_valeursboitemoustache_[1],yO)--_cart(_valeursboitemoustache_[2],yO); + olddraw _cart(_valeursboitemoustache_[2],yO) shifted (0,-_largboitemoustache_/2)--_cart(_valeursboitemoustache_[2],yO) shifted (0,_largboitemoustache_/2)--_cart(_valeursboitemoustache_[4],yO) shifted (0,_largboitemoustache_/2)--_cart(_valeursboitemoustache_[4],yO) shifted (0,-_largboitemoustache_/2)--cycle; + olddraw _cart(_valeursboitemoustache_[3],yO) shifted (0,-_largboitemoustache_/2)--_cart(_valeursboitemoustache_[3],yO) shifted (0,_largboitemoustache_/2); + olddraw _cart(_valeursboitemoustache_[4],yO)--_cart(_valeursboitemoustache_[5],yO); + oldfill fullcircle scaled 3 shifted _cart(_valeursboitemoustache_[5],yO)% ) shifted (0,_decboitemoustache_); $ enddef; @@ -1615,15 +1722,232 @@ vardef projboitemoustache@#(text t)= $=image(% for i=1 upto 5: if (i=1) or (i=5): - A:=_c(_valeursboitemoustache_[i],yO) shifted(0,_decboitemoustache_) - else: A:=_c(_valeursboitemoustache_[i],yO) shifted(0,_decboitemoustache_-_largboitemoustache_/2) + A:=_cart(_valeursboitemoustache_[i],yO) shifted(0,_decboitemoustache_) + else: A:=_cart(_valeursboitemoustache_[i],yO) shifted(0,_decboitemoustache_-_largboitemoustache_/2) fi; - draw projectionx@#(A,_lab_[i]); + draw projectionx@#(A transformed inverse _T,_lab_[i]); endfor); $ enddef; +numeric diampointsbatons; +diampointsbatons:=5; + +vardef diagrammebatons(text t) = + save $; + picture $; + numeric tmp_taillepoint; + string tmp_marque_p; + tmp_taillepoint:=taillepoint; + tmp_marque_p := marque_p; + $=image(% + interim linecap:=butt; + marque_p:="plein"; + taillepoint:=diampointsbatons*0.5; + for i=t: + draw i--projetex(i); + MarquePoint(i); + endfor + ); + taillepoint:=tmp_taillepoint; + marque_p := tmp_marque_p; + $ +enddef; + + +numeric largbarres; +largbarres := 20; + +def barrei(expr p)= + (projetex(_cart(p)-0.5(largbarres,0))--(_cart(p)-0.5(largbarres,0))--(_cart(p)+0.5(largbarres,0))--projetex(_cart(p)+0.5(largbarres,0))) transformed inverse _T +enddef; + +vardef diagrammebarres(text t)= + save $; + path $; + $:= for i=t: barrei(i)-- endfor cycle; + $ +enddef; + + +vardef diagrammebinomiale(expr n,p)= + save $,Abin; + picture $; + pair Abin[]; + $:=scantokens("diagrammebatons("& + "(0," & decimal(binomiale(n,p,0)) & ")" & + for i=0 upto n: ",(" & decimal(i) & "," & decimal(binomiale(n,p,i)) & ")" & + endfor + ")"); + $ +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%% POLYGONES %%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +vardef polygone(text t)= + save poly; + path poly; + poly := + for i=t: + i-- + endfor + cycle; + poly +enddef; + +if not known typetrace: + vardef triangle(expr A,B,C)= + polygone(A,B,C) + enddef; +fi + +vardef parallelogramme(expr A,O,B)= + O--A--(A+B-O)--B--cycle +enddef; + +vardef polygoneregulier(expr A,B,n)= + save poly,centre; + path poly;pair centre; + _cart(B)-centre = (_cart(A)-centre) rotated (360/n); + poly:= _cart(A) + for i = 1 upto n-1: + -- (_cart(A) rotatedaround(centre,(i*360)/n)) + endfor + --cycle; + poly transformed inverse _T +enddef; + +vardef equilateral(expr A,B)= + polygoneregulier(A,B,3) +enddef; + +vardef carre(expr A,B)= + polygoneregulier(A,B,4) +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%% CERCLES ET ARCS %%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +vardef arccercle(expr A,O,B)= + path tmp,arc; + tmp:=fullcircle scaled (2*(abs(_cart(A)-_cart(O)))) rotated angle(_cart(A)-_cart(O)) shifted _cart(O); + if angle(_cart(B)-_cart(O))>angle(_cart(A)-_cart(O)): + arc:=subpath(0,(angle(_cart(B)-_cart(O))-angle(_cart(A)-_cart(O)))*(length tmp)/360) of tmp; + else: + arc:=subpath(0,(360-(angle(_cart(A)-_cart(O))-angle(_cart(B)-_cart(O))))*(length tmp)/360) of tmp; + fi + arc transformed inverse _T +enddef; + +vardef cerclecr(expr O,r)= + fullcircle scaled (2*r*Ux) shifted _cart(O) transformed inverse _T +enddef; + +vardef cerclecp(expr O,A)= + fullcircle scaled (2*abs(_cart(A)-_cart(O))) shifted _cart(O) transformed inverse _T +enddef; + +vardef cerclecir(expr A,B,C)= + save O;pair O; + _cart(O)-0.5[_cart(A),_cart(B)]=whatever * (_cart(B)-_cart(A)) rotated 90; + _cart(O)-0.5[_cart(A),_cart(C)]=whatever * (_cart(C)-_cart(A)) rotated 90; + cerclecp(O,A) +enddef; + +vardef cercle(text t)= + save $;path $; + save r;boolean r; + r:=false; + if long_texte(t)=3: + $:=cerclecir(t) + else: + for i=t: + if numeric i: r:=true fi; + endfor + if r: $:=cerclecr(t) else: $:=cerclecp(t) fi; + fi; + $ +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%% MARQUES ANGLES, SEGMENTS... %%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +taille_marque_a:=0.4cm; +sep_marque_a:=1.5; + + +vardef arc_marqueangle(expr A,O,B,t)= + arccercle((_cart(O)+t*unitvector(_cart(A)-_cart(O))) transformed inverse _T,O,(_cart(O)+t*unitvector(_cart(B)-_cart(O))) transformed inverse _T) +enddef; + +vardef marqueanglegeo(expr A,O,B,n)= + O--arc_marqueangle(A,O,B,taille_marque_a-(n-1)*sep_marque_a/2) + for i=1 upto n-1: + --reverse arc_marqueangle(A,O,B,taille_marque_a-(n-1)*sep_marque_a/2+(i-1)*sep_marque_a)-- + arc_marqueangle(A,O,B,taille_marque_a-(n-1)*sep_marque_a/2+i*sep_marque_a) + endfor + --cycle +enddef; + + +vardef marqueangleor(expr A,O,B)= + arc_marqueangle(A,O,B,taille_marque_a) +enddef; + +vardef marqueangle(text t)= + if long_texte(t)=4: marqueanglegeo(t) + else: marqueangleor(t) + fi +enddef; + +vardef nommeangle@#(expr A,O,B,p)= + save P,a;pair P;path a; + a:=arc_marqueangle(A,O,B,taille_marque_a); + P:= point (arctime 0.5*arclength a of a) of a; + if string p: thelabel@#(p,P) + else: thelabel@#(p scaled defaultscale,P) + fi +enddef; + + + +taille_marque_ad:=0.3cm; + +vardef marqueangledroit(expr A,O,B)= + parallelogramme((_cart(O)+taille_marque_ad*unitvector(_cart(A)-_cart(O))) transformed inverse _T,O,(_cart(O)+taille_marque_ad*unitvector(_cart(B)-_cart(O))) transformed inverse _T) +enddef; + +taille_marque_s:=0.3cm; +angle_marque_s:=60; +sep_marque_s:=2; + +vardef milieu(expr A,B)= + 0.5[A,B] +enddef; + +vardef marqueunique_s(expr A,B)= + ((-taille_marque_s*unitvector(_cart(A)-_cart(B))/2)--(taille_marque_s*unitvector(_cart(A)-_cart(B))/2)) rotated angle_marque_s +enddef; + +vardef marquesegment(expr A,B,n)= + save $; + picture $; + $=image( + for i=1 upto n: + draw marqueunique_s(A,B) shifted ((i-1-(n-1)/2)*sep_marque_s*unitvector(_cart(B)-_cart(A))) transformed inverse _T; + endfor + ); + $ shifted milieu(_cart(A),_cart(B)) +enddef; + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%% FONCTIONS USUELLES %%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1677,13 +2001,13 @@ enddef; vardef repbriques(expr larg,haut,dec)= numeric d;d=0; image(% - for j=0 upto _hautcadre/haut: - draw ((0,0)--(_largcadre,0)) shifted (0,j*haut); + for j=0 upto _hautcadre_/haut: + olddraw ((0,0)--(_largcadre_,0)) shifted (0,j*haut); d:=d+dec;if d>larg: d:=d-larg fi; - for i=0 upto _largcadre/larg: - draw ((0,0)--(0,haut)) shifted (i*larg+d,j*haut); + for i=0 upto _largcadre_/larg: + olddraw ((0,0)--(0,haut)) shifted (i*larg+d,j*haut); endfor; - endfor) shifted llcorner cadre + endfor) shifted llcorner _cart(cadre) enddef; @@ -1700,9 +2024,9 @@ enddef; vardef rephachures(expr pas,angle)= image(% - for i=floor(-_diag/(2*pas)) upto ceiling(_diag/(2*pas)): - draw ((-_diag/2,0)--(_diag/2,0)) shifted (0,i*pas); - endfor) rotated angle shifted center cadre + for i=floor(-_diag_/(2*pas)) upto ceiling(_diag_/(2*pas)): + olddraw ((-_diag_/2,0)--(_diag_/2,0)) shifted (0,i*pas); + endfor) rotated angle shifted center _cart(cadre) enddef; numeric pervagues,ampvagues,decvagues; @@ -1719,11 +2043,11 @@ enddef; vardef repvagues(expr per,amp,dec)= %D'après le manuel de l'utilisateur de MetaPost image(% - for j=0 upto _hautcadre/dec: - for i=0 upto _largcadre/amp: - draw ((0,0){curl 0}..(per/4,-amp)..(per/2,0){curl 0}..(3*per/4,amp)..(per,0){curl 0}) shifted (i*per,j*dec); + for j=0 upto _hautcadre_/dec: + for i=0 upto _largcadre_/amp: + olddraw ((0,0){curl 0}..(per/4,-amp)..(per/2,0){curl 0}..(3*per/4,amp)..(per,0){curl 0}) shifted (i*per,j*dec); endfor; - endfor) shifted llcorner cadre + endfor) shifted llcorner _cart(cadre) enddef; @@ -1732,7 +2056,7 @@ primarydef p avec c = save _des_; picture _des_; _des_:=c; - clip _des_ to p; + clip _des_ to (p transformed _T); _des_ endgroup enddef; @@ -1749,12 +2073,7 @@ numeric n_packages; n_packages:=0; def LaTeX_AjoutPackage(expr t)= - if known latexmp_module: latexmp_packages:=latexmp_packages & "," & t - else: - n_packages:=n_packages+1; - LaTeX_packages[n_packages]:=t - fi enddef; def LaTeX_AjoutCommande(expr t)= @@ -1777,67 +2096,29 @@ def LaTeXsetup = latexmp_inputenc:=LaTeX_inputenc; if latexmp_inputenc="": latexmp_inputenc:="utf8" fi; if latexmp_packages="": latexmp_packages:="fourier" fi; - latexmp_packages:=latexmp_packages & ",textcomp,mathtools,mathrsfs,esvect[e],siunitx[output-decimal-marker={,}],babel[frenchb]"; + latexmp_packages:=latexmp_packages & ",textcomp,mathtools,mathrsfs,esvect[e],siunitx[output-decimal-marker={,}],babel[french]"; latexmp_preamble:=latexmp_preamble & "\newcommand{\vect}[1]{\vv{#1}}" & "\newcommand{\calc}{\mathscr{C}}" & "\newcommand{\calp}{\mathscr{P}}" & "\DecimalMathComma" ; fi enddef; -vardef LaTeX primary sc = %D'après TEX.mp - if known latexmp_module: LaTeXsetup; textext(sc) scaled defaultscale - else: - save n_p; - numeric n_p; - write "verbatimtex" to "mptextmp.mp"; - write "%&latex" to "mptextmp.mp"; - write "\documentclass[10pt]{article}" to "mptextmp.mp"; - if LaTeX_inputenc="": - write "\usepackage[utf8]{inputenc}" to "mptextmp.mp" - else: - write "\usepackage[" & LaTeX_inputenc &"]{inputenc}" to "mptextmp.mp" - fi; - write "\usepackage[T1]{fontenc}" to "mptextmp.mp"; - if known LaTeX_packages[1]: - n_p:=1; - forever: exitunless known LaTeX_packages[n_p]; - write "\usepackage{" & LaTeX_packages[n_p] &"}" to "mptextmp.mp"; - n_p:=n_p+1; - endfor - else: - write "\usepackage{fourier}" to "mptextmp.mp" - fi; - write "\usepackage{amsmath}" to "mptextmp.mp"; - write "\usepackage{mathrsfs}" to "mptextmp.mp"; - write "\usepackage[e]{esvect}" to "mptextmp.mp"; - write "\usepackage[output-decimal-marker={,}]{siunitx}" to "mptextmp.mp"; - write "\usepackage[frenchb]{babel}" to "mptextmp.mp"; - write LaTeX_preamble to "mptextmp.mp"; - write "\newcommand{\vect}[1]{\vv{#1}}" to "mptextmp.mp"; - write "\newcommand{\calc}{\mathscr{C}}" to "mptextmp.mp"; - write "\newcommand{\calp}{\mathscr{P}}" to "mptextmp.mp"; - write "\begin{document}" to "mptextmp.mp"; - write "etex" to "mptextmp.mp"; - write "btex "& sc &" etex" to "mptextmp.mp"; - write EOF to "mptextmp.mp"; - scantokens "input mptextmp" scaled defaultscale +vardef LaTeX primary sc = + if known mplib: textext(sc) scaled defaultscale + else: LaTeXsetup; textext(sc) scaled defaultscale fi enddef; +%vardef LaTeX primary sc = +% LaTeXsetup; textext(sc) scaled defaultscale +%enddef; %%%%%%%%%%%%%%%Figure intermédiaire%%%%%%%%%%%%%%%%%%% def figureinter= - clip currentpicture to cadre; + clip currentpicture to (cadre transformed _T); shipit; _nfig:=_nfig+1; charcode:=charcode+1; enddef; -vardef arrowhead expr p = %redéfinition flèches - save q,e; path q; pair e; - e = point length p of p; - q = gobble(p shifted -e cutafter makepath(pencircle scaled 2ahlength)) - cuttings; - (q rotated .5ahangle & reverse q rotated -.5ahangle -- 0.5*(point 0 of q)-- cycle) shifted e -enddef; def epaisseur=withpen pencircle scaled enddef; def couleur=withcolor enddef; @@ -1865,6 +2146,8 @@ vardef _chaine(suffix s)= %met les termes en indice si le 2e est un chiffre enddef; +%%%%%%%%%%%%%%% MATHS %%%%%%%%%%%%%%%%% + vardef arrondi(expr p,x)= %arrondi de x au p-ième round((x-floor(x))*p)/p+floor(x) enddef; @@ -1886,6 +2169,44 @@ vardef pgcd(expr a,b)= b_ enddef; +vardef factorielle(expr n)= % Calcul de n! + save $; + numeric $; + $:= 1 for i=1 upto n: * i endfor; + $ +enddef; + +vardef binom(expr n,k)= % calcul du coefficient binomial k parmi n + save $,p; + numeric $,p; + p:= min(k,n-k); + $:=1; + for i=1 upto p: + $:= ($*(n-i+1))/i; + endfor + $ +enddef; + +vardef binomiale(expr n,p,k)= + save $,ktmp,ptmp; + numeric $,ktmp,ptmp; + if k>n-k: + ktmp:=n-k; + ptmp:=1-p + else: + ktmp:=k; + ptmp:=p + fi; + $:=1; + for i=1 upto ktmp: + $:=((n-i+1)/i)*ptmp*$; + endfor + for i=1 upto n-ktmp: + $:=$*(1-ptmp); + endfor + $ +enddef; + %%%%%%%%%%%%%%% COULEURS %%%%%%%%%%%%%%%%%%% cmykcolor Rouge,Vert,Bleu,Marron,Lime,Orange,Rose,Pourpre,Violet,Cyan,Magenta,Jaune,Olive,Noir,Grisfonce,Gris,Grisclair,Blanc,Beige,Marine,Moutarde,Vertfonce; |