L'algorithme de De Casteljau est un algorithme récursif trouvé par Paul de Casteljau pour approximer efficacement les polynômes écrit dans la base de Bernstein.
Cet algorithme peut être utilisé pour dessiner des courbes et des surfaces de Bézier. L'idée principale dans ce cas repose sur le fait qu'une restriction d'une courbe de Bézier est aussi une courbe de Bézier. L'algorithme calcule de manière efficace le point de parametre t = T et les points de contrôle des courbes de la restriction à et à . On applique alors de nouveau l'algorithme sur les deux restrictions jusqu'à réaliser un critère donné (celui-ci peut être par exemple que la précision soit inférieure au pixel).
Cet algorithme semble ne plus être le plus efficace car il ne permettrait pas d'utiliser l'antialiasing étant donné qu'il travaille pixel par pixel et ne donne pas d'information sur la tangente.
Historiquement, c'est avec cet algorithme que les travaux de M. De Casteljau commençaient en 1959 chez Citroën. Ils étaient publiés comme des rapports techniques, tenus très au secret par Citroën.
Ces travaux restèrent inconnus jusqu'en 1975 quand W. Böhm en a pris connaissance et les a rendu public. Cet algorithme a été très utile pour l'informatique qui utilise les courbes de bézier dans de nombreux cas (logiciels de dessin, de modélisation, ...), et sans lequel le développement de l'utilisation des courbes de Pierre Bezier n'aurait pas pu se faire.
Considérons encore une courbe de Bézier définie par les points de contrôles , où les Pi sont des points de .
On va ici appliquer l'algorithme précédent pour trouver le point de paramètre 1 / 2, et conserver les barycentres intermédiaires. En effet, la courbe de Bézier de points de contrôle est égale à la restriction de la courbe originale à , et la courbe de Bézier de points de contrôle est égale à la restriction de la courbe originale à .
On affiche ou mémorise le point de paramètre 1 / 2 (qui est ) et applique récursivement l'algorithme sur les deux courbes (de même nombre de points de contrôle que l'originale). On s'arrête quand un critère à choisir est vérifié (typiquement la distance entre les points inférieure à une limite).
Plutôt que le paramètre 1 / 2, on pourrait prendre un paramètre quelconque et l'algorithme fonctionnerait encore, mais le paramètre 1 / 2 est celui qui converge en moyenne le plus rapidement. Le paramètre 1 / 2 est aussi celui pour lequel les calculs sont les plus rapides quand l'on travaille en coordonnées entières : le calcul de chaque barycentre se fait par une addition et un décalage à droite pour chaque coordonnée, c'est à dire sans multiplication ni division.
et
Voici un exemple d'implémentation de l'algorithme en pseudo-code avec pour critère d'arrêt l'égalité des points (on travaille donc sur des entiers) et la construction constructives pour calculer les points intermédiaires:
Entrée: tableau T[0][0...N] des coordonnées des points de contrôle.
Si T[0][0] = T[0][1] = ... = T[0][N] //si le critère d'arrêt est vérifié on s'arrête alors | | fin | Sinon //pour dessiner | | // Calcul des points intermédiaires | Pour i de 1 à N faire | | | | Pour j de 0 à N-i faire | | | | | | T[i][j] = milieu de T[i-1][j] T[i-1][j+1] | | Afficher T[N][0] // Afficher (ou stocker) le point milieu | | // Construction des courbes restreintes | Pour i de 0 à N faire | | | | T'[i] = T[i][0] | | T"[i] = T[N-i][i] | | // Appel récursif | de_Casteljau(T') | de_Casteljau(T")
Si on prend comme critère d'arrêt un nombre d'appels récursifs constant, comme le nombre de points de contrôle est constant pendant les appels récursifs reste constant et qu'à chaque étape de récursion on double le nombre de courbes étudiées, la complexité de l'algorithme est en avec M le nombre de récursions (mais il est linéaire en nombre de points calculés car pour M itérations il y a 2M points calculés).