Algoritmusok raszteres grafikához

Hasonló dokumentumok
Algoritmusok raszteres grafikához

Algoritmusok raszteres grafikához

Máté: Számítógépes grafika alapjai

Máté: Számítógépes grafika alapjai

Területi primitívek: Zárt görbék által határolt területek (pl. kör, ellipszis, poligon) b) Minden belső pont kirajzolásával (kitöltött)

Területi primitívek: Zárt görbék által határolt területek (pl. kör, ellipszis, poligon)

Területi primitívek: Zárt görbék által határolt területek (pl. kör, ellipszis, poligon)

Máté: Számítógépes grafika alapjai

Információ megjelenítés Számítógépes ábrázolás. Dr. Iványi Péter

Szegedi Tudományegyetem Informatikai Tanszékcsoport tanév

Klár Gergely

A kurzusról. Pontok rajzolása. Szegedi Tudományegyetem Informatikai Tanszékcsoport

Képfeldolgozás és Számítógépes Grafika Tanszék 1. A SZÁMÍTÓGÉPES GRAFIKA TÁRGYA, ALKALMAZÁSAI

Képfeldolgozás és Számítógépes Grafika Tanszék 1. A SZÁMÍTÓGÉPES GRAFIKA TÁRGYA, ALKALMAZÁSAI

Érdekes informatika feladatok

Tartalom. Tartalom. Hajder Levente Szakasz raszterizálása. 2017/2018. II. félév. Poligon raszterizáció.

Szegedi Tudományegyetem Informatikai Tanszékcsoport tanév

Cohen-Sutherland vágóalgoritmus

Skaláris szorzat: a b cos, ahol α a két vektor által bezárt szög.

Kép mátrix. Feladat: Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 2/35

Számítógépes grafika

10. Koordinátageometria

Grafikus csővezeték és az OpenGL függvénykönyvtár

Fejezetek a számítógépi grafikából

main int main(int argc, char* argv[]) { return 0; } main return 0; (int argc, char* argv[]) main int int int main main main

Koordináta geometria III.

Objektumok és osztályok. Az objektumorientált programozás alapjai. Rajzolás tollal, festés ecsettel. A koordinátarendszer

Függvények Megoldások

Információ megjelenítés Számítógépes ábrázolás. Dr. Iványi Péter

2D képszintézis. Szirmay-Kalos László

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK MEGOLDÁSAI KÖZÉP SZINT Függvények

6. Függvények. 1. Az alábbi függvények közül melyik szigorúan monoton növekvő a 0;1 intervallumban?

b) Ábrázolja ugyanabban a koordinátarendszerben a g függvényt! (2 pont) c) Oldja meg az ( x ) 2

Máté: Számítógépes grafika alapjai

BME MOGI Gépészeti informatika 15.

Matematika 11 Koordináta geometria. matematika és fizika szakos középiskolai tanár. > o < szeptember 27.

Információ megjelenítés Számítógépes ábrázolás. Dr. Iványi Péter

Csoportmódszer Függvények I. (rövidített változat) Kiss Károly

Differenciálszámítás. 8. előadás. Farkas István. DE ATC Gazdaságelemzési és Statisztikai Tanszék. Differenciálszámítás p. 1/1

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK MEGOLDÁSAI KÖZÉPSZINT Függvények

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK MEGOLDÁSAI KÖZÉPSZINT Függvények

Láthatósági kérdések

Látható felszín algoritmusok

17. előadás: Vektorok a térben

Országzászlók (2015. május 27., Sz14)

Matematika A2 vizsga mgeoldása június 4.

Matematika 10 Másodfokú egyenletek. matematika és fizika szakos középiskolai tanár. > o < szeptember 27.

SZÁMÍTÓGÉPI GRAFIKA VÁGÁS

Érettségi feladatok Koordinátageometria_rendszerezve / 5

Lineáris leképezések. Wettl Ferenc március 9. Wettl Ferenc Lineáris leképezések március 9. 1 / 31

Számítógépes Grafika mintafeladatok

Alkalmazott Informatikai Tanszék SZÁMÍTÓGÉP-PROGRAMOZÁS dr.dudás László 21./0. 3D grafika programozása OpenGL támogatással A 3D API

Dinamikus modellek szerkezete, SDG modellek

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK KÖZÉP SZINT Függvények

Vektorok és koordinátageometria

Máté: Számítógépes grafika alapjai

Java és web programozás

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK KÖZÉP SZINT Függvények

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK MEGOLDÁSAI KÖZÉP SZINT. Koordináta-geometria

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Függvények. Dr. Bécsi Tamás 6. Előadás

Brósch Zoltán (Debreceni Egyetem Kossuth Lajos Gyakorló Gimnáziuma) Megoldások

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK KÖZÉPSZINT Függvények

A kör. A kör egyenlete

Helyvektorok, műveletek, vektorok a koordináta-rendszerben

Descartes-féle, derékszögű koordináta-rendszer

Exponenciális és logaritmusos kifejezések, egyenletek

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK MEGOLDÁSAI KÖZÉP SZINT Koordináta-geometria

Feladatok megoldásokkal az első gyakorlathoz (differencia- és differenciálhányados fogalma, geometriai és fizikai jelentése) (x 1)(x + 1) x 1

A brachistochron probléma megoldása

. Typeset by AMS -TEX 0

Szögfüggvények értékei megoldás

Matematika (mesterképzés)

Szürke árnyalat: R=G=B. OPENCV: BGR Mátrix típus: CV_8UC3 Pont típus: img.at<vec3b>(i, j) Tartomány: R, G, B [0, 255]

Q 1 D Q 2 (D x) 2 (1.1)

A Paint program használata

Brósch Zoltán (Debreceni Egyetem Kossuth Lajos Gyakorló Gimnáziuma) Megoldások

Koordináta-geometria feladatok (emelt szint)

Algoritmuselmélet. Legrövidebb utak, Bellmann-Ford, Dijkstra. Katona Gyula Y.

I. Vektorok. Adott A (2; 5) és B ( - 3; 4) pontok. (ld. ábra) A két pont által meghatározott vektor:

Modellezési transzformáció: [r lokális,1] T M = [r világ,1] Nézeti transzformáció: [r világ,1] T v = [r képernyo,1]

Grafika. Egyváltozós függvény grafikonja

Érettségi előkészítő emelt szint évf. Matematika. 11. évfolyam. Tematikai egység/fejlesztési cél

Készítette:

5. előadás. Skaláris szorzás

Szürke árnyalat: R=G=B. OPENCV: BGR Mátrix típus: CV_8UC3 Pont típus: img.at<vec3b>(i, j) Tartomány: R, G, B [0, 255]

1. ábra. 24B-19 feladat

1. Olvassuk be két pont koordinátáit: (x1, y1) és (x2, y2). Határozzuk meg a két pont távolságát és nyomtassuk ki.

Keresztmetszet másodrendű nyomatékainak meghatározása

SZE, Doktori Iskola. Számítógépes grafikai algoritmusok. Összeállította: Dr. Gáspár Csaba. Felületmegjelenítés

Analitikus térgeometria

Feladatok megoldásokkal a 9. gyakorlathoz (Newton-Leibniz formula, közelítő integrálás, az integrálszámítás alkalmazásai 1.

Haladó lineáris algebra

ANALÍZIS II. Példatár

2 (j) f(x) dx = 1 arcsin(3x 2) + C. (d) A x + Bx + C 5x (2x 2 + 7) + Hx + I. 2 2x F x + G. x

Számítási feladatok a Számítógépi geometria órához

A +Q töltés egy L hosszúságú egyenes szakasz mentén oszlik el egyenletesen (ld ábra ábra

Kettős integrál Hármas integrál. Többes integrálok. Sáfár Orsolya május 13.

KOVÁCS BÉLA, MATEMATIKA I.

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

Máté: Számítógépes grafika alapjai

Átírás:

Algoritmusok raszteres grafikához Egyenes rajzolása Kör rajzolása Ellipszis rajzolása

Algoritmusok raszteres grafikához Feladat: Grafikai primitíveket (pl. vonalat, síkidomot) ábrázolni kép-mátrixszal, meghatározni azokat a képpontokat, amelyek a primitív pontjai, vagy közel vannak a primitívhez. Modell: Képpont (= körlap), amely a négyzetháló csúcspontjaiban helyezhető el. A koordináták: egész számok

Egyenes rajzolása Tegyük fel, hogy egy vékony egyenes leírható az alábbi képlettel: y = m x + b A meredeksége: 0 < m < 1 (m = 0, 1 triviális, más esetekben pedig visszavezetjük 0 < m < 1-re) Legyen a vonal két végpontja (x 0, y 0 ) és (x 1, y 1 ) úgy hogy x 0 < x 1 és y 0 < y 1

Egyenes rajzolása: Alap inkrementális algoritmus (x 0, y 0 )-t kirajzoljuk, haladjunk x növekménnyel balról jobbra és válasszuk a legközelebbi pontot: (x i+1, [y i+1 + 0, 5]) = (x i+1, [m x i+1 + b + 0, 5]) A szorzás kiküszöbölhető inkrementálással: y i+1 = m x i+1 + b = m (x i + x) + b = y }{{} i +m x = y i + m m x i +b

Egyenes rajzolása: Alap inkrementális algoritmus Algoritmus: (ha m > 1, akkor x-et cseréljük ki y-nal) void Line(int x0, int y0, int x1, int y1) { int x; double dx, dy, m, y; dy = y1-y0; dx = x1-x0; m = dy / dx; y = y0; for (x=x0; x < x1; x++) { WritePixel(x, Round(y), value); // pontot rajzol y += m; } } // END Line

Egyenes rajzolása: Felezőpont algoritmus Egész aritmetika elegendő (Bresenham) Elv: Azt a képpontot válasszuk NE és E közül, amelyik a Q metszésponthoz közelebb van. Másképpen: A választásban az döntsön, hogy Q az M felezőpont melyik oldalán van. Tegyük fel, hogy x 0 < x 1 és y 0 < y 1

Egyenes rajzolása: Felezőpont algoritmus Az (x 0, y 0 ) és (x 1, y 1 ) pontokon áthaladó egyenes egyenlete: (x x 0 ) (x 1 x 0 ) = (y y 0) (y 1 y 0 ) innen átrendezve: (x x 0 )(y 1 y 0 ) = (y y 0 )(x 1 x 0 ) Legyen dx = (x 1 x 0 ) és dy = (y 1 y 0 ), ekkor (x x 0 ) dy = (y y 0 ) dx, amelyből: x dy x 0 dy y dx + y 0 dx = 0 Legyen Világos, hogy F (x, y) F (x, y) = x dy x 0 dy y dx + y 0 dx = 0 > 0, az egyenes az (x, y) felett fut = 0, az egyenes áthalad az (x, y) ponton < 0, az egyenes az (x, y) alatt fut

Egyenes rajzolása: Felezőpont algoritmus F (x, y) = x dy x 0 dy y dx + y 0 dx = 0 (x p, y p ) rajzolása után felezőpont kritérium: d = F (M) = F (x p +1, y p + 1 2 ) d: a döntési változó d változása a következő pontnál: > 0, M felett fut NE = 0, áthalad M-en NE vagy E < 0, M alatt fut E ha előzőleg E-t választottuk, akkor E = dúj d régi = F (x p + 2, y p + 1 2 ) F (x p + 1, y p + 1 2 ) = dy, ha előzőleg NE-t választottuk, akkor NE = dúj d régi = F (x p + 2, y p + 3 2 ) F (x p + 1, y p + 1 2 ) = dy dx,

Egyenes rajzolása: Felezőpont algoritmus F (x, y) = x dy x 0 dy y dx + y 0 dx = 0 Kezdés: d start = F (x 0 + 1, y 0 + 1 2 ) = F (x 0, y 0 ) + dy dx 2 = dy dx 2 Azért, hogy egész aritmetikával számolhassunk, használjuk inkább a 2 F (x, y) = 2 (x dy y dx + y 0 dx x 0 dy) függvényt, ennek előjele megegyezik F előjelével, és ekkor már egész szám. d start = 2 dy dx

Egyenes rajzolása: Felezőpont algoritmus void MidpointLine(int x0, int y0, int x1, int y1, int value){ int dx, dy, incre, incrne, d, y, x; dx = x1-x0; dy = y1-y0; d = 2*dy-dx; incre = 2*dy; incrne = 2*(dy - dx); x = x0; y = y0; WritePixel(x, y, value); while(x < x1) { if ( d <= 0 ) { // E-t valasztjuk x++; d += incre; } else { // NE-t valasztjuk x++; y++; d += incrne; } WritePixel(x, y, value); } // END while } // END Midpoint

Egyenes rajzolása: Felezőpont algoritmus Eredmény: például Tulajdonságok: csak összeadás és kivonás általánosítható ellipszisre és körre

Egyenes rajzolása Megjegyzés: Nem mindig lehet csak balról jobbra haladva rajzolni az egyeneseket. Például szaggatott vonallal zárt poligon Problémák: Különböző pontsorozat lesz az eredmény, ha balról jobbra vagy jobbról balra haladva rajzolunk. Legyen a választás: balról jobbra: d = 0 E-t választani jobbról balra: d = 0 SW-t választani

Egyenes rajzolása Problémák: A vonal pontjainak sűrűsége függ a meredekségtől. Megoldás: intenzitás változtatása kitöltött téglalapnak kell tekinteni az egyenes pontjait

OpenGL Egyenes szakasz rajzolása

Program: Szakaszrajzoló I. Rajzoljunk egy 5 pixel vastagságú egyenest, melynek egyik végpontja piros, a másik végpontja kék!

Program: Szakaszrajzoló II. void display() { glclear(gl COLOR BUFFER BIT); gllinewidth(5.0); // 5 pixel vastag vonal glshademodel(gl SMOOTH); glbegin(gl LINES); glcolor3d(1.0, 0.0, 0.0); //A piros vegpont glvertex2d(0.0,0.0); glcolor3d(0.0, 0.0, 1.0); // A kek végpont glvertex2d(200.0, 200.0); glend(); glflush(); }

Program: Szakaszrajzoló III. int main(int argc, char* argv[]) { glutinit(&argc, argv); glutinitdisplaymode(glut SINGLE GLUT RGB); glutinitwindowsize(200,200); glutinitwindowposition(100,100); glutcreatewindow( szakasz ); init(); glutdisplayfunc(display); glutkeyboardfunc(keyboard); glutmainloop(); return 0; }

Program Megjegyzés: glshademodel(gl SMOOTH) GL SMOOTH: a két végpont között a hozzájuk megadott színekkel interpolál GL FLAT: az utolsó végpont színével rajzol (GL POLYGON esetén az elsőével)

Algoritmusok raszteres grafikához Kör rajzolása

Kör rajzolása A kör egyenlete: x 2 + y 2 R 2 = 0, R egész szám Elég egy kör negyedet/nyolcadot megrajzolni, a többi rész a szimmetria alapján transzformációkkal (pl. tükrözés) előáll. x 0-tól R-ig növekszik y = R 2 x 2 Drága eljárás (szorzás, gyökvonás) Nem egyenletes

Kör rajzolása Polárkoordinátás alak: Most is elég egy nyolcadot kiszámítani. x = R cos θ y = R sin θ θ 0 -tól 90 -ig növekszik Drága eljárás (sin, cos)

Program: nyolcadkör Egyszerre 8 pontot helyezünk el. void Circlepoints(int x, int y, int value) { WritePixel( x, y, value) WritePixel( x, -y, value) WritePixel(-x, y, value) WritePixel(-x, -y, value) WritePixel( y, x, value) WritePixel(-y, x, value) WritePixel( y, -x, value) WritePixel(-y, -x, value) } // END Circlepoints

Kör rajzolása Felezőpont algoritmus körre: x 0-tól R 2 -ig, (amíg x y) Elv: E és SE közül azt a pontot választjuk, amelyikhez a körív metszéspontja közelebb van.

Felezőpont algoritmus körre F (x, y) = x 2 + y 2 R 2 d = F (M) = F (x p +1, y p 1 2 ) > 0, az (x, y) a körön kívül van = 0, az (x, y) a köríven van < 0, az (x, y) a köríven belül van. > 0, SE-t kell választani = 0, SE-t vagy E-t választjuk < 0, E-t kell választani.

Kör rajzolása: Felezőpont algoritmus d változása a következő pontnál: ha előzőleg E-t választottuk: F (x, y) = x 2 + y 2 R 2 = 0 E = dúj d régi = F (x p + 2, y p 1 2 ) F (x p + 1, y p 1 2 ) = 2 x p + 3 ha előzőleg SE-t választottuk: SE = dúj d régi = F (x p + 2, y p 3 2 ) F (x p + 1, y p 1 2 ) = 2 x p 2 y p + 5

Kör rajzolása: Felezőpont algoritmus körre Az iterációs lépések: 1. a döntési változó előjele alapján választjuk a következő képpontot 2. d = d + SE vagy d + E (a választástól függően). Figyeljük meg, hogy d egész számmal változik. Kezdés: kezdőpont: (0, R) felezőpont: (1, R 1 2 ) d = F (1, R 1 2 ) = 5 4 R nem egész szám!

Kör rajzolása: Felezőpont algoritmus körre Nem tudunk egész aritmetikát használni, ezért legyen h új döntési változó: Ekkor kezdéskor h = d 1 4 h = 5 4 R 1 4 = 1 R Kezdetben és a későbbiek során h egész szám Igaz, hogy d < 0 helyett h < 1 4-et kellene vizsgálni, de h egész volta miatt ez ekvivalens h < 0-val, tehát egész aritmetika használható Megjegyzés: F helyett 4F -fel is dolgozhatnánk.

Kör rajzolása: Felezőpont algoritmus körre void MidpointCircle(int R, int value) { int h; x=0; y = R; h = 1-R CirlcePoints(x,y,value); while(y >= x) { if (h < 0) { x++; h+=2*x+3; } else { x++; y--; h += 2*(x-y)+5 } // END if-else CirclePoints(x,y,value); } // END while }

Kör rajzolása: Felezőpont algoritmus körre

Algoritmusok raszteres grafikához Ellipszis rajzolása

Ellipszis rajzolása a 2 + b 2 = 1 b 2 x 2 + a 2 y 2 a 2 b 2 = 0 a és b egész számok F (x, y) = b 2 x 2 + a 2 y 2 a 2 b 2 A szimmetria miatt elég az első síknegyeben megrajzolni.

Ellipszis rajzolása Da Silva algoritmusa: (felezőpont algoritmus) Bontsuk a negyedeket két tartományra: Az 1. tartományban a 2 (y p 1 2 ) > b2 (x p + 1)

Ellipszis rajzolása: Da Silva algoritmusa Az 1. tartományban: { d 1 = F (x p + 1, y p 1 >= 0, E-t választjuk 2 ) < 0, SE-t választjuk Az 1. tartományban d változása: E = dúj d régi = F (x p + 2, y p 1 2 ) F (x p + 1, y p 1 2 ) = b 2 (2 x p + 3) SE = dúj d régi = F (x p + 2, y p 3 2 ) F (x p + 1, y p 1 2 ) = b 2 (2 x p + 3) + a 2 ( 2 y p + 2) E és SE egész szám.

Ellipszis rajzolása: Da Silva algoritmusa Kezdés: kezdőpont: (0, b) felezőpont: (1, b 1 2 ) d = F (1, b 1 2 ) = b2 + a 2 ( b 2 + 1 4 ) F (x, y) = b 2 x 2 + a 2 y 2 a 2 b 2 Ha F helyett 4F -el dolgozunk, akkor egész aritmetikát használhatunk. Házi feladat Az algoritmus a 2. tartományban.

Kör razolása: Da Silva algoritmusa void MidpointEllipse(int a, int b, int value) int x, y, a2, b2; double d1, d2; x=0; y=b; a2=a*a; b2=b*b; d1 = b2-a2*b+a2/4; EllipsePoints(x,y,value); ////// Region 1 ////// while (a2*(y-1/2) > b2*(x+1)) { if (d1 < 0) { // E-t valasztottuk d1+=b2*(2*x+3); x++; } else { // SE-t valasztottuk d1+=b2*(2*x+3)+a2*(-2*y+2); x++; y--; } EllipsePoints(x,y,value); } // END Region1 folytatódik a következő dián...

Kör rajzolása: Da Silva algoritmusa... folytatás ////// Region2 /////// while (y > 0) { if (d2 < 0) { // SE-t valasztjuk d2+=b2*(2*x+2) +a2*(-2*y+3); x++; y--; } else { // S-et valasztjuk d2+= a2*(-2*y+3); y--; } EllipsePoints(x,y,value); } // END Region2 } // MidpointEllipse

OpenGL Feladat: Kör rajzolása felezőpont algoritmussal