Algoritmo di De Casteljau (grado 3)

import graph;
import animate;
animation A=animation("decast3_a");
A.global=false;
defaultpen(fontsize(30pt));
pen shortdashed=linetype(new real[] {5,5});
pair P0=(0,0), P1=(2,4), P2=(5,5), P3=(7,1);

real x(real t) {return P0.x*(1-t)^3+P1.x*3*t*(1-t)^2+P2.x*3*t^2*(1-t)+P3.x*t^3;}
real y(real t) {return P0.y*(1-t)^3+P1.y*3*t*(1-t)^2+P2.y*3*t^2*(1-t)+P3.y*t^3;}

int NN=100;
real h=1/NN;
for(int i=-1; i < NN; ++i) {
  picture pic;
  size(pic,30cm,30cm);
  real t;
  if (i<0)
  t=0.65;
  else
  
   t=h*i;
  
  dot(pic,"$P_0$",P0, black+linewidth(6));
  dot(pic,"$P_1$",P1, black+linewidth(6));
  dot(pic,"$P_2$",P2, black+linewidth(6));
  dot(pic,"$P_3$",P3, black+linewidth(6));
  draw(pic,P0--P1,shortdashed+red);
  draw(pic,P1--P2,shortdashed+red);
  draw(pic,P2--P3,shortdashed+red);
  pair P01=(1-t)*P0+t*P1;
  pair P11=(1-t)*P1+t*P2;
  pair P21=(1-t)*P2+t*P3;
  dot(pic,"$Q_{0}$",P01,black+linewidth(6));
  dot(pic,"$Q_{1}$",P11,black+linewidth(6));
  dot(pic,"$Q_{2}$",P21,black+linewidth(6));
  draw(pic,P01--P11,magenta+shortdashed);
  draw(pic,P11--P21,magenta+shortdashed);
  pair P02=(1-t)*P01+t*P11;
  pair P12=(1-t)*P11+t*P21;
  dot(pic,"$R_{0}$",P02, black+linewidth(6));
  dot(pic,"$R_{1}$",P12,black+linewidth(6));
  draw(pic,P02--P12,purple+shortdashed);
  pair P03=(1-t)*P02+t*P12;
  dot(pic,"$\mathbf{c}(t)$",P03,blue+linewidth(6));
  draw(pic,graph(x,y,0,t),blue+linewidth(2));
  A.add(pic);
}
A.movie(loops=3,delay=300);
Link al pdf animato (visualizzabile con Acrobat Reader)