De Kasteljau algoritam

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

 
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

Iterativna implementacija de Kasteljau algoritma uredi

 
     _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

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

 
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

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

 
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

  • 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

Spoljašnje veze uredi