Algoritmul Casteljau

Casteljau Algoritmul este un algoritm recursiv găsit de către Paul de Casteljau pentru a aproxima eficient polinoame scrise în baza Bernstein .

Acest algoritm poate fi folosit pentru a desena curbe și suprafețe Bézier . Ideea principală în acest caz este că o restricție a unei curbe Bézier este, de asemenea, o curbă Bézier. Algoritmul calculează eficient punctul parametrului și punctele de control ale curbelor de la și la restricții . Algoritmul este apoi aplicat din nou la cele două restricții până când se atinge un criteriu dat (acest criteriu poate fi, de exemplu, că precizia este mai mică de un pixel).

Acest algoritm pare să nu mai fie cel mai eficient deoarece nu ar permite utilizarea antialiasingului dat fiind că funcționează pixel cu pixel și nu oferă informații despre tangentă.

Istoric

Din punct de vedere istoric, cu acest algoritm lucrarea lui M. de Casteljau a început în 1959 la Citroën. Au fost publicate ca rapoarte tehnice, păstrate foarte secrete de Citroën .

Aceste lucrări au rămas necunoscute până în 1975 când W. Böhm a luat cunoștință de ele și le-a făcut publice. Acest algoritm a fost foarte util pentru prelucrarea datelor care utilizează curbele Bézier în multe cazuri (desen, software de modelare etc.) și fără de care nu ar fi fost posibilă dezvoltarea utilizării curbelor Pierre Bézier .

Algoritmul pentru calcularea unui punct

Principiu

Luați în considerare o curbă Bézier definită de punctele de control , unde sunt puncte ale . Aici vrem pur și simplu să calculăm punctul parametrului .

Așa cum se poate vedea în imagine, prin calcularea baricentrelor parametrilor punctelor de control consecutive ale curbei, apoi baricentrele acelorași parametri ai acestor baricentri și așa mai departe iterativ, definim în acest fel o serie de liste de puncte care vom indexa , unde este baricentrul . Ultima listă conține de fapt doar un punct, care este punctul curbei parametrilor .

Algoritm

În pseudo-cod, aceasta oferă:

// Calcul des points intermédiaires Pour j de 1 à N faire | | Pour i de 0 à N-j faire | | | | T[i][j] = t*T[i+1][j-1] + (1-t)*T[i][j-1] | | | Afficher T[0][N] // Afficher (ou stocker) le point

Dovezi ale algoritmului

Pentru a demonstra algoritmul, este necesar să se demonstreze prin inducție limitată că

Și aplicați formula în , care ne dă rezultatul direct.

Recurența este ușor demonstrată prin utilizarea proprietății de construcție a punctelor pentru a împărți suma în două, apoi pentru a face o schimbare a indicelui și folosirea unei proprietăți a polinoamelor Bernstein pentru a combina cele două sume. Pentru reintegrarea cazurilor speciale, este necesar să se utilizeze alte două proprietăți ale polinoamelor Bernstein: și

Complexitate

Execuția unui pas al algoritmului este pătratică în număr de puncte de control ale curbei (bucla imbricată dă naștere la operații).

Algoritmul în cazul curbelor Bézier

Luați în considerare din nou o curbă Bézier definită de punctele de control , unde sunt puncte ale .

Principiu

Aici vom aplica algoritmul anterior pentru a găsi punctul parametrului și pentru a păstra baricentrele intermediare. Acest lucru se datorează faptului că curba Bézier a punctelor de control este egală cu restricția curbei inițiale la , iar curba Bézier a punctelor de control este egală cu restricția curbei originale la .

Afișăm sau stocăm punctul parametrului (care este ) și aplicăm recursiv algoritmul la cele două curbe (cu același număr de puncte de control ca originalul). Se oprește când se verifică un criteriu care trebuie ales (de obicei distanța dintre punctele inferioare unei limite).

Mai degrabă decât parametrul , am putea lua orice parametru și algoritmul ar funcționa în continuare, dar parametrul este cel care converge în medie cel mai rapid. Parametrul este, de asemenea, cel pentru care calculele sunt cele mai rapide atunci când se lucrează în coordonate întregi: calculul fiecărui baricentr se face printr-o adunare și o schimbare dreaptă pentru fiecare coordonată, adică fără înmulțire și nici împărțire.

Algoritm

și

Iată un exemplu de implementare a algoritmului în pseudo-cod cu criteriul de oprire egalitatea punctelor (prin urmare lucrăm la numere întregi) și construcția constructivă pentru a calcula punctele intermediare:

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")

Complexitate

Dacă luăm drept criteriu de oprire un număr constant de apeluri recursive, deoarece numărul de puncte de control este constant în timpul apelurilor recursive rămâne constant și că la fiecare pas de recursivitate dublăm numărul de curbe studiate, complexitatea algoritmului este cu numărul a recursiunilor (dar este liniar ca număr de puncte calculate deoarece pentru iterații există puncte calculate).

Algoritmul în cazul suprafețelor Bézier

O suprafață Bézier este definită printr-o sumă dublă de puncte:

Principiul algoritmului este de a rescrie formula în forma:

și prin redenumire , obținem

Observând că sunt punctele curbelor Bézier, ajunge principiul algoritmului. La fiecare iterație a algoritmului

Vezi și tu

Bibliografie

<img src="https://fr.wikipedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" title="" width="1" height="1" style="border: none; position: absolute;">