Grafika Komputerowa i wizualizacja

15
Grafika Komputerowa i wizualizacja Algorytmy rastrowe

description

Grafika Komputerowa i wizualizacja. Algorytmy rastrowe. Wprowadzenie. W urządzeniu rastrowym obraz (kartka, ekran monitora i inne) składa się ze skończonej liczby podstawowych elementów nazywanych pikselami. - PowerPoint PPT Presentation

Transcript of Grafika Komputerowa i wizualizacja

Page 1: Grafika Komputerowa i wizualizacja

Grafika Komputerowa i wizualizacja

Algorytmy rastrowe

Page 2: Grafika Komputerowa i wizualizacja

Wprowadzenie• W urządzeniu rastrowym obraz (kartka, ekran monitora i inne)

składa się ze skończonej liczby podstawowych elementów nazywanych pikselami.

• Elementy te uporządkowane tworzą siatkę prostokątną. Wielkość lxk określa rozdzielczość danego urządzenia graficznego, a odległość między środkami sąsiednich pikseli w poziomie do odległości w pionie określa wartość aspektu danego urządzenia.

• Np. dla karty CGA aspekt=22/25, a dla karty EGA=4/5. Każdy rysunek rysowany na urządzeniu rastrowym tworzy się przez wyświetlenie (zaznaczenie) skończonej liczby pikseli.

• Problemem staje się wtedy wybór dyskretnego zbioru pikseli odwzorowującego np. krzywą ciągłą na płaszczyźnie.

Page 3: Grafika Komputerowa i wizualizacja

Rysowanie odcinka – algorytm Bresenhama - założenia

• W większości zastosowań praktycznych dysponujemy współrzędnymi rzeczywistymi. Aby narysować odcinek we współrzędnych rastrowych musimy przejść do współrzędnych całkowitoliczbowych.

• Będzie rozważany zbiór pikseli ośmiospójny. Załóżmy, że x0<xk, 0<dy/dx/=1.

Page 4: Grafika Komputerowa i wizualizacja

Rysowanie odcinka – algorytm Bresenhama - algorytm

• Zaczynamy od piksela P(x0,y0). Ponieważ kąt nachylenia odcinka jest mniejszy od 45 stopni to następny piksel wybieramy pośród Si+1=(xi+1,yi) i Ti+1=(xi+1,yi+1).

• Wielkości s i t występujące na rysunku określone są wzorami:– s=dy/dx(xi+1-x0)-yi-y0,

– t=(yi+1-y0)-dy/dx(xi+1-x0).

Page 5: Grafika Komputerowa i wizualizacja

Rysowanie odcinka – algorytm Bresenhama - algorytm

• Odejmując od siebie stronami oraz mnożąc przez dxi oznaczając ta wielkość przez di mamy:– di=(s-t)dx=2dy(xi-x0)-2dx(yi-y0)+2dy-dx.

• Ponieważ dx>0, to znak di określa, która z wielkości s i t jest większa.

• Jeżeli di>0, to s>t i za Pi+1 przyjmiemy piksel Ti+1, w przeciwnym przypadku jeżeli di<0, to wybierzemy Si+1.

• Jeżeli di=0, to oba piksele leżą w tej samej odległości i możemy założyć, że wybieramy np. Pi+1=Ti+1.

Page 6: Grafika Komputerowa i wizualizacja

Rysowanie odcinka – algorytm Bresenhama - algorytm

• Dalej możemy zmniejszyć koszt obliczeń badając zachowanie wzoru na di dla i+1. Mamy: di+1=2dy(xi+1-x0)-2dx(yi+1-y0)+2dy-dx. Po odjęciu od siebie stronami mamy:– di+1-di=2dy(xi+1-xi)-2dx(yi+1-yi).

• Stąd, ponieważ xi+1-xi=1, zachodzi:– di+1=di+2dy-2dx(yi+1-yi).

Page 7: Grafika Komputerowa i wizualizacja

Rysowanie odcinka – algorytm Bresenhama - algorytm

• Jeżeli di>0 (wybieramy Pi+1=Ti+1) to zależność powyższa upraszcza się do postaci:– di+1=di+2(dy-dx),

• a jeżeli di<0 to ponieważ yi+1=yi mamy:– di+1=di+2dy.

• Aby zależności rekurencyjne działały określamy wartość di dla i=0:– d0=2dy-dx.

Page 8: Grafika Komputerowa i wizualizacja

Podsumowanie – algorytm końcowy (jedna z możliwych

implementacji)• Zadanie: narysować odcinek łączący P0(x0,y0)

z Pk(xk,yk) przy założeniu:– dx=xk-x0>0, dy=yk-y0>0, 0<dy/dx<=1.

1. Rysujemy P0=(round(x0), round(y0)), 2. d0=2dy-dx3. i=0, 1,…,k

1. di <=0 =>di+1= di + 2dy, di >0 =>di+1= di + 2(dy-dx)

2. di+1<0=>Si+1, di+1>0=> Ti+1, gdy di+1=0, to losowy

Page 9: Grafika Komputerowa i wizualizacja

Rysowanie odcinka – algorytm Bresenhama - podsumowanie

• Ostatecznie widać, że algorytm ogranicza się do działania na liczbach całkowitych. Zgodnie z przyjętymi oznaczeniami i założeniami możemy oznaczyć wybór punktu Ti+1 jako T, a Si+1 jako S. Rysowanie odcinka możemy zapisać jako ciąg S i T, np. SSSTTTSSSTTT itd. lub (SSSTTT)^2 lub (S^3T^3)^2. Umożliwia to kompresję danych.

Page 10: Grafika Komputerowa i wizualizacja

Rysowanie okręgu – algorytm Bresenhama

• W przypadku rysowania okręgu wartość aspektu jest ważna. Dlatego przyjmujemy, że mając dany układ rzeczywisty OXY i pikselowy oxy związki między tymi układami są następujące:– X=ax, Y=y.

• Uprościmy rysowanie okręgu do okręgu w środku układu i do promienia całkowitoliczbowego. Zadanie polega więc na przybliżeniu krzywej wybranym układem pikseli:– X2+Y2=R2

• lub we współrzędnych ekranowych• (ax)2+y2=R2.

Page 11: Grafika Komputerowa i wizualizacja

Rysowanie okręgu – algorytm von Akenema

• Przyjmijmy, że a=p/q, a stąd mamy powyższą zależność możemy zapisać w postaci funkcyjnej:– f(x,y)=p2x2+q2y2-q2R2=0.

• Stosujemy układ ośmiokierunkowy (ośmiopikselowy) i ze względu na symetrię ograniczymy się do pierwszej ćwiartki.

• Zaczynamy od piksela P0(0,R). • Punkt, w którym współczynnik kierunkowy wektora

stycznego: dy/dx=-fx/fy=-2p2x/(2q2y)=-1 dzieli ćwiartkę okręgu na dwa fragmenty.

• W pierwszym fragmencie, dla którego zachodzi p2x<q2y (rysunek powyżej) zwiększamy kolejno wartości x o jeden i wybieramy spośród pikseli oznaczonych jako A i B.

• W drugim fragmencie (rysunek obok) wybieramy między pikselami C i B. O wyborze będzie decydować wartość funkcji w punkcie S (algorytm Van Akenema). W pierwszym przypadku obliczamy: fsi=f(xi+1,yi-1/2).

Page 12: Grafika Komputerowa i wizualizacja

Rysowanie okręgu – algorytm von Akenema

• Jeżeli fsi=f(xi+1,yi-1/2)>0 to punkt S leży na zewnątrz okręgu i wtedy jako Pi+1 wybieramy punkt B.

• Jeżeli fsi=f(xi+1,yi-1/2)<0 to S leży wewnątrz okręgu i wybieramy wtedy punkt A. Dla drugiego przypadku obliczamy fsi=f(xi+1/2,yi-1) i wybieramy – Pi+1=C, gdy fsi>0 i – Pi+1=B gdy fsi<0.

Page 13: Grafika Komputerowa i wizualizacja

Rysowanie okręgu – algorytm von Akenema

• Jeżeli fsi=0, to wybieramy dowolny punkt. Dla startowego piksela P0(0,R) mamy:– fs0=f(x0+1,y0-1/2)=p2(0+1)2+q2(R-1/2)2-q2R2=p2-q2R+q2/4

• Dla pierwszego wariantu (p2x<q2y) mamy. Przy przejściu od Pi do Pi+1=A mamy – xi+1=xi+1, yi+1=yi

• i stąd:– f(xi+1+1,yi+1-1/2)=p2(xi+1+1)2+q2(yi+1-1/2)2-q2R2= p2(xi+1+1)2+q2(yi-

1/2)2-q2R2 = =f(xi+1,yi-1/2)+2p2xi+1+p2

• lub krócej na podstawie fsi=f(xi+1,yi-1/2)– fsi+1=fsi+2p2xi+1+p2.

Page 14: Grafika Komputerowa i wizualizacja

Rysowanie okręgu – algorytm von Akenema

• W drugim przypadku (przy przejściu od Pi do Pi+1=B) mamy xi+1=xi+1, yi=yi-1 i zachodzi:– f(xi+1+1,yi+1-1/2)=p2(xi+1+1)2+q2(yi-1/2-1)2-q2R2=f(xi+1,yi-1/2)+2p2xi+1+p2-2q2yi+1

• lub krócej – fsi+1=fsi+2p2xi+1+p2-2q2yi+1.

• Dla drugiego wariantu możemy przeprowadzić podobne rozważania otrzymamy wtedy:

• dla przejścia od Pi do Pi+1=B (xi+1=xi+1, yi+1=yi-1) mamy – f(xi+1+1,yi+1-1/2)=p2(xi+1+1)2+q2(yi-1-1/2)2-q2R2=f(xi+1,yi-1/2)+2p2xi+1+p2-2q2yi+1

• A po uproszczeniach– fsi+1=fsi+2p2xi+1+p2-2q2yi+1.

• dla przejścia od Pi do Pi+1=C (xi+1=xi, yi+1=yi-1) mamy– fsi+1=fsi-2q2yi+1+q2.

Page 15: Grafika Komputerowa i wizualizacja

Rysowanie okręgu – inne algorytmy• W przypadku, gdy chcemy wyznaczyć punkty okręgu niekoniecznie wszystkie

piksele sąsiednie można skorzystać z innej metody. Polega ona na tym ,że okrąg możemy zapisać we współrzędnych biegunowych następująco:

– X=Rcos, – Y=Rsin,

• Gdzie <0,360). Łatwo otrzymujemy:– dX/d=-Rsin=-Y, – dY/d=Rcos=X

• z warunkami początkowymi: – X(0)=R, – Y(0)=0.

• Taki układ możemy rozwiązać np. z krokiem h=360/(N+1)np. metodą Eulera lub niejawną metodą Eulera, np.

– X0=R, Y0=0– Xi+1=Xi-hYi, – Yi+1=Yi+hXi+1.

• Dla i=0,1,...,N. •