summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/metapost/repere
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2017-11-13 23:49:06 +0000
committerKarl Berry <karl@freefriends.org>2017-11-13 23:49:06 +0000
commit4a030fcab21d7bf8937b305f0f43c69d1da2d3d3 (patch)
tree2f643096198c0a07b3e9cfd304280879f77a1b8c /Master/texmf-dist/metapost/repere
parentf899f7310045611eaac2d7a69fdf55abb36250c6 (diff)
repere (13nov17)
git-svn-id: svn://tug.org/texlive/trunk@45779 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/metapost/repere')
-rw-r--r--Master/texmf-dist/metapost/repere/repere.mp212
1 files changed, 196 insertions, 16 deletions
diff --git a/Master/texmf-dist/metapost/repere/repere.mp b/Master/texmf-dist/metapost/repere/repere.mp
index f12b866c56e..2c568e3884c 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 (Novembre 2017) %%
+%% Version 17.11.2 (Novembre 2017) %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% This work may be distributed and/or modified under the conditions of
@@ -1318,6 +1318,17 @@ vardef courbef_(suffix f)(expr xmin, xmax, n) = %Courbe représentative d'une
enddef;
+vardef courbef_l(suffix f)(expr xmin, xmax, n) = %Courbe représentative d'une fonction
+ save $,x;
+ path $;
+ $=((xmin,f(xmin))
+ for i=1 upto n-1:
+ ...(xmin+i*(xmax-xmin)/(n-1),f(xmin+i*(xmax-xmin)/(n-1)))
+ endfor );
+ $
+enddef;
+
+
vardef courbefonc(suffix f)(text t)=
save cc;path cc;
save k,Val;numeric k,Val[];
@@ -1331,6 +1342,19 @@ vardef courbefonc(suffix f)(text t)=
enddef;
+vardef courbefoncl(suffix f)(text t)=
+ save cc;path cc;
+ save k,Val;numeric k,Val[];
+ Val[1]:=Xmin;Val[2]:=Xmax;Val[3]:=100;
+ k:=1;
+ for i=t:
+ Val[k]:=i;
+ k:=k+1;
+ endfor
+ courbef_l(f,Val[1],Val[2],Val[3])
+enddef;
+
+
vardef courbepoints(suffix f)(expr xmin, xmax, n) = %Points non reliés
@@ -1437,19 +1461,22 @@ enddef;
%Novembre 2017
vardef polynomelagrange(text t)(expr x)=
+ save tmp;
+ numeric tmp;
for i=t:
- if pair i: polynomelagrangept(t)(x)
- else: polynomelagrangeval(t)(x)
- fi
- exitif true
+ if pair i: tmp:=polynomelagrangept(t)(x)
+ else: tmp:=polynomelagrangeval(t)(x)
+ fi;
+ exitif true;
endfor
+ tmp
enddef;
%Novembre 2017
-vardef lagrange(text t)=
+vardef lagrange(text t)(text q)=
vardef _tmp_poly_lag(expr x)= polynomelagrange(t)(x) enddef;
- courbefonc(_tmp_poly_lag)()
+ courbefonc(_tmp_poly_lag)(q)
enddef;
@@ -1476,33 +1503,186 @@ enddef;
%Novembre 2017
vardef polynomehermiteptder(text t)(expr x)=
-save tmp,k,j,re,gr,bl;
-color tmp[];numeric k,j,re,gr,bl;
+save tmp,k,j,re,gr,bl,i;
+color tmp[];numeric k,j,re,gr,bl,i;
k:=0;j:=0;
for i=t:
if pair i: re:= xpart i; gr:= ypart i else: bl:=i; k:=k+1; tmp[k]=(re,gr,bl) fi;
endfor
-polynomehermite(tmp[1] for ii=2 upto k: ,tmp[ii] endfor)(x)
+polynomehermitetriplet(tmp[1] for ii=2 upto k: ,tmp[ii] endfor)(x)
enddef;
%Novembre 2017
vardef polynomehermite(text t)(expr x)=
+ save tmp;
+ numeric tmp;
for i=t:
- if color i: polynomehermitetriplet(t)(x)
- else: polynomehermiteptder(t)(x)
- fi
- exitif true
+ if color i: tmp:=polynomehermitetriplet(t)(x)
+ else: tmp:=polynomehermiteptder(t)(x)
+ fi;
+ exitif true;
endfor
+ tmp
enddef;
%Novembre 2017
-vardef hermite(text t)=
+vardef hermite(text t)(text q)=
vardef _tmp_poly_her(expr x)= polynomehermite(t)(x) enddef;
- courbefonc(_tmp_poly_her)()
+ courbefoncl(_tmp_poly_her)(q)
+enddef;
+
+
+% Novembre 2017
+vardef spcuhezz (expr t)= 2*(t**3)-3*(t**2)+1 enddef;
+vardef spcuheuz (expr t)= t**3-2*(t**2)+t enddef;
+vardef spcuhezu (expr t)= -2*(t**3)+3*(t**2) enddef;
+vardef spcuheuu (expr t)= t**3-t**2 enddef;
+
+
+% Novembre 2017
+vardef splinecubique (expr xa,ya,da,xb,yb,db)(expr x)=
+% On donne deux points et les dérivées en ces points
+ save t;
+ numeric t;
+ t=(x-xa)/(xb-xa);
+ (spcuhezz(t))*ya + (spcuheuz(t))*da*(xb - xa) + (spcuhezu(t))*yb + (spcuheuu(t))*db*(xb - xa)
+enddef;
+
+% Novembre 2017
+vardef splineinterpolderfonct_coul(text t)(expr x)=
+% On donne points et dérivées sous forme de triplets (x,y,y')
+ save pta,ptb,prem,sortie;
+ color pta,ptb;
+ boolean prem,sortie;
+ prem:=true;sortie:=false;
+ for i=t:
+ if prem: ptb:=i; prem:=false
+ else:
+ pta:=ptb;
+ ptb:=i;
+ if x< redpart ptb: sortie:=true fi;
+ fi;
+ exitif sortie;
+ endfor
+ splinecubique(redpart pta, greenpart pta, bluepart pta,redpart ptb, greenpart ptb, bluepart ptb)(x)
+enddef;
+
+% Novembre 2017
+vardef splineinterpolderfonct_pt(text t)(expr x)=
+% On donne points et dérivées sous forme de liste (A,y'A,B,y'B...)
+ save tmp,k,re,gr,bl;
+ color tmp[];
+ numeric re,gr,bl,k;
+ k:=0;
+ for i=t:
+ if pair i: k:=k+1; re:= xpart i; gr:= ypart i
+ else: bl:=i; tmp[k]:=(re,gr,bl)
+ fi;
+ endfor
+ splineinterpolderfonct_coul(tmp[1] for ii=2 upto k: ,tmp[ii] endfor)(x)
+enddef;
+
+% Novembre 2017
+vardef splineinterpolderfonct_listeval(text t)(expr x)=
+% On donne points et dérivées sous forme de liste de valeurs (xA,yA,y'A,xB,yB,y'B...)
+ save tmp,k,j,re,gr,bl;
+ color tmp[];
+ k:=0;j:=0;
+ for i=t:
+ if j=0: re:= i; j:=1
+ elseif j=1: gr:=i; j:=2
+ else: bl:=i; tmp[k]:=(re,gr,bl); j:=0;k:=k+1
+ fi;
+ endfor
+ splineinterpolderfonct_coul(tmp[0] for ii=1 upto k-1: ,tmp[ii] endfor)(x)
+enddef;
+
+
+% Novembre 2017
+vardef splinederfonct(text t)(expr x)=
+ save tmp;
+ numeric tmp;
+ for i=t:
+ if color i: tmp:=splineinterpolderfonct_coul(t)(x)
+ elseif pair i: tmp:=splineinterpolderfonct_pt(t)(x)
+ else: tmp:=splineinterpolderfonct_listeval(t)(x)
+ fi;
+ exitif true;
+ endfor
+ tmp
+enddef;
+
+% Novembre 2017
+vardef splineder(text t)(text q)=
+ vardef _tmp_poly_splineder(expr x)= splinederfonct(t)(x) enddef;
+ courbefoncl(_tmp_poly_splineder)(q)
enddef;
+% 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;
+
+% 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;
+
+vardef splineinterpolfonct_listeval(text t)(expr x)=
+% t est la liste des valeurs (x1,y1,x2,y2,x3,y3...)
+ save xa,ya,tmp,k,j;
+ numeric xa,ya,k,j;
+ pair tmp[];
+ k:=0;j:=0;
+ for i=t:
+ if j=0: xa:= i
+ else: ya:=i; tmp[k]:= (xa,ya); k:= k+1
+ fi;
+ j:=1-j;
+ endfor
+ splineinterpolfonct_pt(tmp[0] for ii=1 upto k-1: ,tmp[ii] endfor)(x)
+enddef;
+
+% Novembre 2017
+vardef splinefonct(text t)(expr x)=
+ save tmp;
+ numeric tmp;
+ for i=t:
+ if pair i: tmp:=splineinterpolfonct_pt(t)(x)
+ else: tmp:=splineinterpolfonct_listeval(t)(x)
+ fi;
+ exitif true;
+ endfor
+ tmp
+enddef;
+
+% Novembre 2017
+vardef spline(text t)(text q)=
+ vardef _tmp_poly_spline(expr x)= splinefonct(t)(x) enddef;
+ courbefonc(_tmp_poly_spline)(q)
+enddef;
+
+
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%