bÉzierove krive

20
BÉZIEROVE KRIVE Miloš Novković Nikola Ristovski Uroš Stegić Željko Jovanović

Upload: duc

Post on 19-Mar-2016

105 views

Category:

Documents


1 download

DESCRIPTION

Miloš Novković Nikola Ristovski Uroš Stegić Željko Jovanović. BÉZIEROVE KRIVE. OPIS BÉZIEROVE KRIVE. Označimo sa P skup određenih tačaka u ravni; P = {P 1 , P 2 , ... , P n } Bezierova kriva je zadata sa:. CRTANJE BÉZIEROVE KRIVE. Algoritam aproksimacija(Tacka *ktacke, int n) - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: BÉZIEROVE KRIVE

BÉZIEROVE KRIVE

Miloš NovkovićNikola Ristovski

Uroš StegićŽeljko Jovanović

Page 2: BÉZIEROVE KRIVE

OPIS BÉZIEROVE KRIVE

Označimo sa P skup određenih tačaka u ravni;

P = {P1, P2, ... , Pn} Bezierova kriva je zadata sa:

Page 3: BÉZIEROVE KRIVE

CRTANJE BÉZIEROVE KRIVE

Algoritam aproksimacija(Tacka *ktacke, int n)

Ulaz: kontrolne tačke smeštene u niz (Tacka *ktacke), dimenzija niza (int n);

Izlaz: niz tačaka, dimenzije 1000, koji predstavlja aproksimaciju Bezierove krive (Tacka *P).

begin

P[0] = ktacke[0]

koef = 0.001

lambda = koef

Page 4: BÉZIEROVE KRIVE

CRTANJE BÉZIEROVE KRIVE

i = 0

while i < 1000 do

while j < n do

niz[j] = ktacke[j]

P[i] = deCasteljau(niz, n, lambda)

i++

lambda += koef

return P

end

Page 5: BÉZIEROVE KRIVE

CRTANJE BÉZIEROVE KRIVEAlgoritam deCasteljau(Tacka *ktacke, int n, float l)

Ulaz: niz kontrolnih tačaka, njegova dimenzija, preciznost aproksimacije;

Izlaz: Tačka dobijena nakon n-2 iteracije algoritma deCasteljau.

begin

if(n == 2)

Tacka q

Tacka AB

AB.x = ktacke[1].x - ktacke[0].x

AB.y = ktacke[1].y - ktacke[0].y

MnozenjeSkalarom(AB,l,&q)

ZbirVektora(ktacke[0],q,&q)

return q

Page 6: BÉZIEROVE KRIVE

CRTANJE BÉZIEROVE KRIVE

else

i = 0

while i<n-1 do

AB.x = ktacke[i+1].x - ktacke[i].x

AB.y = ktacke[i+1].y - ktacke[i].y

MnozenjeSkalarom(AB,l,&q)

ZbirVektora(ktacke[i],q,&q)

P[i] = q

i++

return deCasteljau(P,n-1,l)

end

Page 7: BÉZIEROVE KRIVE

PROMENA STEPENA KRIVE

Algoritam PovecajStepen(Tacka* ktacke, int n, int m, Tacka* niz)

Ulaz: niz kontrolnih tačaka, njegova dimenzija, stepen povećanja i novi niz;

Izlaz: popunjen niz niz.

begin

i = 0

kopiranje niza ktacke u niz niz

i = 0

while i<m do

Stepen(niz,n+1)

end

Page 8: BÉZIEROVE KRIVE

PROMENA STEPENA KRIVE

Prva i zadnja (n-та) tačka u nizu ostaju iste jer se oblik krive ne menja. Od ostalih n-2 tačaka treba napraviti n-1, odnosno povećati stepen krive za jedan.

Svaka od tih tačaka se određuje pomoću formule:

Page 9: BÉZIEROVE KRIVE

PROMENA STEPENA KRIVE

Algoritam Stepen(Tacka* niz, int n)Ulaz: niz kontrolnih tačaka kome treba dodati još

jednu tačku, dimenziju niza;Izlaz: niz sa dodatom jednom tačkom.begin //proširivanje niza za jedan niz[n] = niz[n-1] i = n-1

Page 10: BÉZIEROVE KRIVE

PROMENA STEPENA KRIVE

while i>0 do

l, h - tacke

float w = (1.0 * i) / (n+1)

float v = 1 - ((1.0 * 1) / (n+1))

MnozenjeSkalarom(niz[i-1], w, &l)

MnozenjeSkalarom(niz[i], v, &h)

niz[i].x = l.x + h.x

noz[i].y = l.y + h.y

end

Složenost funkcije je О(m * n).

Page 11: BÉZIEROVE KRIVE

PODELA KRIVE

Algoritam sadrži sledeće korake:

1) Prva kontrolna tačka krive takođe je i prva kontrolna tačka nove krive, kao i da je zadnja kontrolna tačka krive zadnja kontrolna tačka druge krive.

2) Izračunamo vektor od prve do druge kontrolne tačke, uzmemo njegovu polovinu i dodamo na prvu tačku.Rezultat je nova tačka.

AB.x = ktacke[i+1].x - ktacke[i].x

AB.y = ktacke[i+1].y - ktacke[i].y

MnozenjeSkalarom(AB,l,&q)

ZbirVektora(ktacke[i],q,&q)

Page 12: BÉZIEROVE KRIVE

PODELA KRIVE

3) Ponavljamo korak 2) dok ne prođemo kroz sve tačke.

4) Ponavljamo korake 2) i 3) i svakim ponavljanjem imaćemo po jedan vektor manje. Ponavljanje se vrši dok ne dobijemo samo dve tačke, tj. Jedan vektor, odredimo njegovu polovinu i ta tačka predstavlja traženu tačku koja deli početnu Bezierovu krivu na dva jednaka dela.

Page 13: BÉZIEROVE KRIVE

PODELA KRIVE

Page 14: BÉZIEROVE KRIVE

PODELA KRIVE

Prvi set kontrolnih tačaka za prvu polovinu krive predstavljaju tačke dobijene u prvom deljenju vektora pri svakom od n deljenja,

tako da su kontrolne tačke prve polovine krivine (po oznakama na slici) 00, 10, 20, 30, 40, 50, 60.

Dalje primetimo da su kontrolne tačke druge krivedobijene pri svakom deljenju trenutnog poslednje vektora pri

svakom od n deljenja tako da su kontrolne tačke druge polovine krive (po oznakama na slici) 60, 51, 42, 33, 24, 15, 06.

Kao što možemo primetiti tačka koja se nalazi na sredini ili(po slici) 60 pripada obema krivima.

Page 15: BÉZIEROVE KRIVE

APROKSIMACIJA

Krivu možemo aproksimirati na dva načina: Koristeći formulu iz definicije De Casteljau-ovim algoritmom

Page 16: BÉZIEROVE KRIVE

APROKSIMACIJA

Page 17: BÉZIEROVE KRIVE

APROKSIMACIJA

Page 18: BÉZIEROVE KRIVE

APROKSIMACIJA

Page 19: BÉZIEROVE KRIVE

UPOTREBA

Najčešća mesta gde se sreću krive: Fontovi Vektorska grafika Animacije

Page 20: BÉZIEROVE KRIVE

DEMO