Fonctions utiles

DessineTD1(ListeDesXetY,XYdeT,T,tmin,tmax,xmin,ymin,xmax,ymax):=
 plot2d([[parametric,XYdeT[1],XYdeT[2],[t,tmin,tmax]],[discrete,ListeDesXetY]],
        [x,xmin,xmax],[y,ymin,ymax],[gnuplot_preamble,"set size ratio 1"],
        [style,[lines,1,1],[points,5,2]])$
DTD1:DessineTD1$
ResolutionParDichotomie(Expression,Variable,BorneInf,BorneSup,Precision):=
 block([a:BorneInf,b:BorneSup,e:Precision,x_tilde,m,fm,xx:ev(Variable)],
  block([fa:ev(Expression,ev(Variable)=a),fb:ev(Expression,ev(Variable)=b)],
   if fa=0 then  x_tilde:a 
   elseif fb=0 then x_tilde:b
   elseif fa*fb > 0 then x_tilde:"echec de l'algorithme"
   else
   (while abs(b-a)>e do
    (m:(a+b)/2,fm:ev(Expression,ev(Variable)=m),
    if fm=0 then (a:m,b:m) 
     elseif fa*fm > 0 then (a:m,fa:fm)
     else (b:m,fb:fm)),
     x_tilde:(a+b)/2.0),
    [x_tilde,ev(Expression,ev(Variable)=x_tilde)]))$
RPD:ResolutionParDichotomie$

### Trouve le milieu

TrouveLeMilieu(XYdeT,t,t0,t2):=
 block([x0,y0,x2,y2],
 [x0,y0]:ev(XYdeT,ev(t)=t0),
 [x2,y2]:ev(XYdeT,ev(t)=t2),   
 ResolutionParDichotomie((XYdeT[1]-x0)^2+(XYdeT[2]-y0)^2-(XYdeT[1]-x2)^2-(XYdeT[2]-y2)^2,t,t0,t2,1.0e-5)[1])$
TLM:TrouveLeMilieu$

le demi cercle marche 

xy:[cos(t),sin(t)];t0:0.0;t2:%pi;
t1:TLM(xy,t,t0,t2);
DTD1([ev(xy,t=t0),ev(xy,t=t1),ev(xy,t=t2)],xy,t,t0,t2,-1,0,1,2);

le cercle complet ne marche pas parce que les points extrémités sont confondus

xy:[cos(t),sin(t)];t0:0.0;t2:2*%pi;
t1:TLM(xy,t,t0,t2);
DTD1([ev(xy,t=t0),ev(xy,t=t1),ev(xy,t=t2)],xy,t,t0,t2,-1,-1,1,1);

un cercle presque complet marche

xy:[cos(t),sin(t)];t0:0.0;t2:1.9*%pi;
t1:TLM(xy,t,t0,t2);
DTD1([ev(xy,t=t0),ev(xy,t=t1),ev(xy,t=t2)],xy,t,t0,t2,-1,-1,1,1);

la parabole marche

xy:[t,t^2/2];t0:0.0;t2:%pi;
t1:TLM(xy,t,t0,t2);
DTD1([ev(xy,t=t0),ev(xy,t=t1),ev(xy,t=t2)],xy,t,t0,t2,0,0,%pi,%pi^2/2);

### Les points équidistants

CreeLesTs(XYdeT,t,t0,tN,DistanceMoyenne):=
 block([in:[[float(t0),float(tN)]],out:[],i],
  while length(in) > 0 do
   block([t0:in[1][1],t1:in[1][2],tm],
    in:rest(in),
    block([x0,y0,x1,y1,dst],
     [x0,y0]:ev(XYdeT,ev(t)=t0),
     [x1,y1]:ev(XYdeT,ev(t)=t1),  
     dst:sqrt((x1-x0)^2+(y1-y0)^2),
     if dst < sqrt(2.0)*DistanceMoyenne then out:append(out,[[t0,t1]])
     else
      (tm:TrouveLeMilieu(XYdeT,t,t0,t1),
       in:append(in,[[t0,tm],[tm,t1]]))
    )),
  cons(t0,map(lambda([u],u[2]),sort(out))))$
CLT:CreeLesTs$

FaitLesPoints(XYdeT,T,Ts):=map(lambda([u],ev(XYdeT,ev(T)=u)),Ts)$
FLP:FaitLesPoints$

le demi cercle

xyt:[cos(t),sin(t)];
Ts:CLT(xyt,t,0,%pi,1/5);
DessineTD1(FLP(xyt,t,Ts),xyt,t,0,%pi,-1,0,1,2);

la parabole

xyt:[t,t^2/2];
Ts:CLT(xyt,t,0,%pi,1/2);
DessineTD1(FLP(xyt,t,Ts),xyt,t,0,%pi,0,0,%pi,%pi^2/2);

Un exemple où il apparaît que les points ne sont en fait pas équidistants

xyt:[sin(t),t^2/2];
Ts:CLT(xyt,t,0,%pi,1/2);
DessineTD1(FLP(xyt,t,Ts),xyt,t,0,%pi,0,0,%pi,%pi^2/2);