8. Prikaz prostornih krivulja postupkom Beziera

49 KB
Lab8.zip

ZADATAK VJEŽBE

Demonstrirati primjenu Bezierove krivulje za ostvarenje glatkog kretanja u trodimenzionalnoj sceni.

PROGRAMSKO OSTVARENJE

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);
        }
    }
}

UPUTE ZA KORIŠTENJE

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.