Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Wypełnianie obszaru.

Podobne prezentacje


Prezentacja na temat: "Wypełnianie obszaru."— Zapis prezentacji:

1 Wypełnianie obszaru

2 Wprowadzenie W wielu praktycznych zadaniach problemem jest wypełnienie obszaru zadanym kolorem lub wzorcem. Dzieje się tak w systemach interaktywnych, gdzie użytkownik myszą, piórem świetlnym lub przy pomocy tabliczki graficznej rysuje brzeg obszaru, wskazuje jego wnętrze i wybiera kolor lub wzorzec jakim on ma być wypełniony. W wielu innych zadaniach obszar może być dany w postaci wieloboku, a jego wierzchołkami są współrzędne rzeczywiste (nie ekranowe).

3 Wprowadzenie Rozróżnia się więc następujące sytuacje:
wypełniany obszar jest pewnym zbiorem pikseli o ustalonych własnościach (np. o danym kolorze) - jest to przypadek dyskretnym, wypełniany obszar dany jest w postaci wieloboku (jest on podany analitycznie przez krzywą zamkniętą składającą się odcinków i ew. łuków - jest to przypadek ciągły.

4 Przypadek dyskretny W tym przypadku wprowadza się następujące definicje: Zbiór pikseli jest spójny, gdy od dowolnego piksela z tego zbioru możemy przejść do każdego innego przez piksele sąsiednie. Rozważamy zbiór czterospójny, gdy za piksele sąsiednie są uważane piksele leżące odpowiednio: na górze, na dole, na lewo i na prawo od rozważanego piksela. Jeżeli dodatkowo rozważamy sąsiedztwo po kierunkach ukośnych to taki zbiór nazywamy ośmiospójnym. Ziarnem nazywać będziemy dowolny piksel leżący wewnątrz obszaru spójnego.

5 Przypadek dyskretny - definicje
Najczęściej rozważanym przypadkiem jest przypadek wnętrza czterospójnego i brzegu ośmiospójnego, rys. obok. Dopuszczamy także istnienie dziur (wysp) wewnątrz obszaru – będą to podobszary ograniczone ośmiospójnymi brzegami pikseli w zadanym kolorze.

6 Algorytm „przez sianie”
Najprostszy algorytm można skonstruować wykorzystując rekurencję, która polega na tym, że znając ziarno można „siać” kolor wnętrza (oznaczamy go jako Cn) we wszystkich czterech kierunkach (bo wnętrze jest czterospójne). Kolor brzegu oznaczamy jako Cb. Algorytm można zapisać następująco w postaci procedury (funkcja kolor(x,y) oznacza kolor badanego piksela, procedura setcolor(x,y,cn) ustawia kolor cn w zadanym pikselu):

7 Algorytm w postaci pseudokodu
procedure fill4(x,y,cb,cn) /* x,y -współrzędne piksla, */ /* cb,cn -kolor brzegu i wnętrza */ begin if color(x,y)<>cb and color(x,y)<>cn then begin setcolor(x,y,cn); fill4(x,y-1,cb,cn); fill4(x,y+1,cb,cn); fill4(x-1,y,cb,cn); fill4(x+1,y,cb,cn); end;

8 Przykład działania algorytmu
Przykład działania procedury dla prostokąta: prostokąt(0,0,10,10), ziarno (5,5). Fill4(5,5,cb,cn) Fill4(5,4,cb,cn) Fill4(5,3,cb,cn) Fill4(5,2,cb,cn) Fill4(5,1,cb,cn) Fill4(5,0,cb,cn) – powrót Fill4(5,1,cb,cn) – powrót Fill4(4,1,cb,cn) Fill4(4,0,cb,cn) ....

9 Uwagi Algorytm ten można praktycznie stosować jedynie dla niewielkich obszarów. W przypadku większych obszarów następuje szybko przepełnienie stosu. Algorytm jest także bardzo kosztowny, gdyż pojedynczy piksel bada się kilka razy.

10 Nowa idea Efektywniejsze metody otrzymujemy wtedy, gdy operujemy nie na pojedynczych pikselach ale na ich grupie. Najczęściej są to poziome segmenty definiowane jako ciągi leżące wewnątrz obszaru pikseli sąsiadujących ze sobą w poziomie, są one ograniczone z prawej i z lewej strony pikselami brzegowymi (przykładem są odcinki).

11 Nowa idea Schemat postępowania w takich przypadkach jest następujący:
wyznaczamy segment początkowy zawierający dane ziarno, wyznaczamy segmenty sąsiadujące z segmentem początkowym, mogą się one znajdować nad segmentem początkowym lub pod. W przypadku kilku segmentów leżących nad lub po układamy je na stosie np. wg. kolejności od lewej do prawej, postępowanie powtarzamy dla kolejnych elementów leżących na stosie.

12 Nowa idea – praktyczna realizacja
Typowym algorytmem dla rozważanej klasy jest algorytm Smitha, przykład na rys. na następnym slajdzie: mamy dane ziarno, segmentem jest linia, wypełniamy segment, wyznaczamy początkowe współrzędne pikseli sąsiednich (leżących najbardziej na lewo) nie wypełnionych jeszcze nowym kolorem; wyznaczone współrzędne segmentu i ewentualnie jego długość odkładamy na stos, piksel, którego adres leży na wierzchołku stosu bierzemy jako nowe ziarno, powtarzamy do momentu, aż stos będzie pusty, kolejnymi ziarnami są współrzędne ze stosu.

13 Przykład Przykład działania algorytmu Smitha pokazuje rysunek poniżej; x -jest ziarnem początkowym, piksele 1,2,...,6 są kolejnymi ziarnami.

14 Algorytmy wektorowe - przypadek ciągły
Dalej zajmiemy się przypadkiem ciągłym. W tym wariancie podstawowym elementem jest wielobok. Rozważmy szczególny przypadek wieloboku jakim jest trapez, rys. Wierzchołki na ogół nie są całkowite, a rzeczywiste, więc należy je zaokrąglić. Algorytm można zapisać następująco A=(x1,y1), B=(x2,y2), C=(x3,y3), D=(x4,y4): Niech ymin=round(y4); ymax=round(y1); cl=(x4-x1)/(y4-y1); cp=(x3-x2)/(y3-y2); dla y=ymin,ymin+1,..., ymax wyznacz punkt przecięcia linii poziomej y z x=x1+(y-y1)*cl i z x=x2+(y-y2)*cp; wypełnij nowym kolorem piksele leżące na tej linii od round(xl) do round(xp),

15 Dowolny wielokąt Zadanie wypełniania dowolnego wielokąta można sprowadzić do przypadku trapezu, lub do szczególnego przypadku trapezu jakim jest trójkąt. Algorytmem, który to wykorzystuje jest algorytm Brassela i Fegeasa, który jest stosowany do rozkładu wielokąta na sumę trapezów. Oprócz zagadnień związanych z wypełnianiem ten algorytm stosowany jest w rysowaniu obiektów oświetlonych trójwymiarowych lub gdy wielokrotnie wypełniamy obszary tego samego kształtu ale różnych rozmiarów (np. czcionki tego samego kroju). W algorytmie wykorzystywane jest pojęcie stalaktytu, stalagmitu i wierzchołka normalnego. Stalaktytem jest taki wierzchołek yk, dla którego zachodzi yk-1>yk, yk+1>yk. Natomiast regularnym jest ten wierzchołek, który nie jest ani stalaktytem ani stalagmitem. Zakładamy ponadto, że wielokąt jest zwykłym wielokątem, tzn. jego krawędzie nie przecinają się oraz przyjmujemy, że nie ma krawędzi poziomych.

16 Dowolny wielokąt Algorytm jest postaci (narzucającym się sposobem jest poprowadzenie linii przez wszystkie wierzchołki, otrzymuje się wtedy dużo trapezów): Dane: Wi=(xi,yi), i=1,...,n, uporządkowane odwrotnie do ruchu wskazówek zegara, (dla krawędzi WiWi+1 to co jest po lewej stronie należy do wielokąta.

17 Algorytm posortuj wierzchołki według rosnących wartości y, i=1,..,n, yi1<yi2,...<yin, dla i=i1, i2, ..., in niech lista LO zawiera odcinki (P1,P2), (P3,P4),..., (P2m-1,P2m), niech LK zawiera krawędzie (Wk1,Wk2), (Wk3,Wk4),... Wyznaczamy punkty przecięcia P1’, P2’,..., prostej y=yi z krawędziami LK, dołączamy trapezy (P1,P2;P1’,P2’), ..., (P2m-1,P2m;P2m-1’,P2m’) do wynikowych trapezów, Klasyfikujemy wierzchołek Wi i rozważamy: Wi jest regularny - jeśli yi-1<yi<yi+1 to wymieniamy w LK krawędź (Wi-1,Wi) na (Wi,Wi+1), a jeżeli zachodzą nierówności przeciwne to następuje wymiana odwrotna. Przyjmujemy nową LO={(p1’,P2’),(P3’,P4’),...,(P2m-1’,P2m)}, Wi jest stalaktytem (obydwa wierzchołki mają składowe większe niż yi, a dwu krawędzi, których jednym z końców jest Wi=(xi,yi) nie ma w LK). Modyfikujemy listę przecięcia P1’, P2’,..., P2m’, wstawiając do niej dwukrotnie wierzchołek Wi w takie miejsce, by były spełnione nierówności xj’<xi<xj+1’. Otrzymany ciąg P1’, P2’,...,Pj’Wi,Wi,Pj+1’,...,P2m’ oznaczamy jako P1”,P2”,...,P2m+2” i jako nową listę LO przyjmujemy (P1”,P2”), ..., (P2m+1”,P2m+2”). Wstawiamy krawędzie (Wi-1,Wi) i (Wi,Wi+1) do LK w miejsce określone kolejnością punktów przecięcia w nowej LO. Wi jest stalagmitem (Oba wierzchołki leżą poniżej Wi, a więc krawędzie (Wi-1,Wi) i (Wi,Wi+1) są już elementami listy LK i stąd wśród punktów P1’, P2’, ...., P2m’ przecięcia prostej y=yi z krawędziami LK występuje dwukrotnie wierzchołek Wi. Usuwamy te punkty, a pozostałe nazywamy P1”, P2”,..., P2m-2” i uaktualniamy LO jako {(P1”,P2”),..., (P2m-3”,P2m-2”)}. Z listy LK usuwamy krawędzie (Wi-1,Wi) i (Wi,Wi+1). next i LO i LK są roboczymi strukturami danych. LO zawiera odcinki linii poziomych leżące wewnątrz wielokąta, a LK zawiera krawędzie boczne trapezów.

18 Okienkowanie i obcinanie
W zastosowaniach elementy rysunku definiowane są w rzeczywistym układzie współrzędnych. Podczas przenoszenia na urządzenie graficzne następuje przejście od układu rzeczywistego do układu urządzenia graficznego. Można wtedy określać, jaki fragment rysunku ma być zobrazowany, oraz jak mają być usytuowane i jaka ma być ich wielkość. Wykonujemy wtedy dwie rodzaje operacji: okienkowanie, czyli odwzorowanie obszaru określonego we współrzędnych rzeczywistych na obszar zdefiniowany we współrzędnych danego urządzenia graficznego oraz obcinanie, czyli wyznaczenie elementów rysunku, leżących wewnątrz okna. Oknem nazywamy obszar w rzeczywistej przestrzeni, a widokiem nazywamy obszar obrazu na urządzeniu graficznym. Najczęściej oba prostokąty mają boki równoległe do osi układu. Okno określone jest wtedy liczbami Xmin, Xmax, Ymin, Ymax, a widok xmin, xmax, ymin, ymax.

19 Okienkowanie Transformacja operacji okienkowania jest postaci:
x=xmin+sx(X-Xmin), y=ymin+sy(Y-Ymin), gdzie odwzorowuje okno na cały widok. Składa się ona z następujących etapów: Xi’=Xi-minXi, Xi”=Xi/maxXi’, Xi”’= Xi”(xmax-xmin) Xi””=xmin+ Xi”’.

20 Okienkowanie bez deformacji
Na ogół sx<>sy i wtedy następuje deformacja rysunku. Możemy deformacji uniknąć wprowadzając zależności: dla sx<sy x=xmin+sx(X-Xmin), a dla sx>sy y=ymin+sy(Y-Ymin).

21 Obcinanie Natomiast w operacji obcinania będziemy zajmowali się wyznaczeniem elementów rysunku leżących w prostokątnym oknie. Wykorzystywane są wtedy algorytmy wyznaczania czy dany punkt leży wewnątrz dowolnego wielokąta oraz algorytmy obcinania odcinka. Przyjmujemy, że okno, do którego obcinamy punkty i odcinki, będzie zdefiniowany nierównościami: xmin<=x<=xmax oraz ymin<=y<=ymax.

22 Algorytm Cohena-Shuterlanda
Jeżeli współrzędne danego punktu P spełniają te nierówności, to leży on już wewnątrz okna. W przypadku odcinka zadanie jest trudniejsze. Zostaną podane dwie metody. Pierwsza to algorytm Cohena-Shuterlanda. W algorytmie Cohena-Shuterlanda każdemu końcu odcinka przypisujemy czterobitowy kod, bity są numerowane od prawego: kod(P)=b4 b3 b2 b1 i zachodzi: b1=1 gdy P leży na lewo od okna, b2=1 gdy P leży na prawo od okna, b3=1 gdy P leży poniżej okna, b4=1 gdy P leży powyżej okna, a w przeciwnym przypadku bity mają wartość zero.

23 Algorytm Cohena-Shuterlanda
Podane wyżej bity wyznacza się bardzo łatwo, gdyż b1 jest bitem znaku x-xmin, b2 jest bitem znaku x-xmax, b3 jest bitem znaku y-ymin, a b4 jest bitem znaku y-ymax. Jeżeli punkt leży wewnątrz okna to kod(P)=0000. Jeżeli odcinek leży wewnątrz okna, to kod(P1)=0000 i kod(P2)=0000. Jeżeli kod(P1) AND kod(P2)<>0, to np. gdy końce P1 i P2 leżą na lewo od okna to pierwsze bity (b1) są równe jeden. Jeżeli kod(P1) AND kod(P2)=0, to odcinek P1P2 może ale nie musi przecinać okno. Algorytm Cohena-Shuterlanda polega na tym, że koniec odcinka o kodzie niezerowym jest zastępowany punktem przecięcia badanego odcinka z prostą zawierającą jeden z boków odcinka, co powoduje odrzucenie fragmentu odcinka leżącego poza oknem. Następnie pozostała część odcinka jest obcinana prostymi zawartymi w pozostałych bokach.

24 Algorytm Cohena-Shuterlanda
Dane P1=(x1,y1), P2=(x2,y2), xmin, xmax, ymin, ymax, (*) oblicz kod(P1) i kod(P2); jeśli kod(P1)=kod(P2)=0000, to odcinek P1P2 leży wewnątrz okna a w przeciwnym razie jeśli kod(P1) AND kod(P2) <> 0000 to odrzuć cały odcinek początkowy; w przeciwnym razie jeśli kod(P1)=0000 to zamień za sobą punkty P1 i P2 oraz ich kody; jeśli b1=1 to y1=y1+(xmin-x1)*(y2-y1)/(x2-x1); x1=xmin w przeciwnym razie jeśli b2=1, to y1=y1+(xmax-x1)*(y2-y1)/(x2-x1); x1=xmax w przeciwnym razie, jeśli b3=1, to x1=x1+(ymin-y1)*(x2-x1)/(y2-y1); y1=ymin jeśli b4=1, to x1=x1+(ymax-y1)*(x2-x1)/(y2-y1); y1=ymax wróć do (*).


Pobierz ppt "Wypełnianie obszaru."

Podobne prezentacje


Reklamy Google