W definicji powyszej funkcji załoylimy, e 1 m 1 oraz x0 < xk.



Podobne dokumenty
Rasteryzacja (ang. rasterization or scan-conversion) Grafika rastrowa. Rysowanie linii (1) Rysowanie piksela. Rysowanie linii: Kod programu

Algorytmy grafiki rastrowej. Mirosław Głowacki Wykład z Grafiki Komputerowej

Rasteryzacja (ang. rasterization or scan-conversion) Grafika rastrowa. Rysowanie linii (1) Rysowanie piksela

Instrukcja obsługi programu MechKonstruktor

WYKŁAD 8. Postacie obrazów na różnych etapach procesu przetwarzania

Podstawowe obiekty AutoCAD-a

PROWIZJE Menad er Schematy rozliczeniowe

Grafika 2D. Podstawowe operacje rastrowe. opracowanie: Jacek Kęsik

Mikroprocesorowy regulator temperatury RTSZ-2 Oprogramowanie wersja 1.1. Instrukcja obsługi

Program do konwersji obrazu na cig zero-jedynkowy

Kurs wyrównawczy dla kandydatów i studentów UTP

M E R I D I A N. Sobota, 11 lutego 2006

Technologie Informacyjne

Temat: Funkcje. Własności ogólne. A n n a R a j f u r a, M a t e m a t y k a s e m e s t r 1, W S Z i M w S o c h a c z e w i e 1

Temat: Geometria obliczeniowa cz II. Para najmniej odległych punktów. Sprawdzenie, czy istnieje para przecinajcych si odcinków.

Podział Internetu radiowego WIFI konfiguracja

Podstawowe działania w rachunku macierzowym

Sposoby przekazywania parametrów w metodach.

PAKIET MathCad - Część III

Urzdzenia Techniki Komputerowej. Skrypt szkolny dla uczniów TZN

TYTUŁ DZIAŁU 01 OX SPIS TREŚCI LOGO 3 SYMBOLIKA MARKI 15 WERSJA PODSTAWOWA 3 WERSJE PODSTAWOWE: POZIOMA I PIONOWA 4 SIATKA MODUŁOWA 5

Temat: Technika zachłanna. Przykłady zastosowania. Własno wyboru zachłannego i optymalnej podstruktury.

Zastosowanie programu Microsoft Excel do analizy wyników nauczania

ANALIZA NUMERYCZNA. Grzegorz Szkibiel. Wiosna 2014/15

GRAFIKA PROGRAMOWANA W PASCALU ==================================

Instrukcja obsługi regulatora i wizualizacji pieca pokrocznego na Walcowni Drobnej P46 Strona 1 z 26

1. Klasa typu sealed. Przykład 1. sealed class Standard{ class NowyStandard:Standard{ // błd!!!

Program SMS4 Monitor

1. Rozwiązać układ równań { x 2 = 2y 1

Matematyka z plusemdla szkoły ponadgimnazjalnej WYMAGANIA EDUKACYJNE Z MATEMATYKI W KLASIE TRZECIEJ LICEUM. KATEGORIA B Uczeń rozumie:

Planowanie adresacji IP dla przedsibiorstwa.

Opis programu do wizualizacji algorytmów z zakresu arytmetyki komputerowej

Lecture Notes in Computer Graphics. 2D graphics

Kurs z matematyki - zadania

NUMER IDENTYFIKATORA:

Grafika komputerowa Wykład 2 Algorytmy rastrowe

Zintegrowane Systemy Zarządzania Biblioteką SOWA1 i SOWA2 SKONTRUM

INSTRUKCJA OBSŁUGI PROGRAMU C-STATION

Wstp. Warto przepływu to

Projektowanie algorytmów rekurencyjnych

Algorytmy grafiki rastrowej. Mirosław Głowacki Wykład z Grafiki Komputerowej

Zadania domowe. Ćwiczenie 2. Rysowanie obiektów 2-D przy pomocy tworów pierwotnych biblioteki graficznej OpenGL

0.1 Hierarchia klas Diagram Krótkie wyjaśnienie

EGZAMIN MATURALNY Z MATEMATYKI

Bazy danych. Andrzej Łachwa, UJ, /15

9. Dynamiczne generowanie grafiki, cz. 3

SUPLEMENT SM-BOSS WERSJA 6.15

2.Prawo zachowania masy

1 Wizualizacja danych - wykresy 2D

PROE wykład 7 kontenery tablicowe, listy. dr inż. Jacek Naruniec

Nowe kody kreskowe GS1 DataBar Pakiet informacyjny dla PRODUCENTÓW

Rys1 Rys 2 1. metoda analityczna. Rys 3 Oznaczamy prdy i spadki napi jak na powyszym rysunku. Moemy zapisa: (dla wzłów A i B)

Laboratorium nr 2. Edytory tekstu.

Instrukcja obsługi programu DIALux 2.6

Funkcje, wielomiany. Informacje pomocnicze

Metoda LBL (ang. Layer by Layer, pol. Warstwa Po Warstwie). Jest ona metodą najprostszą.

Amortyzacja rodków trwałych

A. Zaborski, Elastooptyka podstawy fizyczne ELASTOOPTYKA

Rysowanie punktów na powierzchni graficznej

Aby załoy nowy projekt wybieramy klikamy na napisie, nastpnie wybieramy Opcje Nowy projekt. Podajemy nazw projektu i zatwierdzamy klawiszem OK.

Podstawy Informatyki Wykład V

tel/fax lub NIP Regon

651LH/RH, 667LH/RH urzdzenie zabezpieczajce przed skutkami pknicia spryn rezydencjalnych bram sekcyjnych INSTRUKCJA MONTAU

tróżka Źródło:

wicej na:

Metody Informatyczne w Budownictwie Metoda Elementów Skoczonych ZADANIE NR 1

SUPLEMENT SM-BOSS WERSJA 6.15

Wektor o pocztku i kocu odpowiednio w punktach. Prosta zawierajca punkty p i q: pq Półprosta zaczynajca si w punkcie p i zawierajca punkt q:.

BADANIE ODBIORNIKÓW R, L, C W OBWODZIE PRDU SINUSOIDALNEGO

IV. UK ADY RÓWNAÑ LINIOWYCH

ODPOWIEDZI I SCHEMAT PUNKTOWANIA ZESTAW NR 2 POZIOM PODSTAWOWY. 1. x y x y

Gramatyki regularne i automaty skoczone

Instrukcja do ćwiczeń laboratoryjnych Numeryczne metody analizy konstrukcji

1) Grafy eulerowskie własnoci algorytmy. 2) Problem chiskiego listonosza

Czy zdążyłbyś w czasie, w jakim potrzebuje światło słoneczne, aby dotrzeć do Saturna, oglądnąć polski hit kinowy: Nad życie Anny Pluteckiej-Mesjasz?

Projektowanie algorytmów z wykorzystaniem ptli for

I S. 2. MATERIAŁY 2.1. Wymagania ogólne dotyczce materiałów Wymagania ogólne dotyczce materiałów podano w SST D.M Wymagania ogólne.

Księga znaku. Spis treści:

Promocja i identyfikacja wizualna projektów współfinansowanych ze środków Europejskiego Funduszu Społecznego

PODSTAWY METROLOGII ĆWICZENIE 4 PRZETWORNIKI AC/CA Międzywydziałowa Szkoła Inżynierii Biomedycznej 2009/2010 SEMESTR 3

ASD - ćwiczenia III. Dowodzenie poprawności programów iteracyjnych. Nieformalnie o poprawności programów:

Google SketchUp. cwiczenia praktyczne. 2.1 Tworzenie modelu przez wycinanie obszarów

Poniszy rysunek przedstawia obraz ukoczonej powierzchni wykorzystywanej w wiczeniu.

ANALOGOWE UKŁADY SCALONE

Wiedza niepewna i wnioskowanie (c.d.)

TEORIA GIER W EKONOMII WYKŁAD 1: GRY W POSTACI EKSTENSYWNEJ I NORMALNEJ

Bazy danych. Plan wykładu. Dekompozycja relacji. Anomalie. Wykład 5: Projektowanie relacyjnych schematów baz danych. SQL - funkcje grupujce

I. POSTANOWIENIA OGÓLNE

MATEMATYKA 4 INSTYTUT MEDICUS FUNKCJA KWADRATOWA. Kurs przygotowawczy na studia medyczne. Rok szkolny 2010/2011. tel

Organizacja produkcji

Wykªad 4. Funkcje wielu zmiennych.

mgr inż. Grzegorz Kraszewski SYSTEMY MULTIMEDIALNE wykład 6, strona 1. Format JPEG

MATERIAŁ WICZENIOWY Z MATEMATYKI

Instrukcja obsługi programu CalcuLuX 4.0

dla terenu pod budow hali sportowej wielofunkcyjnej przy ul. ulowej w Czstochowie

'()(*+,-./01(23/*4*567/8/23/*98:)2(!."/+)012+3$%-4#"4"$5012#-4#"4-6017%*,4.!"#$!"#%&"!!!"#$%&"#'()%*+,-+

Akademia Techniczno-Humanistyczna w Bielsku-Białej Wydział Budowy Maszyn i Informatyki Katedra Technologii Maszyn i Automatyzacji

G PROGRAMMING. Part #4

Oba zbiory s uporz dkowane liniowo. Badamy funkcj w pobli»u kresów dziedziny. Pewne punkty szczególne (np. zmiana denicji funkcji).

Transkrypt:

Wykład 2 Podstawowe algorytmy rysowania prymitywów 2D w grafice rastrowej Pakiet grafiki rastrowej aproksymuje prymitywy matematyczne (idealne), opisane przez wierzchołki siatki kartezjaskiej, za pomoc zbiorów pikseli o odpowiednim poziomie szaro- ci lub barwie. Piksele s pamitane w postaci mapy bitowej albo pikselowej w pamici CPU albo w pamici obrazu. Implementacja pakietu graficznego wymaga konstrukcji algorytmów rasteryzacji prymitywów. Konwersja odcinków Algorytm konwersji odcinka oblicza współrzdne pikseli, które le na lub blisko idealnej nieskoczenie cienkiej linii prostej nałoonej na siatk dwuwymiarowego rastra. Rysujc na urzdzeniu rastrowym przechodzimy do układu współrzdnych całkowitych (układ współrzdnych pikselowych). W takim układzie piksel bdzie reprezentowany jako kółko o rodku w punkcie (x, y) w siatce całkowitoliczbowej (stosowane s równie inne reprezentacje pikseli). Rysujc odcinek chcielibymy, eby sekwencja pikseli leała tak blisko idealnego odcinka, jak to tylko moliwe, i eby był on moliwie prosty. Bdziemy rozwaa wywietlanie odcinków o gruboci jednego piksela, jednak pakiety grafiki rastrowej powinny równie dawa moliwo rysowania odcinków o gruboci wikszej ni 1 piksel. Poniszy rysunek pokazuje (w duym powikszeniu) odcinek po konwersji (o gruboci 1 piksela); wywietlane piksele s zaznaczone jako niebieskie kółka; aproksymowany idealny odcinek narysowany jest kolorem czerwonym Jeli załoymy, e kocami rysowanego odcinka s punkty o całkowitych współrzdnych (x 0, y 0 ) i (x k, y k ), to jako pierwszy piksel przybliajcy rysowany odcinek przyjmujemy oczywicie jeden z kracowych, np. (x 0, y 0 ). Dalej moemy stosowa wybór cztero- lub omiokierunkowy (rysunek poniej). Z czterech lub omiu moliwych wybieramy ten piksel, którego rodek ley najbliej idealnego odcinka. W zalenoci od sposobu wyboru (czterolub omiokierunkowego) liczby wywietlanych pikseli przybliajcych ten sam odcinek bd róne. Sposób wyboru pikseli: czterokierunkowy i omiokierunkowy; niebieskie kółko oznacza piksel wybrany wczeniej: 1

Powyszy rysunek przedstawia zbiory pikseli przybliajcych ten sam odcinek z wyborem czterokierunkowym i omiokierunkowym. Oba rysunki robi wraenie schodkowych. Ten niepodany efekt jest wynikiem podejcia do procesu rasteryzacji na zasadzie wszystko albo nic, zgodnie z któr barwa kadego piksela jest albo zastpowana przez barw prymitywu, albo pozostaje bez zmiany. Zakłócenia tego typu s przykładem zjawiska okrelanego jako aliasing. Metody redukcji albo eliminacji aliasingu s okrelane jako antyaliasing (odkłócanie). Podstawowy algorytm przyrostowy Naszym zadaniem jest wywietlenie na monitorze rastrowym odcinka o kocach (x 0, y 0 ) i (x k, y k ), gdzie x 0, y 0, x k, y k s liczbami całkowitymi. Załómy ponadto, e nasz odcinek ma nachylenie 0 < m 1 (rasteryzacja odcinków o innych nachyleniach wymaga wprowadzenia drobnych zmian w naszych rozwaaniach; ponadto najczciej wystpujce odcinki poziome, pionowe, i o nachyleniu ±1 mog by potraktowane jako specjalne przypadki, poniewa przechodz wyłcznie przez rodki pikseli). Bez zmniejszenia ogólnoci moemy załoy, e x 0 < x k. Niech m = dy/dx, gdzie dy = y k y 0, dy = x k x 0. Zaczynamy od punktu połoonego z lewej strony tj. (x 0, y 0 ). Zwikszajc wartoci x o 1 obliczamy y i = mx i + b dla kadego x i, gdzie x i = x 0... x k (wzór y = mx + b okrela kierunkowe równanie prostej zawierajcej odcinek), nastpnie wywietlamy piksel w punkcie (x i, Round( y i )), przy czym Round( y i ) = Floor( y i + 0,5). W wyniku tych oblicze wywietlany jest piksel lecy najbliej rzeczywistego odcinka. Nie jest to strategia efektywna, poniewa w kadej iteracji wykonywane jest zmiennopozycyjne mnoenie (przez m), dodawanie i wywołanie funkcji Round. Zauwamy jednak, e y i+1 = mx i+1 + b = m(x i +1)+ b = mx i + m + b = y i + m. Zatem jednostkowej zmianie x towarzyszy zmiana y o m (nachylenie odcinka). Dla wszystkich punktów (x i, y i ) na odcinku rzeczywistym (nie s to punkty otrzymywane w wyniku rasteryzacji odcinka) otrzymujemy wic, x i+1 = x i +1 i y i+1 = y i + m. Oznacza to, e wartoci x i y s zdefiniowane w zalenoci od poprzednich punktów. Na tym włanie polega algorytm przyrostowy w kadym kroku wykonujemy obliczenia przyrostowe korzystajc z wyników poprzedniego kroku. odcinek rzeczywisty Zauwamy, e w tej przyrostowej metodzie nie trzeba bezporednio zajmowa si współczynnikiem przesunicia b wzdłu osi y. Jeeli m > 1, to krok w kierunku osi OX tworzy przyrost w kierunku osi OY wikszy ni 1. Musimy wic zamieni x i y rolami, przypisujc krok jednostkowy do y i zwikszajc x o 1/m, tzn. x i+1 = x i +1/m. 2

Ten algorytm jest okrelany jako algorytm DDA (digital differential analyzer). Cho cechuje si bardzo prost budow, to jego główn wad jest stosowanie arytmetyki na liczbach zmiennoprzecinkowych, co negatywnie wpływa na jego wydajno. Załómy, e mamy dan funkcj niskiego poziomu wywietlajc piksel PutPixel(int x, int y, int k), gdzie x,y s współrzdnymi a k wartoci piksela. Zdefiniujemy teraz funkcj Line rysujc odcinek o danych kocach: void Line(int x0, int y0, int xk, int yk, int k) int x; float dx, dy, y, m; dx = xk x0; dy = yk y0; m = dy/dx; y = y0; for(x = x0; x <= xk; x++) PutPixel(x,(int)floor(y + 0.5),k); y += m; W definicji powyszej funkcji załoylimy, e 1 m 1 oraz x0 < xk. wiczenie 1. Uogólni funkcj Line, tak aby rysowała odcinki bez adnych dodatkowych załoe, tzn. gdy x0 < xk, x0 > xk, x0 = xk, m 1, m > 1. Ponadto zadba o to, eby odcinek rysowany od (x0,y0) do (xk,yk) zawierał ten sam zestaw pikseli co odcinek rysowany od (xk,yk) do (x0,y0), tzn. Line(x0,y0,xk,yk,k) = Line(xk,yk,x0,y0,k). Algorytm Bresenhama konwersji odcinka (1963) Wad funkcji Line jest to, e zaokrglanie y do wartoci całkowitej zajmuje czas i e zmienne y i m musz by rzeczywiste albo ułamkowe, poniewa nachylenie jest ułamkiem. Bresenham opracował algorytm, który jest atrakcyjny z tego wzgldu, e korzysta tylko z arytmetyki liczb całkowitych, dziki czemu unika si funkcji Round. Algorytm ten umoliwia przyrostowe obliczanie (x i+1, y i+1 ), tzn. z wykorzystaniem wykonanych ju oblicze dla (x i, y i ). Zmiennopozycyjna wersja tego algorytmu moe by zastosowana do odcinków o dowolnych rzeczywistych wartociach współrzdnych punktów kocowych. Tak jak poprzednio, naszym zadaniem bdzie wywietlenie odcinka o danych kocach (x 0, y 0 ) i (x k, y k ). Zakładamy, e 0 < m 1 (nachylenie odcinka); w przypadku innych nachyle mona skorzysta z odpowiednich symetrii wzgldem podstawowych osi lub zmieni o wiodc (zamieni x i y rolami). Przyjmujemy, e lewy dolny koniec odcinka ma współrzdne P 0 = (x 0, y 0 ), a prawy górny koniec odcinka ma współrzdne P k = (x k, y k ). Wtedy m = dy/dx, gdzie dx = x k x 0, dy = y k y 0. 3

Poniewa kt nachylenia odcinka jest ograniczony do przedziału (0, 45 ], wiec po znalezieniu punktu P i = (x i, y i ) nastpny piksel wybieramy tylko sporód dwóch A = (x i +1, y i ), B = (x i +1, y i +1). Niech Q bdzie punktem rzeczywistego odcinka o odcitej x i +1. Niech a = (Q, A) oraz b = (Q, B), gdzie oznacza odległo midzy punktami. Wówczas a = (Q, A) = dy/dx(x i +1 x 0 ) ( y i y 0 ) b = (Q, B) = ( y i +1 y 0 ) dy/dx(x i +1 x 0 ) Odejmujc powysze równania stronami otrzymujemy a b = 2dy/dx(x i +1 x 0 ) ( y i y 0 ) ( y i +1 y 0 ). Mnoc powysze równanie przez dx otrzymujemy dx(a b) = 2dy(x i x 0 ) 2dx( y i y 0 ) +2dy dx. Oznaczmy d i = dx(a b). Zatem (1) d i = 2dy(x i x 0 ) 2dx( y i y 0 ) +2dy dx. Poniewa dx > 0, wiec znak d i okrela która z wielkoci a i b jest wiksza. Jeli d i > 0, to a > b i nastpny piksel P i+1 = B, a jeeli d i 0, to b a i P i+1 = A. (Jeli d i = 0, to moemy wybra dowolny punkt.) Dla i+1 otrzymujemy (na podstawie (1)) d i+1 = 2dy(x i+1 x 0 ) 2dx( y i+1 y 0 ) +2dy dx. Obliczymy teraz rónic d i+1 d i d i+1 d i = 2dy(x i+1 x i ) 2dx( y i+1 y i ). Zatem, zauwaajc, e x i+1 x i =1, otrzymujemy d i+1 = d i + 2dy 2dx( y i+1 y i ). Jeli d i > 0 (P i+1 = B), to y i+1 = y i +1. I wtedy d i+1 = d i + 2(dy dx) Jeli d i 0 (P i+1 = A), to y i+1 = y i. I wtedy d i+1 = d i + 2dy 4

Z uwagi na rekurencyjn posta wzoru wyznaczajcego warto d i naley wyliczy warto pocztkow d 0. Na podstawie (1) dla i = 0 mamy d 0 = 2dy(x 0 x 0 ) 2dx( y 0 y 0 ) +2dy dx Mamy zatem warunek pocztkowy: d 0 = 2dy dx Widzimy, e o wyborze kolejnego piksela decyduje znak zmiennej d i, zmienn t nazywamy zmienna decyzyjn. Przy przyjtych załoeniach moemy teraz zdefiniowa funkcj BLine rysujc odcinek o danych kocach według algorytmu Bresenhama: void BLine(int x0, int y0, int xk, int yk, int k) int dx, dy, d, da, db, x, y; dx = xk x0; d = 2*dy dx; //warto pocztkowa zmiennej decyzyjnej d da = 2*dy; db = 2*(dy dx); x = x0; y = y0; PutPixel(x,y,k); While (x < xk) if (d < 0) //wywietlamy piksel A d += da; else //wywietlamy piksel B d += db; y++; PutPixel(x,y,k); W definicji powyszej funkcji, w kadym kroku obliczenia potrzebne do wyznaczenia nowej wartoci zmiennej decyzyjnej d sprowadzaj si do prostego dodawania całkowitoliczbowego. W ogóle nie ma czasochłonnego mnoenia. Ta wersja algorytmu działa tylko dla odcinków o nachyleniu z przedziału (0, 1]. Implementacja algorytmu Bresenhama musi oczywicie uwzgldnia inne moliwe połoenia odcinka wzgldem osi OX. Jednak w kadej sytuacji mona zastosowa opisany wyej schemat, w razie potrzeby traktujc o OY jako o wiodc. Algorytm Bresenhama mona przypieszy np. poprzez podział odcinka na kilka czci i odpowiednie wykorzystanie symetrii. 5

wiczenie 2. Uogólni funkcj BLine, tak eby rysowała odcinki bez adnych dodatkowych załoe (tak jak w wiczeniu 1). wiczenie 3. Opracowa ulepszon wersj algorytmu rysowania odcinka (korzystajc tylko z arytmetyki całkowitoliczbowej), który w kolejnym kroku zamiast jednego wybiera jednoczenie dwa kolejne piksele. Bdzie to algorytm z podwójnym krokiem; liczba decyzji (wyboru nastpnych pikseli) zostanie zredukowana o połow. Wskazówka: Zauwamy, e mog wystpi nastpujce cztery kombinacje pikseli: Mona wykaza, e wzory 1 i 4 nie mog jednoczenie wystpi. Ponadto, jeli nachylenie odcinka jest wiksze ni ½, to nie moe wystpi wzór 1; podobnie, jeli nachylenie odcinka jest mniejsze ni ½, to nie moe wystpi wzór 4. Zatem testowanie nachylenia odcinka bdzie ogranicza wybór do jednego z trzech wzorów: 1, 2, 3 albo 2, 3, 4. Problemy przy konwersji odcinków Kolejno punktów kocowych Funkcje realizujce konwersj odcinków powinny zapewnia, eby odcinek rysowany od punktu P 0 do punktu P k zawierał ten sam zestaw pikseli co odcinek rysowany od P k do P 0. Czyli obraz otrzymanego odcinka nie powinien zalee od kolejnoci podawania punktów kocowych. Proste przełczenie koców odcinka nie sprawdza si jeeli korzystamy ze stylów linii. Styl odcinka zawsze zaczepia okrelon mask zapisu w punkcie pocztkowym. Nie osigniemy podanego efektu wizualnego, jeli wzór nie bdzie zaczynał si tam, gdzie zostanie okrelony punkt pocztkowy, ale automatycznie w lewym dolnym kocu odcinka. Przykład odcinków rysowanych tym samym stylem linii: Zmiana jasnoci odcinka odcinek B Przyjrzyjmy si dwóm odcinkom po konwersji na powyszym rysunku. Odcinek B lecy na przektnej siatki ma nachylenie 1 i jest 2 razy dłuszy od poziomego odcinka A, chocia do narysowania obydwóch odcinków została wykorzystana taka sama liczba pikodcinek A 6

seli. Jeeli jasno kadego piksela wynosi J, to jasno na jednostk długoci dla odcinka A jest równa J, natomiast dla odcinka B tylko J / 2 ; ta rónica jest łatwo zauwaana przez obserwatora. Na monitorze monochromatycznym nie mona tego problemu rozwiza, natomiast w systemie z n bitami moemy wprowadzi kompensacj uzaleniajc jasno pikseli od nachylenia odcinka. Rysowanie prymitywów konturowych budowanych z odcinków Jeli mamy zdefiniowan funkcj rysujc odcinki, to moemy równie dokonywa konwersji prymitywów budowanych z odcinków. Konwersj łamanej, prostoktów i wieloktów mona wykona na zasadzie kolejnego rozpatrywania odcinków. Naley jednak uwaa, eby rysowa wierzchołki tylko raz, poniewa dwukrotne narysowanie tego samego wierzchołka moe powodowa zmian barwy lub pojawienie si barwy tła (w zalenoci trybu zapisu na ekranie), albo podwojenie jasnoci piksela. Konwersja okrgów Przy rysowaniu okrgu korzysta si z kołowego łuku eliptycznego jako specjalnego przypadku oraz z omiokrotnej symetrii. Załómy, e promie R okrgu jest liczb naturaln, a jego rodek ley w pocztku układu współrzdnych (ewentualnie wykonujemy przesunicie). Nasze zadanie bdzie polega na wybraniu pikseli przybliajcych krzyw dan równaniem x 2 + y 2 R 2 =0 lub inaczej F(x, y) = x 2 + y 2 R 2 =0. Ze wzgldu na symetri moemy ograniczy si do pierwszej wiartki okrgu, a nawet rozway tylko 1/8 okrgu. Dla pełnego okrelenia okrgu trzeba wykona obliczenia tylko dla segmentu o kcie 45. (-x, y) (x, y) (-y, x) (y, x) (-y, -x) R / 2 (y, -x) (-x, -y) (x, -y) Jeeli punkt (x, y) naley do okrgu to w trywialny sposób moemy obliczy siedem pozostałych punktów okrgu (rysunek powyej). Dla okrgu o rodku w pocztku układu współrzdnych zdefiniujmy funkcj Sym8, która bdzie wywietla osiem symetrycznych punktów (funkcj mona łatwo uogólni na przypadek okrgu o rodku lecym w dowolnym punkcie): 7

void Sym8 (int x, int y, int k) PutPixel(x,y,k); PutPixel(y,x,k); PutPixel(y,-x,k); PutPixel(x,-y,k); PutPixel(-x,-y,k); PutPixel(-y,-x,k); PutPixel(-y,x,k); PutPixel(-x,y,k); Łatwo mona zmodyfikowa kod powyszej funkcji tak, aby dla x = y lub x = 0 lub y = 0 piksele nie były rysowane podwójnie. 2, i uy- Algorytm Bresenhama konwersji okrgu (1983) Algorytm ten jest take nazywany kryterium punktu rodkowego. Rozwaamy jedynie 45 drugiego oktantu okrgu, od x = 0 do x = y = R / wamy funkcji Sym8 do wywietlenia punktów na całym okrgu. Dla kadego x wybieramy punkt, który ley bliej rzeczywistego okrgu. Jeli piksel P i = (x i, y i ) został poprzednio wybrany jako bliszy okrgowi, to jako nastpny moe zosta wybrany piksel A lub B. Funkcja F(x, y) = x 2 + y 2 R 2 jest równa 0 na okrgu, dodatnia na zewntrz okrgu i ujemna wewntrz okrgu. Jeeli punkt rodkowy M i+1 ley na zewntrz okrgu, to piksel B ley bliej okrgu, a jeli punkt M i+1 ley wewntrz okrgu, to piksel A ley bliej okrgu. Podobnie jak dla odcinków, wyboru bdziemy dokonywa na podstawie zmiennej decyzyjnej d, która w tym przypadku bdzie wartoci funkcji F w punkcie rodkowym. Obliczmy d i+1 = F(M i+1 ) = F(x i + 1, y i ½) = (x i + 1) 2 + (y i ½) 2 R 2. Jeli d i+1 < 0, to P i+1 = A, i wtedy M i+2 = (x i + 2, y i ½). Zatem d i+2 = F(M i+2 ) = F(x i + 2, y i ½) = (x i + 2) 2 + (y i ½) 2 R 2. Moemy zatem wyznaczy d i+2 w zalenoci od d i+1 : d i+2 = d i+1 + (2x i + 3) Oznaczmy przez d A przyrost: d A = 2x i + 3. Jeli d i+1 0, to P i+1 = B, i wtedy M i+2 = (x i + 2, y i 3/2). Zatem moemy obliczy 8

d i+2 = F(M i+2 ) = F(x i + 2, y i 3/2) = (x i + 2) 2 + (y i 3/2) 2 R 2 Wyznaczamy d i+2 w zalenoci od d i+1 : d i+2 = d i+1 + (2x i 2 y i + 5) Oznaczmy przez d B przyrost: d B = 2(x i y i ) + 5. Zauwamy, e d A i d B s funkcjami konkretnych wartoci (nie s stałe). Z uwagi na rekurencyjn posta wzoru wyznaczajcego warto d i naley wyliczy warto pocztkow d 1. Poniewa P 0 = (0, R), wic M 1 = (0, R ½). Mamy zatem d 1 = F(M 1 ) = F(1,R ½) = 1 + (R 2 R +1/4) = 5/4 R. Mamy zatem warunek pocztkowy: d 1 = 5/4 R Przy przyjtych załoeniach moemy teraz zdefiniowa funkcj Circle rysujc okrg o danym promieniu według algorytmu Bresenhama (wykorzystamy wczeniej zdefiniowan funkcj Sym8): void Circle(int r, int k) int x, y; float d; x = 0; //współrzdne punktu P0 y = r; d = 5/4 r; //warto pocztkowa zmiennej decyzyjnej d Sym8(x,y,k); While (y < x) if (d < 0) //wywietlamy piksel A d = d + 2*x + 3; else //wywietlamy piksel B d = d + 2*(x y) + 5; y--; Sym8(x,y,k); Problem z powysz wersj algorytmu polega na tym, e musimy korzysta z arytmetyki zmiennopozycyjnej ze wzgldu na ułamkow inicjalizacj d. Chocia funkcja moe by łatwo zmodyfikowana tak, eby mona było rysowa okrgi o rodkach o współrzdnych, które nie 9

s całkowite albo których promie nie jest całkowity, to jednak chcielibymy otrzyma efektywniejsz wersj w pełni całkowitoliczbow. W celu wyeliminowania ułamków dokonamy drobnej modyfikacji w kodzie funkcji. Definiujemy now zmienn decyzyjn h jako h = d ¼ i podstawiamy w kodzie h + ¼ zamiast d. Przy inicjalizacji bdziemy mie h = 1 r i porównanie d < 0 zastpimy przez h < ¼. Jednak, poniewa h jest całkowite i jest zwikszane o wartoci całkowite, wic moemy zmieni porównanie na h < 0. Mamy teraz całkowitoliczbowy kod funkcji (dla zgodnoci z poprzednia funkcj podstawimy d zamiast h): void Circle(int r, int k) int x, y, d; x = 0; y = r; // wartoci poczatkowe d = 1 r; Sym8(x,y,k); While (y < x) if (d < 0) //wywietlamy piksel A d = d + 2*x + 3; else //wywietlamy piksel B d = d + 2*(x y) + 5; y--; Sym8(x,y,k); wiczenie 4. Uogólni algorytm rysowania okrgów dla okrgów o dowolnym rodku (zmodyfikowa funkcj Sym8). wiczenie 5. Opracowa algorytm rysowania elipsy. Wskazówki: Elipsa moe by dana równaniem F(x, y) =b 2 x 2 + a 2 y 2 a 2 b 2 = 0, gdzie a i b s półosiami elipsy. W tym przypadku musimy rysowa cał pierwsz wiartk elipsy oraz ustali jako o wiodc o OX gdy x zmienia si szybciej ni y, natomiast o OY, gdy y zmienia si szybciej ni x. Do kadego wyznaczonego piksela stosujemy funkcj rysujc cztery symetryczne punkty. wiczenie 6. Opracowa algorytm rysowania łuku okrgu (łuku elipsy). wiczenie 7. Opracowa algorytm konwersji odcinków korzystajc z kryterium punktu rodkowego. Tutaj prosta zawierajca odcinek moe by zadana równaniem: F(x, y) = xdy ydx + bdx = 0. 10