\chapterimage{ouioui}



\chapter{Courbes de Bézier}

\section{Renault et Citroën}

\ill{Dans  les  années 60,  les  ingénieurs  Pierre  \textsc{Bézier} et  Paul
\textsc{De  Casteljau}   travaillant  respectivement  chez   Renault  et
Citroën, réfléchissent  au moyen de  définir de manière la  plus concise
possible la forme d'une carrosserie.

Le  principe  a été  énoncé  par  \textsc{Bézier}  mais l'algorithme  de
construction  par  son  collègue  de  la marque  aux  chevrons  qui  n'a
d'ailleurs été dévoilé  que bien plus tard, la  loi du secret industriel
ayant primé sur le développement scientifique...}{pierre_bezier}


Pour la  petite histoire, alors  que Pierre \textsc{Bézier}  (diplômé de
l'\textsc{Ensam}  et  de \textsc{Supélec}),  à  l'origine des  premières
machines à commandes  numériques et de la \textsc{Cao}  ce qui n'empêcha
pas sa  direction de le mettre  à l'écart: il se  consacra alors presque
exclusivement aux
mathématiques  et à  la  modélisation  des surfaces  et  obtint même  un
doctorat en 1977.

 Paul
\textsc{De Casteljau} était lui un mathématicien d'origine, ancien élève
de la  Rue d'\textsc{Ulm}, qui a  un temps été  employé par l'industriel
automobile. 


Aujourd'hui, les courbes de Bézier sont très utilisées en informatique.

Une Courbe de Bézier est une courbe paramétrique aux extrémités imposées
avec des points de contrôle qui définissent les tangentes à cette courbe
à des instants donnés.


\section{Algorithme de Casteljau}


\subsection{Avec 3 points de contrôle}

Soit $t$ un  paramètre de l'intervalle $[0,1]$ et  $P_1$, $P_2$ et $P_3$
les trois points de contrôle. 

On    construit     le    point    $M_1$     barycentre    du    système
$\left\{(P_1,1-t),(P_2,t)\right\}$    et   $M_2$   celui    du   système
$\left\{(P_2,1-t),(P_3,t)\right\}$. 

On   construit   ensuite   le   point   $M$,   barycentre   du   système
$\left\{(M_1,1-t),(M_2,t)\right\}$.

Exprimez M comme barycentre des trois points $P_1$, $P_2$ et $P_3$.

Faites la construction à la main avec $t=1/3$ par exemple.


Commentez le programme suivant~:


\begin{lstlisting}
bezier1:=proc(p1,p2,p3)
local m,m1,m2,P,S,B,k,t;
P:=plot([p1,p2,p3],color=green);
B:=NULL;
for k from 0 to 1 by 0.01 do
   m1:=(1-k)*p1+k*p2;
   m2:=(1-k)*p2+k*p3;
   m:=(1-k)*m1+k*m2;
   B:=B,m;
od;
B:=plot([B],color=blue);
S:=seq(plots[display](B,P,plot([(1-t*0.01)*p1+t*0.01*p2,(1-t*0.01)*p2+t*0.01*p3],color=red)),t=0..100);

plots[display](S,insequence=true,axes=none,scaling=constrained);
end:
\end{lstlisting}



puis le résultat de son lancement~:


\begin{lstlisting}
bezier1([0,0],[3,2],[5,-2]);
\end{lstlisting}

Il s'agit d'une  animation~! Il faut donc cliquer  sur l'image et lancer
l'animation à l'aide de l'icône appropriée.


\subsection{Espace affine}

Un  espace  affine  c'est  en  gros une  sorte  d'espace  vectoriel  \og
pointé\fg{}. Si un  point A et un vecteur u sont  donnés, $B=A+u$ est un
autre élément de  l'espace affine. Plus clairement, dans  le contexte du
plan vectoriel vu au lycée, on écrit~:

$$B=A+\ve{AB}$$

Cela nous permet  de faire des calculs sur  les points. D'ailleurs MAPLE
calcule lui aussi de cette manière.


Ainsi      $M_1(t)=(1-t)P_1+tP_2$     (ou      si      vous     préférez
$\ve{OM_1}(t)=(1-t)\ve{OP_1}+t \ve{OP_2}$) et
$M_2(t)=(1-t)P_2+tP_3$ puis

$$M(t)=(1-t)M_1(t)+tM_2(t)=(1-t)^2P_1+2t(1-t)P_2+t^2P_3$$


On peut dériver $M(t)$ par rapport  à $t$ (ou $\ve{OM}(t)$ par rapport à
$t$) comme en physique (vous verrez ça de
manière rigoureuse  en maths plus tard)  ce qui nous  donnera le vecteur
vitesse instantanée (c'est-à-dire un vecteur directeur de la tangente).


Vérifiez que $M'(t)=2(M_2(t)-M_1(t))$. Comment l'interpréter~?



\subsection{Avec 4 points de contrôle}


Faites une étude similaire (\og à la main\fg{}) avec 4 points de contrôle.

On pourra introduire les polynômes de Bernstein définis par~:

$$B_j^n(t)=\binom{n}{j}t^j(1-t)^{n-j}$$

et utiliser une représentation similaire aux arbres de probabilité.



Créez une procédure \verb+bern:=proc(j,n,t)+ qui calcule $B_j^n(t)$.

Commentez le script suivant~:

\begin{lstlisting}
bezier3:=proc(p)
local Vi,Vf,B,k,j,M;
Vi:=plot([p[1],p[2]],color=green);
Vf:=plot([p[3],p[4]],color=green);
B:=p[1];
for k from 0.01 to 0.99 by 0.01 do
    M:=sum(bern(j,3,k)*p[j+1],j=0..3);
    B:=B,M;
od;
B:=plot([B,p[4]],color=blue);
plots[display](B,Vi,Vf,axes=none,scaling=constrained);
end:
\end{lstlisting}


et testez~:

\begin{lstlisting}
bezier3([[0,0],[1,0],[3,-3],[3,0]]);
\end{lstlisting}


Quel est le rôle des points de contrôle 2 et 3~?



\section{Avec un nombre quelconque de
  points de contrôle }

Généralisez les procédures précédentes  pour traiter un nombre quelconque
de points de contrôle.

Testez avec  $[[1, 1], [2, 3], [5, 5], [6, 2], [7, 7], [10, 5], [10, 2], [8, 0], [4, 0], [5, 1]]$.

\section{Courbe de Bézier du 3\up{e}  degré avec un nombre quelconque de
  points de contrôle}

Il est   pratique  de travailler avec  des polynômes de  degré trois
pour avoir droit à des points d'inflexion.


Augmenter  le  nombre  de  points  de contrôle  implique  a  priori  une
augmentation du degré de la fonction polynomiale.

Pour remédier à  ce problème, on découpe une  liste quelconque en liste
de listes de 4 points. 

Cependant, cela  est insuffisant pour obtenir un  raccordement de classe
$\CR^1$  (pourquoi~? pourquoi est-ce  important d'avoir  un raccordement
de classe $\CR^1$~?)


Pour assurer la  continuité tout court, il faut que  le premier point d'un
paquet soit le dernier du paquet précédent.

Le dernier \og vecteur  vitesse\fg{} de la liste $[P_1,P_2,P_3,P_4]$ est
$\ve{P_3P_4}$. Il  faut donc que ce  soit le premier  vecteur vitesse du
paquet suivant pour assurer la continuité de la dérivée.

Appelons provisoirement le paquet suivant $[P_1',P_2',P_3',P_4']$. On a 
d'une part $P_1'=P_4$
et           d'autre          part          $\ve{P_3P_4}=\ve{P_1'P_2'}$,
i.e. $P_2'=P_4+\ve{P_3P_4}$.

On a donc $P_3'=P_5$ et $P_4'=P_6$.


Connaissant  \verb+bezier3+,  construire  une  procédure qui  trace  une
courbe de Bézier cubique avec un nombre quelconque de points de contrôle
(on prendra un nombre pair de points pour se simplifier la vie).

Testez avec  $[[1, 1], [2, 3], [5, 5], [6, 2], [7, 7], [10, 5], [10, 2], [8, 0], [4, 0], [5, 1]]$.


Dessinez un c\oe ur....

\section{B-splines uniformes}

\subsection{Cas général}


Tout ceci est  très beau mais il  y a un hic~:~en changeant  un point de
contrôle, on modifie grandement la figure.

\medskip


On considère $m$ n\oe uds $t_0,t_1,\cdots,t_m$ de l'intervalle $[0,1]$.




Introduisons une nouvelle fonction~:

$$\mathbf{S}(t)= \sum_{i=0}^{m-n-1} \mathbf{P}_{i} b_{i,n}(t) \mbox{ , } t \in [0,1]$$


 les $P_i$ étant les points de contrôle et les fonctions $b_{j,n}$ étant
 définies récursivement par 

$$  b_{j,0}(t)  =  \left\{\begin{matrix}  1  &  \mathrm{si}  \quad  t_j
    \leqslant t < t_{j+1} \\ 0 & \mathrm{sinon} \end{matrix} \right.$$

et pour $n\se 1$

$$    b_{j,n}(t) = \frac{t - t_j}{t_{j+n} - t_j} b_{j,n-1}(t) + \frac{t_{j+n+1} - t}{t_{j+n+1} - t_{j+1}} b_{j+1,n-1}(t). $$

On ne  considérera par  la suite que  des n\oe  uds équidistants~:~ainsi
on aura $t_k=\frac{k}{m}$.

On  parle  de B-splines  uniformes  et  on  peut simplifier  la  formule
précédente en remarquant également des invariances par translation.




\subsection{Fonctions B-splines d'ordre 3 avec 4 points de contrôle}


À l'aide des formules précédentes, on  peut prouver que dans le cas de 4
points de contrôles on obtient~:

$$S(t)=\frac{1}{6}\Big((1-t)^3P_0+(3t^3-6t^2+4)P_1+(-3t^3+3t^2+3t+1)P_2+t^3P_3\Big)$$


Calculez $S(0)$, $S(1)$ puis $S'(0)$ et $S'(1)$~:~que peut-on en conclure~?

Reprenez l'étude faite avec les courbes de Bézier et comparez les résultats.

%%% Local Variables: 
%%% TeX-master: "PolyMaple10"
%%% End: 
