diff options
Diffstat (limited to 'Master/texmf-dist/metapost/repere/repere.mp')
-rw-r--r-- | Master/texmf-dist/metapost/repere/repere.mp | 212 |
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; + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |