summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/metapost
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2019-06-11 21:01:20 +0000
committerKarl Berry <karl@freefriends.org>2019-06-11 21:01:20 +0000
commit67fdef123d0cd393e03d0e6a37e2a427e064d47e (patch)
treee96cef4f33394332603a5b87685fbb96f81121ae /Master/texmf-dist/metapost
parent53e76e173ff235ac45b40637cf0763fb02359af1 (diff)
repere (11jun19)
git-svn-id: svn://tug.org/texlive/trunk@51363 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/metapost')
-rw-r--r--Master/texmf-dist/metapost/repere/repere.mp165
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)=