Considérons encore une courbe de Bézier définie par les points de contrôles P0,…,PN, où les Pi sont des points de Rm,m>=2.
Principe
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 P0i,i∈[0,N] est égale à la restriction de la courbe originale à t⩽1/2, et la courbe de Bézier de points de contrôle PiN−i,i∈[0,N] est égale à la restriction de la courbe originale à t⩾1/2.
On affiche ou mémorise le point de paramètre 1 / 2 (qui est P0N) 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.
Algorithme
- Initialisation: affecter le tableau des points de contrôle dans les Pi0
- Voir que le critère d'arrêt n'est pas vérifié: il y a plusieurs possibilités dont:
- Si on fait tous les calculs avec des nombres entiers, un choix peut être de s'arrêter lorsque tous les points sont confondus. (c'est-à-dire que la courbe n'est représentée que par un seul pixel)
- Si le calcul n'est pas fait sur des nombres entiers on peut s'arrêter quand les points sont distants d'une distance inférieure à une valeur choisie
- On effectue M itérations puis on relie les points obtenus (c'est-à-dire que l'on trace le polygone de Bézier), M étant déterminé empiriquement
- Calcul les points intermédiaires de l'algorithme : il y a deux méthodes possibles qui donnent finalement les mêmes points
- Méthode constructive (en construisant une suite de milieux): On définit itérativement les points P01,…,PN−11,P02,…,PN−22,…,P0N−1,P1N−1,P0N tels que Pij soit le milieu de [Pj−1iPj−1i+1]
- Méthode matricielle (en construisant directement les points comme barycentre, les coefficients étant donnés par les matrices de De Casteljau) :
(P00 ⋮ P0N)=D0N∗(P00 ⋮ PN0) et (P0N ⋮ PN0)=D1N∗(P00 ⋮ PN0)
- Mémorisation: on mémorise le point P0N qui est sur la courbe
- Appel récursif: on appelle l'algorithme sur les deux courbes de Bézier intermédiaires définies par les points P0i,i∈[0,n] d'une part, Pin−i,i∈[0,n] d'autre part.
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")
Complexité
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 O(N2∗2M) 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 2 points calculés).