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 :

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

Degré n :
Propriété de partition de l'unité : Σᵢ Bᵢ,ₙ(u) = 1 pour tout u ∈ [0,1]

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

Pointxy
00
12
32
40

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]

u =0.50
P0P1P2P3

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 :

.

Cette formulation est très utilisée en modélisation 3D.


Algorithme Python

bezier.pypython
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é

ConceptDescription
Polynômes de Bernstein
Courbe de Bézier
Passage aux extrémités,
TangentesDirigées par et
Enveloppe convexeLa 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.