Documente Academic
Documente Profesional
Documente Cultură
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.
(
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.
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
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’.
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.
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
2α
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).
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 ].