De Kasteljau algoritam

S Vikipedije, slobodne enciklopedije

De Kasteljau algoritam se koristi za određivanje tačke na Bezijerovoj krivoj, za neko . Naziv je dobio po Polu de Kasteljau. Ovaj algoritam se takođe može primeniti za podelu jedne Bezijerove krive na dve, u zavisnosti od parametra , a može se primeniti i za određivanje tangente na Bezijerovu krivu u tački .

De-Kasteljau algoritam[uredi | uredi izvor]

Određivanje tačke na Bezijerovoj krivoj stepena 3, za t=0.6

Osnovna ideja de Kasteljau-ovog algoritma je izbor tačke na duži takve da deli duž u razmeri . Tada je tačka , koja deli duž u tom odnosu, data sa:

Označimo kontrolne tačke na sledeći način: , gde prvi indeks označava broj iteracije (ovde je , a kasnije će biti ).

Pretpostavimo da želimo da odredimo tačku , ѕa fiksirano . Počinjemo od poligonalne linije i koristeći formulu nalazimo tačku koja deli duž određenu tačkama i u odnosu . Na ovaj način dobijamo tačaka koje definišu novu poligonalnu liniju sastavljenu od duži. Primenjujući prethodni postupak na novu poligonalnu liniju dobijamo i drugu liniju od tačaka i duži. Ponavljajući ovaj proces puta, dobijamo jednu tačku . De Kasteljau je dokazao da je upravo to tačka na krivoj koja odgovara parametru .

Kodovi u programskom jeziku C[uredi | uredi izvor]

Iterativna implementacija de Kasteljau algoritma[uredi | uredi izvor]

     _tacka DeCasteljau(_tacka P[],int n,int t)
     {
      _tacka Q[MAX];
      int k;
     
      for(i=0;i<n;i++)
        Q[i]=P[i];
     
      for(k=1;k<n;k++)
        for(i=0;i<n-k;i++)
        {
          Q[i].x=(1-t)*Q[i].x+t*Q[t+1].x;
          Q[i].y=(1-t)*Q[i].y+t*Q[t+1].y;
        }
     
      return Q[0];
     }

Izvršavanje se vrši po principu ilustrovanom na slici.

Rekurzivna implementacija de Kasteljau algoritma[uredi | uredi izvor]

Prethodno izračunavanje može se izvršiti i rekurzivno. Neka su kontrolne tačke , za . Svaka sledeća iteracija (broj iteracije označava prvi indeks) se računa prema sledećoj formuli: Koristeći ovu ideju, formiramo rekurzivnu proceduru:

     tacka deCasteljau(int i, int j, tacka P[])
     {
       if(i == 0)
         return P[j];
       else
       {
         pom1 = deCasteljau(i-1,j);
         pom2 = deCasteljau(i-1,j+1);
         tacka T;
         T.x = pom1.x * (1-t) + pom2.x * t;
         T.y = pom1.y * (1-t) + pom2.y * t;
         return T;
       }
     }

Iako procedura deluje jednostavno i kratko, veoma je neefikasna. Da bi izračunali , pozivamo funkciju deCasteljau(n,0), a ona se u ELSE delu poziva još dva puta. Problem je u tome što se skoro sve funkcije za računanje pozivaju više od jednom. Složenost ovog izračunavanja istovetna je složenosti izračunavanja n-tog člana Fibonačijevog niza. Složenost se može popraviti tehnikom memoizacije, tako što bi se odgovorajuće vrednosti čuvale i više puta koristile u postupku izračunavanja.

Podela krive na dva dela[uredi | uredi izvor]

Podela Bezijerove krive na dva dela - kontrolna poligonalna linija levog dela krive
Podela Bezijerove krive na dva dela - kontrolna poligonalna linija desnog dela krive

Smisao podele krive je da "isečemo" datu Bezijerovu krivu u tački , za neko , na dva dela, od kojih je svaki i dalje Bezijerova kriva. Rezultujuće Bezijerove krive moraju zadate su svojim kontrolnim tačkama, tako da se početni skup kontrolnih tačaka odbacuje. Pošto se početna kriva stepena deli na dve krive, od kojih je svaka podskup početne -dimenzione Bezijerove krive, i rezultujuće krive moraju biti -tog stepena.

Algoritam za podelu Bezijerove krive u tački za fiksirano se bazira na de Kasteljau algorimu za određivanje tačke na krivoj.

Krivu delimo na dve krive i . Bezijerova kriva je određena konrolnim tačkama:

Bezijerova kriva je određena konrolnim tačkama:

Podela krive ima veliki broj primena. Na primer, može se koristiti za određivanje preseka dve Bezijerove krive, renderovanje Bezijerove krive, a i olakšava dizajn krivih.

Tangenta na Bezijerovu krivu[uredi | uredi izvor]

De Kasteljau algoritam se može primeniti i za određivanje tangete na Bezijerovu krivu u tački . Vektor pravca tangente predstavlja vektor .

Povećanje stepena krive[uredi | uredi izvor]

Povećanje stepena Bezijerove krive
Odnos na svakoj duži početne poligonalne linije za n=3

Iako Bezijerove krive višeg stepena zahtevaju više vremena za obradu, one su pogodnije za dizajniranje različitih oblika. Stoga bi bilo od velike pomoći da se povisi stepen Bezijerove krive bez promene njenog oblika. Očuvanje oblika krive je ključni zahtev, jer, u suprotnom, povećanje stepena Bezijerove krive ne bi imalo praktičnog smisla.

Pretpostavimo da imamo Bezijerovu krivu stepena određenu sa kontrolnih tačaka i da želimo da povisimo njen stepen za bez promene njenog oblika. Kako je Bezijerova kriva -og stepena definisana sa kontrolne tačke, potrebno je da nađemo takav novi skup kontrolnih tačaka. Neka je novi skup kontrolnih tačaka. Pošto početak i kraj krive ostaju fiksirani uzimamo , a ostale tačke se određuju koristeći sledeću formulu:

Svaka duž početne poligonalne linije sadrži tačno jednu novu kontrolnu tačku. Preciznije, duž sadrži novu kontrolnu tačku . Iz formule za računanje novih kontrolnih tačaka, vidimo da deli duž u odnosu . Za razliku od de Kasteljau algoritma, ovaj odnos nije konstantan već zavisi od vrednosti parametra .

Kad dobijemo skup kontrolnih tačaka, početni skup može biti odbačen. Kako svaka duž početne poligonalne linije sadrži novu kontrolnu tačku, proces zamene starog skupa novim može se posmatrati kao odsecanje uglova u početnim kontrolnim tačkama.

Ukoliko želimo veće povećanje stepena krive, na primer za , onda se ovaj postupak ponavlja puta. Stepen krive može se povećavati dok god to sistem dozvoljava, pri čemu se sa povećanjem broja kontrolnih tačaka poligonalna linija približava krivoj.

Smanjenje stepena Bezijerove krive bez promene njenog oblika, u opštem slučaju, nije moguće. Stepen krive je moguće smanjiti jedino ako je stepen prethodno bio povećan, tj. ako je ta kriva suštinski kriva manjeg stepena.

Literatura[uredi | uredi izvor]

  • T. Šukilović, S. Vukmirović (2015). Geometrija ѕa informatičare. Matematički fakultet, Beograd. str. 143—147. ISBN 978-86-7589-106-2. 

Vidi još[uredi | uredi izvor]

Spoljašnje veze[uredi | uredi izvor]