From 67fdef123d0cd393e03d0e6a37e2a427e064d47e Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Tue, 11 Jun 2019 21:01:20 +0000 Subject: repere (11jun19) git-svn-id: svn://tug.org/texlive/trunk@51363 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/metapost/repere/README.md | 2 +- .../texmf-dist/doc/metapost/repere/repere-doc.pdf | Bin 456296 -> 479044 bytes .../texmf-dist/doc/metapost/repere/repere-doc.tex | 89 +++++++++-- Master/texmf-dist/metapost/repere/repere.mp | 165 ++++++++++++++++++--- 4 files changed, 224 insertions(+), 32 deletions(-) (limited to 'Master/texmf-dist') diff --git a/Master/texmf-dist/doc/metapost/repere/README.md b/Master/texmf-dist/doc/metapost/repere/README.md index 51ec41481bc..9759657f6ae 100644 --- a/Master/texmf-dist/doc/metapost/repere/README.md +++ b/Master/texmf-dist/doc/metapost/repere/README.md @@ -1,4 +1,4 @@ -Package repere - Version 17.11.2 - November 12, 2017 +Package repere - Version 19.06 - June 11, 2019 This package provides MetaPost macros for drawing sec­ondary school math­e­mat­ics figures in a coordinate system : - axis, grids diff --git a/Master/texmf-dist/doc/metapost/repere/repere-doc.pdf b/Master/texmf-dist/doc/metapost/repere/repere-doc.pdf index ab144948041..2ba3e22bec9 100644 Binary files a/Master/texmf-dist/doc/metapost/repere/repere-doc.pdf and b/Master/texmf-dist/doc/metapost/repere/repere-doc.pdf differ diff --git a/Master/texmf-dist/doc/metapost/repere/repere-doc.tex b/Master/texmf-dist/doc/metapost/repere/repere-doc.tex index f2e4d1f9397..b13edafcd68 100644 --- a/Master/texmf-dist/doc/metapost/repere/repere-doc.tex +++ b/Master/texmf-dist/doc/metapost/repere/repere-doc.tex @@ -3,10 +3,10 @@ %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 -% (pdf)latex repere-doc.tex +% pdflatex repere-doc.tex +% mptopdf repere-doc.mp +% mptopdf repere-doc.mp +% pdflatex repere-doc.tex \usepackage{calc,ifthen} @@ -149,6 +149,7 @@ \IfFileExists{\jobname.\thenumfig}% {\begin{minipage}[c]{\largeurfig} \centering \includegraphics{\jobname.\thenumfig}\par +% \centering a\includegraphics{reperedocfig2.mps}a\par \end{minipage}}{} \par} @@ -239,6 +240,7 @@ \begin{codecache} +%outputtemplate := "%j-%c.mps"; input geometriesyr16; input repere; \end{codecache} @@ -592,7 +594,7 @@ Les macros suivantes sont directement inspirées des macros similaires de \verb+ \item[pointe(A,B,C...)] permet de marquer plusieurs points. -\item[nomme.pos(A,nom)] marque le point et affiche son nom à la position \verb+pos+. \verb+nom+ peut être soit une chaîne de caractères, soit une expression du type \verb+btex ... etex+, soit une autre figure. Si \verb+nom+ est omis, le nom \verb+A+ est affiché. S'il s'agit d'un élément d'un tableau de points (\verb+A1+, \verb+A2+...), le nombre est affiché en indice. +\item[nomme.pos(A,nom)] marque le point et affiche son nom à la position \verb+pos+ (qui peut être \verb|rt|, \verb|urt|, \verb|top|, \verb|ulft|...). \verb+nom+ peut être soit une chaîne de caractères, soit une expression du type \verb+btex ... etex+, soit une autre figure. Si \verb+nom+ est omis, le nom \verb+A+ est affiché. S'il s'agit d'un élément d'un tableau de points (\verb+A1+, \verb+A2+...), le nombre est affiché en indice. \end{description} @@ -618,7 +620,23 @@ draw cadre; fin; \end{exemple} +\begin{description} +\item[nomme{[a]}(A,nom)] Il est possible d'obtenir un placement plus fin des étiquettes en remplaçant la position au sens de \MP{} (\verb|rt|, \verb|urt|...) par un nombre qui représente alors la position de l'étiquette par rapport au point en degrés. +\end{description} +\begin{exemple}[0.55] +repere(-3,3.5,1cm,-3,3,1cm); + pair A,B,C[]; + A=(-2,-1);B=(1,-2); + nomme[40](A);nomme[70](A);nomme[100](A); + nomme[-110](B); + for i=0 upto 8: + C[i]:= (1+1.5*cosd(40i),1+1.5*sind(40i)); + nomme[40*i](C[i]) couleur pourpre; + endfor +draw cadre; +fin; +\end{exemple} \subsection{Vecteurs} @@ -680,6 +698,28 @@ draw droite(2,3,-1) withcolor vertfonce; %2x+3y-1=0 fin; \end{exemple} +\subsection{Demi-droites} +\begin{description} +\item[demidroite(A,B)] demi-droite $[AB)$. + +\item[demidroite(A,a)] demi-droite d'origine $A$ qui fait un angle $a$ avec la direction $(Ox)$. +\end{description} + + +\begin{exemple} +repere(-4,4,0.9cm,-3,4,0.9cm); +pair A,B,C; +numeric a; +A=(-1,1);B=(2,2);C=(-1,-2); +draw axes(1,0); +draw demidroite(A,B); +nomme.llft(A);nomme.lrt(B); +draw demidroite(C,0) dashed evenly; +draw demidroite(C,120); +nomme.llft(C); +fin; +\end{exemple} + \subsection{Courbes et fonctions} \MP{} permet de définir simplement des fonctions (en utilisant par exemple la syntaxe suivante : \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. @@ -973,6 +1013,30 @@ endfor fin; \end{exemple} +\begin{description} +\item[spline(A,,B,,C,...)()] Courbe passant par les points $A$, $B$, $C$ représentant une fonction cubique par morceaux telle que $f(x_A)=y_A$, $f(x_B)=y_B$... et, le cas échéant, $f'(x_A)=y'_A$, $f'(x_B)=y'_B$... sur l'intervalle définissant le repère. +\item[spline(A,,B,,C,...)(xmin,xmax)] Même courbe que précédemment mais sur l'intervalle $[xmin;xmax]$. +\end{description} + +\begin{exemple}[0.55] +repere.orth(-1,10,7cm,-1,10); +pair A,B,C,D; +A=(0,1);B=(3,7);C=(6,2);D=(9,6); +path S,T; +S=spline(A,B,C,D)(); +T=spline(A,0.5,B,C,0,D,-2)(); +draw quadrillage(1,1); +draw axes(1,1); +draw S epaisseur 1 couleur bleu; +draw T epaisseur 1 couleur rouge; +draw tangente.double(T,0) couleur rouge; +draw tangente.double(T,6) couleur rouge; +draw tangente.double(T,9) couleur rouge; +nomme.lrt(A);nomme.top(B); +nomme.llft(C);nomme.rt(D); +fin; +\end{exemple} + \section{Suites} \begin{description} @@ -1442,13 +1506,19 @@ fin; \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|. +\item[taille\_marque\_a] Valeur numérique (qui vaut par défaut \verb|0.4cm|) donnant le rayon des arcs de cercles servant à marquer les angles. + +\item[sep\_marque\_a] Valeur numérique (qui vaut par défaut \verb|1.5bp|) donnant la différence de rayon entre les différents arcs servant à marquer les angles. + +\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| permettant de marquer l'angle géométrique $\widehat{AOB}$. Les arcs (si \verb|n| est supérieur à 1) sont séparés de \verb|sep_marque_a|. 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|. +\item[nomme.pos(A,O,B,texte)] Place le texte à la position \verb|pos| par rapport au point central de l'arc de cercle de centre $O$ et de rayon \verb|taille_marque_a|. \verb|pos| peut être \verb|rt|, \verb|urt|, \verb|top|, etc. ou un angle donné par rapport à la direction $(Ox)$. + +\item[nomme(A,O,B,texte)] Même chose que précédemment mais la position est calculée automatiquement en fonction de l'angle. \end{description} @@ -1464,7 +1534,8 @@ 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,"\ang{45}"); +nomme[20](B,A,C,"\ang{45}"); +nomme(C,B,A,"$\alpha$"); fin; \end{exemple} @@ -1491,7 +1562,7 @@ 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}% +\end{exemple} \section{Divers} \subsection{Composition des étiquettes} diff --git a/Master/texmf-dist/metapost/repere/repere.mp b/Master/texmf-dist/metapost/repere/repere.mp index 2c568e3884c..02595f91aa8 100644 --- a/Master/texmf-dist/metapost/repere/repere.mp +++ b/Master/texmf-dist/metapost/repere/repere.mp @@ -2,7 +2,7 @@ %% repere.mp %% %% Macros pour la construction de figures dans un repère %% %% o.peault@posteo.net %% -%% Version 17.11.2 (Novembre 2017) %% +%% Version 19.06 (Juin 2019) %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % This work may be distributed and/or modified under the conditions of @@ -12,6 +12,10 @@ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Mars 2019 : changement spline +% Juin 2019 : demi-droites, nomme[] +% À faire : extratextx, extratexty + input format; if not known mplib: input latexmp fi; @@ -965,21 +969,50 @@ vardef pointe(text t) = %geometriesyr15 for p_ = t: if pair p_: MarquePoint(p_); fi endfor; enddef; +% Juin 2019 : placement fin des étiquettes (angle donné) +vardef thelabelang@#(expr s,z)= + save tmpang,tmpfig,tmppt,tmppath,tmpstr; + string tmpstr; + numeric tmpang; + pair tmppt; + path tmppath; + save p; picture p; + tmpstr := str @#; + if picture s: p=s + else: p = LaTeX(s) + fi; + tmppath := llcorner p -- lrcorner p -- urcorner p -- ulcorner p -- cycle; + if ASCII tmpstr = 91: + tmpang := scantokens substring(1,length(tmpstr)-1) of tmpstr + else: + tmpang := scantokens tmpstr + fi; + tmppt := tmppath intersectionpoint (0.5urcorner p-- (0.5urcorner p + 100 * (dir (180+tmpang)))); + p shifted (-tmppt + _cart(z) + labeloffset*(cosd(tmpang),sind(tmpang)) ) +enddef; + +def labelang = draw thelabelang enddef; + vardef nommepoint@#(text t)= save $,ch,dess,latch; pair $; string ch,latch; picture dess; + if (ASCII str @# < 58) or (ASCII str @# = 91): + def mylabel = labelang enddef + else: + def mylabel = label enddef + fi; if long_texte(t)=1: dess:=image(draw MarquePointFig(t); ch:=_chaine(t); - label@#("$" & ch & "$",t) withcolor coullabel) + mylabel@#("$" & ch & "$",t) withcolor coullabel) else: dess:=image(% for PP=t: if pair PP: MarquePoint(PP); $:=PP - else: if string PP: label@#(PP,$) else: label@#(PP scaled defaultscale,$) fi withcolor coullabel + else: if string PP: mylabel@#(PP,$) else: mylabel@#(PP scaled defaultscale,$) fi withcolor coullabel fi; endfor) fi; @@ -987,6 +1020,8 @@ vardef nommepoint@#(text t)= enddef; + + vardef nommecourbe@#(suffix p)(text t)= save A,ch,dess; pair A; @@ -1043,7 +1078,7 @@ tertiarydef A estmieuxplace B = elseif prefnomme="left": xpart A < xpart B elseif prefnomme="top": ypart A > ypart B elseif prefnomme="bottom": ypart A < ypart B - elseif hide(errmessage "string 'prefnomme' should be set to left, right, top or bottom") + else: hide(errmessage "string 'prefnomme' should be set to left, right, top or bottom") fi enddef; @@ -1053,6 +1088,7 @@ vardef pointnommetime(expr p)= pair Pt,P[]; numeric nbint,pp,T[]; intercourbestimes(T)(cadre,p); + show T[1]; Pt:=_O;pp:=0; if known T[1]: Pt:= point T[1] of p; @@ -1103,22 +1139,39 @@ vardef nommeautoobjsuf(suffix p)= nommeautoobjtex(p,"$" & _chaine(p) & "$") enddef; +vardef estcadree primary f = + show llcorner f; show llcorner cadre transformed _T; + show urcorner f; show urcorner cadre; + (xpart urcorner f <= xpart urcorner (cadre transformed _T)) + and (ypart urcorner f <= ypart urcorner (cadre transformed _T)) + and (xpart llcorner f >= xpart llcorner (cadre transformed _T)) + and (ypart llcorner f >= ypart llcorner (cadre transformed _T)) +enddef; + % Avec label donné vardef nommeautoobjtex(expr p,leg)= - save ptA,pos,ttmp; + save ptA,pos,ttmp,tmpfig; pair ptA; + picture tmpfig; numeric ttmp; string pos; ttmp:=pointnommetime(p); ptA:= point ttmp of p; pos:=position(ptA,ttmp,p); - if string leg: - scantokens("thelabel." & pos)(leg,ptA) - else: - scantokens("thelabel." & pos)(leg scaled defaultscale,ptA) - fi + for i=0 upto 120: + tmpfig := + if string leg: + scantokens("thelabel." & pos)(leg,ptA) + else: + scantokens("thelabel." & pos)(leg scaled defaultscale,ptA) + fi; + exitif estcadree tmpfig; + ptA := point (ttmp + ((-1)**(i+1))*round((i+1)/2)*length(p)/60) of p; + endfor + tmpfig enddef; + vardef nommeautoobj(text t)= if long_texte(t)=1: nommeautoobjsuf(t) else: nommeautoobjtex(t) @@ -1420,6 +1473,7 @@ vardef intercourbestimes(suffix T)(expr p,q)= %renvoie le "time" de q des points pp:=subpath(xpart(pp intersectiontimes q)+0.01,length pp) of pp; %0.01(?!) pour que le point trouvé ne soit pas dans le sous-chemin... i:=i+1; + exitif i=10; endfor; enddef; @@ -1620,28 +1674,67 @@ vardef splineder(text t)(text q)= enddef; -% Novembre 2017 +%% Novembre 2017 +%vardef deriveesplinecubique(suffix k)(suffix xs,ys)(expr n)= +%% renvoie les dérivées pour interpolation avec splines cubiques +%% source : https://en.wikipedia.org/wiki/Spline_interpolation +%% xs[] et ys[] sont des listes, n est le nombre de valeurs +%% Renvoie les dérivées dans la liste k[] +% (2k[0] + k[1])/(xs[1] - xs[0]) = 3(ys[1]-ys[0])/((xs[1]-xs[0])**2); +% for i=1 upto n-1: +% k[i-1]/(xs[i] - xs[i-1]) + 2k[i]/(xs[i] - xs[i-1]) + 2k[i]/(xs[i+1] - xs[i]) + k[i+1]/(xs[i+1] - xs[i]) = 3(ys[i] - ys[i-1])/((xs[i]-xs[i-1])**2) + 3(ys[i+1] - ys[i])/((xs[i+1]-xs[i])**2); +% endfor +% (k[n-1] + 2k[n])/(xs[n]-xs[n-1]) = 3(ys[n]-ys[n-1])/((xs[n]-xs[n-1])**2); +%enddef; + +%Mars 2019 vardef deriveesplinecubique(suffix k)(suffix xs,ys)(expr n)= % renvoie les dérivées pour interpolation avec splines cubiques % source : https://en.wikipedia.org/wiki/Spline_interpolation % xs[] et ys[] sont des listes, n est le nombre de valeurs % Renvoie les dérivées dans la liste k[] - (2k[0] + k[1])/(xs[1] - xs[0]) = 3(ys[1]-ys[0])/((xs[1]-xs[0])**2); + if not derex[0]: + (2k[0] + k[1])/(xs[1] - xs[0]) = 3(ys[1]-ys[0])/((xs[1]-xs[0])**2) + fi; for i=1 upto n-1: - k[i-1]/(xs[i] - xs[i-1]) + 2k[i]/(xs[i] - xs[i-1]) + 2k[i]/(xs[i+1] - xs[i]) + k[i+1]/(xs[i+1] - xs[i]) = 3(ys[i] - ys[i-1])/((xs[i]-xs[i-1])**2) + 3(ys[i+1] - ys[i])/((xs[i+1]-xs[i])**2); + if not derex[i]: + k[i-1]/(xs[i] - xs[i-1]) + 2k[i]/(xs[i] - xs[i-1]) + 2k[i]/(xs[i+1] - xs[i]) + k[i+1]/(xs[i+1] - xs[i]) = 3(ys[i] - ys[i-1])/((xs[i]-xs[i-1])**2) + 3(ys[i+1] - ys[i])/((xs[i+1]-xs[i])**2) + fi; endfor - (k[n-1] + 2k[n])/(xs[n]-xs[n-1]) = 3(ys[n]-ys[n-1])/((xs[n]-xs[n-1])**2); + if not derex[n]: + (k[n-1] + 2k[n])/(xs[n]-xs[n-1]) = 3(ys[n]-ys[n-1])/((xs[n]-xs[n-1])**2) + fi; enddef; -% Novembre 2017 +%% Novembre 2017 +%vardef splineinterpolfonct_pt(text t)(expr x)= +%% t est la liste des points A,B,C... +% save xa,ya,dd,n; +% numeric xa[],ya[],dd[],n; +% n:=-1; +% for i=t: +% n := n + 1; +% xa[n] := xpart i; ya[n] := ypart i; +% endfor +% deriveesplinecubique(dd)(xa,ya)(n); +% splinederfonct((xa[0],ya[0],dd[0]) for ii=1 upto n: , (xa[ii],ya[ii],dd[ii]) endfor)(x) +%enddef; + +% Mars 2019 vardef splineinterpolfonct_pt(text t)(expr x)= -% t est la liste des points A,B,C... - save xa,ya,dd,n; +% t est la liste A,[y'1,]B,[y'2,]C,[y'3,]... + save xa,ya,dd,n,derex; numeric xa[],ya[],dd[],n; + boolean derex[]; n:=-1; for i=t: - n := n + 1; - xa[n] := xpart i; ya[n] := ypart i; + if numeric i: + dd[n]:=i;derex[n]:=true; + else: + n := n + 1; + derex[n]:=false; + xa[n] := xpart i; ya[n] := ypart i + fi; endfor deriveesplinecubique(dd)(xa,ya)(n); splinederfonct((xa[0],ya[0],dd[0]) for ii=1 upto n: , (xa[ii],ya[ii],dd[ii]) endfor)(x) @@ -1827,6 +1920,31 @@ vardef droite(text t)= enddef; +% demi-droites juin 2019 +vardef demidroitept(expr A,B)= + A--(_diag/abs(A-B))[A,B] +enddef; + +vardef demidroiteangle(expr A,alpha)= + demidroitept(A,A + dir alpha) +enddef; + +vardef demidroite(text t)= + save reptmp,repbool; + path reptmp; + boolean repbool; + repbool:=false; + for i=t: + if numeric i: repbool := true fi; + endfor + if repbool: + reptmp := demidroiteangle(t) + else: + reptmp := demidroitept(t) + fi; + reptmp +enddef; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%% DEMI-PLANS %%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -2420,15 +2538,18 @@ enddef; vardef nommeangle@#(expr A,O,B,p)= save P,a;pair P;path a; + save marque_p; string marque_p; + marque_p:=""; 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) + if str @# = "": + nommepoint[angle (P-O)](P,p) + else: + nommepoint@#(P,p) fi enddef; - taille_marque_ad:=0.3cm; vardef marqueangledroit(expr A,O,B)= -- cgit v1.2.3