diff options
Diffstat (limited to 'Master/texmf-dist/metapost/repere/repere.mp')
-rw-r--r-- | Master/texmf-dist/metapost/repere/repere.mp | 165 |
1 files changed, 143 insertions, 22 deletions
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[<angle>] +% À 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)= |