Sunteți pe pagina 1din 4

CPGE PC Redémarrage : courbes de Bezier –

1 Courbes de Bezier et polynômes de Bernstein


1.1 Introduction
Si vous avez déjà utilisé un logiciel basique de dessin, vous avez sûrement tracé des courbes à l’aide d’un
outil nécessitant de donner deux points (« l’origine » et la « destination » de la courbe), ainsi que deux « points
de contrôle » qui ne sont pas sur la courbe mais qui orientent sa forme.

Figure 1.a Figure 1.b

La figure 1.a présente une telle courbe : on commence en (0, 0) et on termine en (4, 0), avec points de
contrôle (2, 1.5) et (3, 2). Rien n’empêche les points de former un polygone non convexe : dans la figure 1.b on
a pris les mêmes points que pour la figure 1.a, en inversant la « destination » et le deuxième point de contrôle.
Les courbes de Bézier ont été inventées vers la fin des années 1950 par un ingénieur des usines Renault nommé
Pierre Bézier. L’objectif était de faire tracer des courbes « comme à main levée » par l’ordinateur, notamment
pour tracer des profils de carrosserie.
Un autre ingénieur - de chez Citroën cette fois - Paul de Casteljau inventa, à la même époque un algorithme
de numérisation de ces courbes. Il faut bien comprendre que, sur le plan mathématique, ces courbes n’ont rien
d’extraordinaire. Il s’agit simplement de courbes algébriques, cubiques le plus souvent. En revanche, l’utilisation
qui en a été faite est très astucieuse.
Signalons qu’une autre application importante de ces courbes concerne la typographie et notamment les
polices de caractères. En particulier, les polices Postscript (1) sont calculées à partir des courbes de Bézier.
L’intérêt est que les courbes sont recalculées lors de chaque agrandissement, ce qui évite les phénomènes de «
pixellisation » c’est-à-dire d’apparition de la grille sous-jacente comme sur la figure ci-dessous.

Figure 2 - À gauche la lettre e grossie avec un ordinateur des années 1980,


à droite avec un ordinateur actuel

1.2 Courbes de Bézier et polynômes de Bernstein


On considère n + 1 points du plan rapporté à un repère (en général, n = 3) A0 = (x0 , y0 ), A1 = (x1 , y1 ),. . .,
An = (xn , yn ) et on définit une courbe paramétrée C = {M(t), t ∈ [ 0 ; 1 ]} où M(t) est un barycentre des Ai :

M(t) = B0 (t)A0 + B1 (t)A1 + · · · + Bn (t)An (1)


ou, en utilisant les coordonnées M(t) = x(t), y(t) ,


(
x(t) = B0 (t)x0 + B1 (t)x1 + · · · + Bn (t)xn
y(t) = B0 (t)y0 + B1 (t)y1 + · · · + Bn (t)yn
On demande que les coefficients Bi (t) soient tous positifs, de somme 1 et dépendent de t de façon la plus
régulière possibles.
(1). Ces polices sont notamment utilisées par les fichiers pdf lorsqu’ils ne proviennent pas de la numérisation d’un document.

Lycée Henri Poincaré 1/4 lo


CPGE PC Redémarrage : courbes de Bezier –

La solution proposée par Bézier est de prendre les polynômes de Bernstein d’ordre n définis par :
 
n i
∀i ∈ [[0 ; n]] , ∀t ∈ [ 0 ; 1 ] , Bi,n (t) = t (1 − t)n−i (2)
i

1. Vérifier que, pour n = 3, nous obtenons

∀t ∈ [ 0 ; 1 ] , M(t) = (1 − t)3 A0 + 3t(1 − t)2 A1 + 3t2 (1 − t)A2 + t3 A3 (3)


Dans ce T.P., nous prendrons systématiquement n = 3 (donc des paquets de 4 points). On parle alors de
courbes de Bézier cubiques.
2. Déterminer M(0) et M(1).
−−−→ −−−→
3. Vérifier que M0 (0) = 3A0 A1 et M0 (1) = 3A2 A3 , autrement dit, les tangentes en A0 et en A3 sont
−−−→ −−−→
respectivement dirigées par A0 A1 et A2 A3 .

1.3 Implémentation python


Le but de cette partie est de tracer des courbes de Bézier en se donnant un ensemble de points. On
commence par importer les modules dont on a besoin :
1 import numpy a s np
2 import m a t p l o t l i b . p y p l o t a s p l t

4. Compléter la fonction bezier(P,i) prenant en paramètre une liste de quatre points (une liste de couples,
donc) et un nombre i, et retournant deux listes X, Y, telles que X et Y soient constituées d’abscisses et
d’ordonnées de i points successifs de la courbe de Bézier associée aux points de P. On pourra utiliser
np.linspace(0,1,i) pour produire un tableau Numpy constitué de i flottants régulièrement espacés dans
[ 0 ; 1 ].
Par exemple, on doit obtenir les i coordonnées (la liste des abscisses suivie de celle des ordonnées) des
points M(k/(i − 1)) pour 0 6 k 6 i − 1 de la courbe de la figure 1.a :

In [1]: P_1a = [(0, 0), (2, 1.5), (3, 2), (4, 0)]
In [2]: bezier(P_1a,9)
Out[2]:
([0., 0.705078125, 1.328125, 1.880859375, 2.375, 2.822265625, 3.234375, 3.623046875, 4.],
[0., 0.5126953125, 0.9140625, 1.1865234375, 1.3125, 1.2744140625, 1.0546875, 0.6357421875, 0.])

1 def b e z i e r (P , i ) :
2 X = i ∗[0]
3 Y = i ∗[0]
4 t = . . . . . . . . . . . . # D é f i n i t i o n d e s p a r a m è t r e s t pour l e s q u e l s on c a l c u l e M( t )
5 fo r k in range ( i ) :
6 T = t [k]
7 X[ k ] = . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . # C a l c u l de X( t )
8 Y[ k ] = . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . # C a l c u l de Y( t )
9 return X,Y

5. De plus, étant données une liste d’abscisses X et une liste d’ordonnées Y, il suffit d’utiliser plt.plot(X,Y)
pour relier les points (xi , yi ) par une ligne brisée.
En déduire une fonction trace_bezier(P,i) traçant la courbe de Bézier pour la liste de points P en cal-
culant i points. L’appliquer par exemple à [(0,0), (2,1.5), (3,2), (4,0)] pour retrouver le résultat
de la figure 1.a, puis générer la figure 1.b.
6. Améliorer vos graphiques en traçant les points Pi et les segments Pi Pi+1 . plt.plot(X,Y,’o’) « met des
petits ronds » sur les points. plt.plot(X,Y,’-o’) fait les deux. Vous pouvez mettre par exemple une
couleur verte en rajoutant color=’green’.

Lycée Henri Poincaré 2/4 lo


CPGE PC Redémarrage : courbes de Bezier –

2 Algorithme de Casteljau pour le tracé des courbes de Bézier cubiques


On décrit maintenant un algorithme capable de calculer très facilement des points d’une courbe de
Bézier, sans avoir à prendre la valeur des polynômes de Bernstein en de multiples réels : la construction
est très géométrique ! Cette technique mène à un algorithme récursif pour le tracé d’approximations
de courbes de Bézier, en calculant seulement des milieux de segments et en traçant des lignes brisées.
L’algorithme est basé sur la propriété suivante, détaillée en figure 3.
Soit donc P0 , P1 , P2 et P3 un ensemble de 4 points de R2 . On considère la courbe de Bézier (de degré
3) définie par ces quatre points. Notons :
• M le milieu du segment [P1 , P2 ] ;
• A1 le milieu du segment [P0 , P1 ] ;
• A2 le milieu du segment [A1 , M] ;
• B2 le milieu du segment [P2 , P3 ] ;
• B1 le milieu du segment [M, B2 ] ;
• A3 = B0 le milieu du segment [A2 , B1 ].
Alors la courbe de Bézier définie par les points P0 , P1 , P2 et P3 est exactement la réunion des courbes
de Bézier passant par A0 = P0 , A1 , A2 et A3 , et celle passant par A3 = B0 , B1 , B2 et B3 = P3 .

Figure 3 - Une étape de l’algorithme de Casteljau

7. Repérer sur la figure 3 les différents points décrits dans l’algorithme de Casteljau.
Cette construction est l’algorithme de Casteljau. Remarquez que le point A3 = B0 appartient à la courbe
(il correspond au point M 12 ), et que la ligne brisée formée des deux suites de segments [A0 , A1 , A2 , A3 ]


et [B0 , B1 , B2 , B3 ] est une approximation bien plus précise de la courbe que n’est la ligne brisée formée
par les points [P0 , P1 , P2 , P3 ]. On peut donc construire récursivement une approximation de la courbe
de Bézier : tant que les segments de la ligne brisée sont de longueur supérieure à une certaine borne, on
applique l’algorithme de Casteljau.
8. Si ce n’est pas déjà fait, écrivez une fonction trace_ligne_brisee(P) traçant les segments [Pi , Pi+1 ] de
la liste P.
9. Écrire une fonction milieu(p,q) prenant en entrée deux points (représentés par des couples de flottants)
et renvoyant le couple associé au milieu du segment [p, q].
10. En déduire une fonction etape_casteljau(P) prenant en entrée une liste de quatre points du plan (repré-
sentés par des couples de flottants) et retournant deux listes de la forme [A0 , A1 , A2 , A3 ] et [B0 , B1 , B2 , B3 ]
comme détaillé dans l’algorithme de Casteljau.
11. On souhaite construire les courbes de Bézier en itérant l’algorithme de Casteljau jusqu’à ce que les points
soient suffisamment proches les uns des autres. Pour cela, écrire une fonction ecart(p,q) renvoyant la
distance séparant les points p et q, puis une fonction ecart_max(P) renvoyant la distance maximum
séparant deux points consécutifs de la liste de points P.
12. En déduire une fonction (récursive) bezier_casteljau(P,e) prenant en entrée une liste de quatre points
du plan (représentés par des couples de flottants) et traçant une approximation de la courbe de Bézier
contrôlée par les points de P, avec pour condition d’arrêt : la distance entre deux points successifs de P
est inférieure e. Dans ce cas on trace simplement la ligne brisée constituée des points de P.

Lycée Henri Poincaré 3/4 lo


CPGE PC Redémarrage : courbes de Bezier –

3 Courbes interpolantes de classe C1


La problématique de cette section est un peu différente : on se donne une liste de points (Qi )06i6n , et
le but est de construire une courbe paramétrée passant par les points Qi . On ne peut utiliser des courbes
de Bézier telles quelles :
• Une courbe de Bézier construite avec la définition du paragraphe 1 passe par Q0 et Q3 mais a priori
pas par les autres points.
• Prendre les points par paquets de 4 (le dernier point d’un paquet étant le premier du suivant) et
construire des courbes de Bézier avec l’algorithme de Casteljau mène à une courbe paramétrée qui est
seulement C1 par morceaux.

On va donc rajouter des points ! Plus précisément, on va construire pour tout 0 6 i < n une courbe
de Bézier, dont les extrémités seront les points Qi et Qi+1 . Il reste à choisir les deux points de contrôle
qu’on notera Ri et Si .
13. Donner une condition nécessaire et suffisante sur Si et Ri+1 pour assurer que la courbe paramétrée
obtenue soit de classe C1 au voisinage du point Qi+1 (il faut que les tangentes des deux courbes de Bézier
en Qi+1 soient les mêmes).
14. En notant, pour 0 6 i 6 n − 1, Mi (t) la courbe de Bézier construite sur les points [Qi , Ri , Si , Qi+1 ],
−−−→ −−−−−→
on décide d’imposer M00 (0) = 2αQ0 Q1 et M0n−1 (1) = 2αQn−1 Qn , et pour tout i de [[1 ; n − 2]], M0i (0) =
−−−−−−→
αQi−1 Qi+1 , où α est un réel strictement positif fixé.
Montrer que cela débouche sur le jeu de formules
 2α
R0 = (Q1 − Q0 ) + Q0
3


∀i ∈ [[1 ; n − 1]] , Ri = α (Qi+1 − Qi−1 ) + Qi



α3 (4)
∀i ∈ [[0 ; n − 2]] , Si = (Qi − Qi+2 ) + Qi+1
3






S
n−1 = (Qn−1 − Qn ) + Qn
3
15. Écrire une fonction combine(A,B,C,k) prenant trois couples de coordonnées A, B et C et un coefficient
k et renvoyant le couple k(A − B) + C.
16. Écrire une fonction bezier_c1(Q,alpha) prenant en paramètres une liste de points Q et un réel α, et
traçant avec l’algorithme de Casteljau toutes les courbes de Bézier en question. Observez le résultat
obtenu pour plusieurs valeurs de α. (On essaiera par exemple α = 0.1 , α = 1 et α = 10).

4 Annexe mathématique, pour aller un peu plus loin...


17. Vérifier que :
n
X
a) ∀i ∈ [[0 ; n]] , ∀t ∈ [ 0 ; 1 ] , Bi,n (t) > 0, b) ∀t ∈ [ 0 ; 1 ] , Bi (t) = 1.
i=0

18. Que valent Bi,n (0) et Bi,n (1) ? Et B0i,n (0) et B0i,n (1) ? En déduire M(0) et M(1) et montrer que les vecteurs
−−−→ −−−−−→
tangents à C en A0 et An sont respectivement dirigées par nA0 A1 et nAn−1 An .
 
n
19. Écrire une fonction binome(n,p) prenant en paramètre deux entiers n et p, et renvoyant . On pourra
p
utiliser la fonction factorial(k) pour le calcul de k! (elle se trouve normalement dans le module math,
dont on vient d’importer toutes les fonctions).
20. En déduire une fonction bernstein(n,i,t) prenant en paramètres n et i deux entiers, ainsi que t ∈ [ 0 ; 1 ]
et retournant Bi,n (t).
21. Démontrer l’algorithme de Casteljau, c’est-à-dire que la courbe de Bézier initiale est bien l’union de celles
contrôlées par [A0 , A1 , A2 , A3 ] et [B0 , B1 , B2 , B3 ].

Lycée Henri Poincaré 4/4 lo

S-ar putea să vă placă și