$$\newcommand{\mtn}{\mathbb{N}}\newcommand{\mtns}{\mathbb{N}^*}\newcommand{\mtz}{\mathbb{Z}}\newcommand{\mtr}{\mathbb{R}}\newcommand{\mtk}{\mathbb{K}}\newcommand{\mtq}{\mathbb{Q}}\newcommand{\mtc}{\mathbb{C}}\newcommand{\mch}{\mathcal{H}}\newcommand{\mcp}{\mathcal{P}}\newcommand{\mcb}{\mathcal{B}}\newcommand{\mcl}{\mathcal{L}} \newcommand{\mcm}{\mathcal{M}}\newcommand{\mcc}{\mathcal{C}} \newcommand{\mcmn}{\mathcal{M}}\newcommand{\mcmnr}{\mathcal{M}_n(\mtr)} \newcommand{\mcmnk}{\mathcal{M}_n(\mtk)}\newcommand{\mcsn}{\mathcal{S}_n} \newcommand{\mcs}{\mathcal{S}}\newcommand{\mcd}{\mathcal{D}} \newcommand{\mcsns}{\mathcal{S}_n^{++}}\newcommand{\glnk}{GL_n(\mtk)} \newcommand{\mnr}{\mathcal{M}_n(\mtr)}\DeclareMathOperator{\ch}{ch} \DeclareMathOperator{\sh}{sh}\DeclareMathOperator{\th}{th} \DeclareMathOperator{\vect}{vect}\DeclareMathOperator{\card}{card} \DeclareMathOperator{\comat}{comat}\DeclareMathOperator{\imv}{Im} \DeclareMathOperator{\rang}{rg}\DeclareMathOperator{\Fr}{Fr} \DeclareMathOperator{\diam}{diam}\DeclareMathOperator{\supp}{supp} \newcommand{\veps}{\varepsilon}\newcommand{\mcu}{\mathcal{U}} \newcommand{\mcun}{\mcu_n}\newcommand{\dis}{\displaystyle} \newcommand{\croouv}{[\![}\newcommand{\crofer}{]\!]} \newcommand{\rab}{\mathcal{R}(a,b)}\newcommand{\pss}[2]{\langle #1,#2\rangle} $$
Bibm@th

Petite introduction aux courbes de Bézier

Introduction
  Les courbes de Bézier répondent au problème suivant : comment représenter facilement avec un logiciel de conception assistée par ordinateur (CAO) des formes complexes (aile d'avion, pièce de voiture, fontes de caractères,…) en ne rentrant qu'un nombre fini de contraintes. En termes plus mathématiques, on souhaite construire des courbes lisses à partir d'un nombre fini de points de contrôles.

  Prenons l'exemple de 3 points de contrôle $P_0,P_1,P_2$. On souhaite construire une courbe allant de $P_0$ à $P_2$ telle que la tangente en $P_0$ soit $\overrightarrow{P_0P_1}$ et la tangente en $P_2$ soit $\overrightarrow{P_1P_2}$. La première idée est, comme sur le dessin ci-dessous, de tracer les segments allant de $P_0$ à $P_1$ et de $P_1$ à $P_2$ : pas sûr que l'on vende beaucoup de voitures avec des formes aussi anguleuses!

  L'idée de Pierre Bézier, ingénieur chez Renault, est de procéder par barycentrage successif.
  • Étape 1 : On décrit les points des segments $[P_0P_1]$ et $[P_1P_2]$ comme des barycentres des extrémités. Pour le segment $[P_0P_1]$, on a les points $M_0$ décrits par $$\overrightarrow{OM_0(t)}=(1-t)\overrightarrow{OP_0}+t\overrightarrow{OP_1}.$$ Pour le segment $[P_1P_2]$, on a les points $M_1$ décrits par $$\overrightarrow{OM_1(t)}=(1-t)\overrightarrow{OP_1}+t\overrightarrow{OP_2}.$$
  • Étape 2 : La courbe de Bézier est donnée par les points $M(t)$ qui sont les barycentres de $M_0(t)$ affecté du coefficient $1-t$ et $M_1(t)$ affecté du coefficient $t$. Autrement dit, \begin{eqnarray} \overrightarrow{OM(t)}&=&(1-t)\overrightarrow{OM_0(t)}+t\overrightarrow{OM_1(t)}\\ &=&(1-t)^2\overrightarrow{OP_0}+2t(1-t)\overrightarrow{OP_1}+t^2\overrightarrow{OP_2}. \end{eqnarray}
  L'applet suivante vous permet de visualiser la courbe obtenue en faisant varier $t$.

C'est une appliquette Java créée avec GeoGebra ( www.geogebra.org) - Il semble que Java ne soit pas installé sur votre ordinateur, merci d'aller sur www.java.com

  Bien sûr, ce que l'on a fait avec 3 points, on peut aussi le faire avec 4 points $P_0$, $P_1$, $P_2$ et $P_3$, mais il faut procéder en trois étapes.

  • Étape 1 : On décrit les trois segments $[P_0P_1]$, $[P_1P_2]$, $[P_2P_3]$ par \begin{eqnarray*} \overrightarrow{OM_0^{(1)}(t)}&=&(1-t)\overrightarrow{OP_0}+t\overrightarrow{OP_1}\\ \overrightarrow{OM_1^{(1)}(t)}&=&(1-t)\overrightarrow{OP_1}+t\overrightarrow{OP_2}\\ \overrightarrow{OM_2^{(1)}(t)}&=&(1-t)\overrightarrow{OP_2}+t\overrightarrow{OP_3}\\ \end{eqnarray*}
  • Étape 2 : On itère et on construit les barycentres de $M_0^{(1)}$ et de $M_1^{(1)}$, puis de $M_1^{(1)}$ et de $M_2^{(1)}$. Ainsi, on construit deux courbes, l'une allant de $P_0$ à $P_2$, l'autre allant de $P_1$ à $P_3$ : \begin{eqnarray*} \overrightarrow{OM_0^{(2)}(t)}&=&(1-t)\overrightarrow{OM_0^{(1)}(t)}+t\overrightarrow{OM_1^{(1)}(t)}\\ \overrightarrow{OM_1^{(2)}(t)}&=&(1-t)\overrightarrow{OM_1^{(1)}(t)}+t\overrightarrow{OM_2^{(1)}(t)} \end{eqnarray*}
  • Étape 3 : On itère et on construit les barycentres de $M_0^{(2)}$ et de $M_1^{(2)}$. On obtient alors la courbe de Bézier décrite par les 4 points de contrôle $P_0$, $P_1$, $P_2$ et $P_3$.

C'est une appliquette Java créée avec GeoGebra ( www.geogebra.org) - Il semble que Java ne soit pas installé sur votre ordinateur, merci d'aller sur www.java.com

  Un petit calcul montre que $$\overrightarrow{OM(t)}=(1-t)^3\overrightarrow{OP_0}+3t(1-t)^2\overrightarrow{OP_1}+3t^2(1-t)\overrightarrow{OP_2}+t^3\overrightarrow{OP_2}.$$ Bien sûr, ce que l'on a fait pour 3 ou 4 points se généralise à $n\geq 3$ points, et on devine assez clairement la formule!
Polynômes de Bernstein
Définition : Pour $n\in\mathbb N$ et $0\leq k\leq n$, on appelle polynôme de Bernstein $B_k^n$ le polynôme $$B_k^n(t)=\binom nk t^k(1-t)^{n-k}$$.
  Les polynômes de Bernstein possèdent les propriétés suivantes :
  • Le degré de $B_k^n$ est égal à $n$.
  • $\sum_{k=0}^n B_k^n(t)=1$ pour tout $t\in\mathbb R$.
  • $B_k^n$ est positif sur $[0,1]$ et si $n\neq 0$, $B_k^n$ ne s'annule qu'en 0 et en 1.
  • $B_k^n$ atteint son maximum sur $[0,1]$ en $k/n$.
  • $\left(B_k^n\right)'(t)=n\left(B_{k-1}^{n-1}(t)-B_k^{n-1}(t)\right)$.
  • $B_{k+1}^{n+1}(t)=(1-t) B_{k+1}^n (t)+tB_k^n(t)$.
Théorème : Pour tout $n\in\mathbb N$, les polynômes $(B_k^n)_{0\leq k\leq n}$ forment une base de $\mathbb R_n[X]$.

Courbes de Bézier
Définition : Soient $P_0,\dots,P_n$ des points d'un plan affine $\mathcal P$. On appelle courbe de Bézier de points de contrôle $P_0,\dots,P_n$ la courbe paramétrée définie, pour $t\in [0,1]$, par $$M(t)=\textrm{Bar}\big( (P_0,B_0^n(t)), (P_1,B_1^n(t)),\dots, (P_n,B_n^n(t) ) \big).$$
Autrement dit, pour tout $t\in [0,1]$, $M(t)$ est l'unique point de $\mathcal P$ tel que $$\forall A\in\mathcal P,\ \overrightarrow{AM}(t)=\sum_{k=0}^n B_k^n(t)\overrightarrow{AP_k}.$$ La courbe de Bézier a les propriétés suivantes :
  • elle est contenue dans l'enveloppe convexe des points $P_0,\dots,P_n$.
  • elle a pour extrémité les points $P_0$ et $P_n$.
  • le vecteur tangent à la courbe en $P_0$ est $\overrightarrow{P_0P_1}$, le vecteur tangent en $P_n$ est $\overrightarrow{P_{n-1}P_n}$.
L'algorithme de de Casteljau
  L'algorithme de de Casteljau est l'algorithme pour construire des points d'une courbe de Bézier que nous avons décrit au début de cette page pour les courbes de Bézier à 3 ou 4 points de contrôle. Il procède par barycentrages successifs. Voici sa formulation générale :
Théorème : Soient $P_0,\dots,P_n\in\mathcal P$ et soit $t\in[0,1]$. Notons $(M^\ell_k)$ la suite de points de $\mathcal P$ indexée par $\ell\in\{0,1,\cdots,n\}$ et $k\in\{0,1,\cdots,n-\ell\}$ définie par récurrence en posant
  • pour $\ell=0$ : $M_k^0=P_k$, pour tout $k\in\{0,1,\cdots,n\}$;
  • $M_k^{\ell+1}=\textrm{Bar}\big( (M_k^\ell, 1-t), (M_{k+1}^\ell, t)\big)$ pour $\ell\in\{0,1,\cdots,n-1\}$ et $k\in\{0,1,\cdots,n-\ell-1\}$.
Alors on a $$M_0^n=\textrm{Bar}\big( (P_0,B_0^n(t)), (P_1,B_1^n(t)),\dots, (P_n,B_n^n(t) ) \big).$$ En particulier, $M_0^n$ est le point de paramètre $t$ de la courbe de Bézier de points de contrôle $P_0,\dots,P_n$.

  L'algorithme de de Casteljau a un autre intérêt. Non seulement il construit le point $M(t)$ de la courbe de Bézier, mais il produit aussi le vecteur tangent à la courbe en ce point. En effet, on a le corollaire suivant :
Corollaire : Avec les notations ci-dessus, le vecteur tangent à la courbe de Bézier au point $M(t)$ est $n\overrightarrow{M_0^{n-1}M_1^{n-1}}$.

Définition par vecteurs de contrainte
  On rencontre aussi la définition d'une courbe de Bézier par la donnée de vecteurs de contraintes $\overrightarrow{V_0},\dots,\overrightarrow{V_n}$. Il s'agit simplement de la courbe de Bézier dont les points de contrôle sont $P_0,\dots,P_n$ avec $$\overrightarrow{OP_0}=\overrightarrow{V_0},\ \overrightarrow{P_{i-1}P_{i}}=\overrightarrow{V_i}$$ pour $i=1,\dots,n$.