Demonstrirati primjenu Bezierove krivulje za ostvarenje glatkog kretanja u trodimenzionalnoj sceni.
U opisu krivulje koristimo Bernsteinove polinome te realni parametar t u rasponu vrijednosti od 0 do 1. Definiramo funkciju za izračun polinoma:
double bernstein (int i, int n, double t) { return (double) faktorijela (n) / (faktorijela (i) * faktorijela (n-i)) * pow (t, i) * pow (1-t, n-i); }
Krivulja je definirana koordinatama kontrolnih točaka, koje se učitavaju iz ulazne datoteke. Za podatke o pojedinoj točki imamo na raspolaganju sljedeću strukturu:
typedef struct { double x, y, z; long xp, yp, zp, i; } tocka_t;
u kojoj su pohranjene radne koordinate iz ulazne datoteke. Ostali podaci u strukturi se ne koriste; oni su od značaja samo kod ostalih, "običnih" točaka koje su dio tijela u prostoru scene.
Kontrolne točke, koje zajedno formiraju krivulju, povezane su u nizu:
tocka_t putanja_t[];
Broj kontrolnih točaka čuvamo u varijabli:
int putanja_n;
Pomoću tih podataka izračunava se konkretan položaj gledišta na krivulji na način da se parametar t mijenja od početne vrijednosti 0 postupno sve do konačne vrijednosti 1.
Funkcija koja izračunava položaj na putanji je sljedeća. Ulazni parametar je t, a vrijednosti koje funkcija vraća su koordinate tražene točke na krivulji u sustavu scene:
void putanja (double t, double *x, double *y, double *z) { int i; if (t >= 0.0 && t <= 1.0) { *x = *y = *z = 0; for (i=0; i < putanja_n+1; i++) { *x += putanja_t[i].x * bernstein (i, putanja_n, t); *y += putanja_t[i].y * bernstein (i, putanja_n, t); *z += putanja_t[i].z * bernstein (i, putanja_n, t); } } }
Program očekuje da mu se navede ulazna datoteka kao parametar:
Lab8.exe ulaz.txt
Ulazna datoteka je u sljedećem formatu: u prvoj liniji navedene su koordinate očišta, zatim koordinate gledišta, onda slijedi niz točaka tijela koje treba iscrtati – za svaku točku navode se koordinate x, y i z. Nakon toga slijedi krivulja kretanja, također zadana kao niz koordinata kontrolnih točaka.
Primjer ulazne datoteke:
300 400 250 0 0 100 4 4 75 75 0 -75 75 0 -75 -75 0 75 -75 0 50 50 30 -50 50 30 -50 -50 30 50 -50 30 50 50 60 -50 50 60 -50 -50 60 50 -50 60 150 150 160 -150 150 160 -150 -150 160 150 -150 160 150 150 200 -150 150 200 -150 -150 200 150 -150 200 0 0 470 0 500 1200 0 750 0 -10 750 0 -500 750 0 -750 0 0 -750 -750 50 0 -750 100 750 -750 150 750 0 200 750 750 250 -8 750 300 0 -5 1500
Ante Radman, Laboratorijske vježbe iz Računalne grafike, šk. godina 2003/2004.