Courbes de Bézier
Objectifs d'apprentissage
À la fin de cette leçon, vous serez en mesure de :
- Comprendre l'origine et l'utilité des courbes de Bézier en CAO
- Construire les polynômes de Bernstein
- Tracer une courbe de Bézier cubique à partir de 4 points de contrôle
- Identifier les propriétés géométriques des courbes de Bézier
- Utiliser la représentation matricielle pour l'évaluation
Prérequis
- Interpolation polynomiale
- Courbes paramétriques
- Multiplication matricielle
Contexte historique
L'industrie automobile et la CAO
Dans les années 1960, l'industrie automobile cherchait des moyens de représenter mathématiquement les carrosseries de voitures pour permettre leur conception assistée par ordinateur.
Pierre Bézier, ingénieur chez Renault, a développé un système révolutionnaire permettant aux designers de créer des courbes lisses en manipulant quelques points de contrôle.
Avantage des courbes de Bézier
Contrairement à l'interpolation classique où le polynôme passe par tous les points, les courbes de Bézier permettent aux designers de sculpter une courbe en déplaçant des points de contrôle. La courbe est « attirée » vers ces points sans nécessairement les toucher.
Les polynômes de Bernstein
Définition
Les polynômes de Bernstein de degré sont définis par :
où est le paramètre de la courbe.
Cas cubique (n = 3)
Pour les courbes de Bézier cubiques (les plus utilisées), les 4 polynômes de Bernstein sont :
Propriétés fondamentales
| Propriété | Formule |
|---|---|
| Partition de l'unité | pour tout |
| Non-négativité | pour |
| Valeurs aux extrémités | , |
| Symétrie |
Polynômes de Bernstein
Bᵢ,ₙ(u) = (n i) uⁱ (1-u)ⁿ⁻ⁱ — Fonctions de base des courbes de Bézier
Définition d'une courbe de Bézier
Formulation paramétrique
Une courbe de Bézier de degré est définie par points de contrôle :
Cas cubique détaillé
Pour 4 points de contrôle :
En coordonnées :
Propriétés géométriques
Passage par les extrémités
La courbe passe par le premier et le dernier point de contrôle :
Les points intermédiaires « attirent » la courbe mais ne sont généralement pas sur la courbe.
Tangentes aux extrémités
La tangente en est dirigée vers :
La tangente en est dirigée depuis :
Pour une courbe cubique :
Enveloppe convexe
La courbe de Bézier est entièrement contenue dans l'enveloppe convexe de ses points de contrôle.
Contrôle intuitif
Cette propriété garantit que la courbe ne s'éloigne jamais « trop » des points de contrôle. Les designers peuvent ainsi prédire approximativement où passera la courbe.
Invariance affine
Les transformations affines (translation, rotation, mise à l'échelle) peuvent être appliquées directement aux points de contrôle.
Représentation matricielle
Forme matricielle
La courbe de Bézier cubique peut s'écrire :
où :
Vérification
Développons le produit pour :
Donc
Exemple numérique
Points de contrôle
| Point | x | y |
|---|---|---|
| 0 | 0 | |
| 1 | 2 | |
| 3 | 2 | |
| 4 | 0 |
Calcul en u = 0.5
Le point milieu de la courbe est donc .
Courbe de Bézier cubique
B(u) = Σᵢ Pᵢ · Bᵢ,₃(u) pour u ∈ [0, 1]
Extrémités
B(0) = P₀, B(1) = P₃
Tangentes
B'(0) ∝ P₁-P₀, B'(1) ∝ P₃-P₂
Raccordement de courbes
Continuité C⁰
Deux courbes sont raccordées en si elles partagent un point :
Continuité C¹
Pour une continuité de la tangente, les trois points doivent être alignés :
avec pour le même sens.
Continuité G¹
Si on demande seulement la même direction (pas la même magnitude), on parle de continuité géométrique .
Courbes de Bézier fermées
Construction
Pour créer une courbe fermée, on peut joindre plusieurs segments de Bézier en boucle, en assurant la continuité au point de fermeture.
Extension aux surfaces
Surfaces de Bézier
Une surface de Bézier bicubique est définie par une grille de points de contrôle :
où .
Cette formulation est très utilisée en modélisation 3D.
Algorithme Python
import numpy as np
def bernstein(n, i, u):
"""
Calcule le polynôme de Bernstein B_{i,n}(u).
"""
from math import comb
return comb(n, i) * (u ** i) * ((1 - u) ** (n - i))
def bezier_curve(control_points, num_points=100):
"""
Génère une courbe de Bézier.
Paramètres:
control_points : liste de points [(x0,y0), (x1,y1), ...]
num_points : nombre de points à générer
Retourne:
points : tableau (num_points, 2) des coordonnées
"""
P = np.array(control_points)
n = len(P) - 1
u_values = np.linspace(0, 1, num_points)
curve = np.zeros((num_points, 2))
for k, u in enumerate(u_values):
point = np.zeros(2)
for i in range(n + 1):
point += P[i] * bernstein(n, i, u)
curve[k] = point
return curve
def bezier_matrix_cubic(control_points, u):
"""
Évalue une courbe de Bézier cubique par la forme matricielle.
"""
P = np.array(control_points)
M_bez = np.array([
[-1, 3, -3, 1],
[ 3, -6, 3, 0],
[-3, 3, 0, 0],
[ 1, 0, 0, 0]
])
U = np.array([u**3, u**2, u, 1])
return U @ M_bez @ P
def bezier_tangent_cubic(control_points, u):
"""
Calcule la tangente à une courbe de Bézier cubique.
"""
P = np.array(control_points)
n = 3
# Dérivée : utilise les différences des points de contrôle
dP = n * np.diff(P, axis=0) # Points de la courbe dérivée
# La dérivée est une Bézier de degré n-1
tangent = np.zeros(2)
for i in range(n):
tangent += dP[i] * bernstein(n - 1, i, u)
return tangent
# Exemple
points = [(0, 0), (1, 2), (3, 2), (4, 0)]
# Générer la courbe
curve = bezier_curve(points, 50)
print("Points de la courbe de Bézier :")
for u in [0, 0.25, 0.5, 0.75, 1.0]:
pt = bezier_matrix_cubic(points, u)
print(f" C({u}) = ({pt[0]:.3f}, {pt[1]:.3f})")
print("\nTangentes :")
for u in [0, 0.5, 1.0]:
tang = bezier_tangent_cubic(points, u)
print(f" C'({u}) = ({tang[0]:.3f}, {tang[1]:.3f})")Résumé
| Concept | Description |
|---|---|
| Polynômes de Bernstein | |
| Courbe de Bézier | |
| Passage aux extrémités | , |
| Tangentes | Dirigées par et |
| Enveloppe convexe | La courbe reste dans l'enveloppe des points |
Pour aller plus loin
La prochaine leçon présentera les courbes B-spline, qui offrent un meilleur contrôle local : modifier un point de contrôle n'affecte qu'une partie de la courbe, contrairement aux courbes de Bézier où tout changement affecte l'ensemble.