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

Hasonló dokumentumok
Cohen-Sutherland vágóalgoritmus

Közismereti informatika 2.zh T-M szakirány

SZÁMÍTÓGÉPI GRAFIKA MARKEREK

Algoritmusok helyességének bizonyítása. A Floyd-módszer

Algoritmizálás és adatmodellezés tanítása 1. előadás

Demográfiai modellek (folytatás)

Egyenletek, egyenletrendszerek, egyenlőtlenségek Megoldások

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

10. Koordinátageometria

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

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

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

Függvények Megoldások

Rendezések. A föltöltés nemcsak az r-re vonatkozik, hanem az s-re is. Ez használható föl a további rendezések

1. A feladatról. 2. Az áramkör leírása. Mechatronika, Optika és Gépészeti Informatika Tanszék D528. Léptetőmotor vezérlése

NAGYPONTOSSÁGÚ EGÉSZ-ARITMETIKA TARTALOM

14. Mediánok és rendezett minták

Az egyenes egyenlete: 2 pont. Az összevont alak: 1 pont. Melyik ábrán látható e függvény grafikonjának egy részlete?

Algoritmusok vektorokkal keresések 1

Feltételezés: A file strukturálisan helyes, tanszékenként nem üres, de az adott listázási feladatban kikötött számút nem haladja meg.

2. Milyen értéket határoz meg az alábbi algoritmus, ha A egy vektor?. (2 pont)

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

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

Algoritmusok bonyolultsága

Klár Gergely

end function Az A vektorban elõforduló legnagyobb és legkisebb értékek indexeinek különbségét.. (1.5 pont) Ha üres a vektor, akkor 0-t..

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

Programozás alapjai. 5. előadás

Abszolútértékes és gyökös kifejezések Megoldások

REKURZIÓK SZÁMÍTÓGÉPES PROGRAMOK SEGÍTSÉGÉVEL

Komputeralgebra Rendszerek

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

a) A logaritmus értelmezése alapján: x 8 0 ( x 2 2 vagy x 2 2) (1 pont) Egy szorzat értéke pontosan akkor 0, ha valamelyik szorzótényező 0.

Az Összegfokozatos listázás téma 2. gyakorlata

Algoritmizálás + kódolás C++ nyelven és Pascalban

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK MEGOLDÁSAI EMELT SZINT Abszolútértékes és Gyökös kifejezések

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK MEGOLDÁSAI KÖZÉPSZINT Abszolútértékes és gyökös kifejezések

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

DOKUMENTÁCIÓ KÉSZÍTETTE: Naszári László I. évf. levelező Informatika tanári szak 2003.

Összeállította: dr. Leitold Adrien egyetemi docens

Algoritmusok raszteres grafikához

Internet programozása. 3. előadás

Trigonometria Megoldások. 1) Igazolja, hogy ha egy háromszög szögeire érvényes az alábbi összefüggés: sin : sin = cos + : cos +, ( ) ( )

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

A feladat. A főprogram

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

Programozás BMEKOKAA146. Dr. Bécsi Tamás 3. előadás

Koordinátageometria. M veletek vektorokkal grakusan. Szent István Egyetem Gépészmérnöki Kar Matematika Tanszék 1

egyenletrendszert. Az egyenlő együtthatók módszerét alkalmazhatjuk. sin 2 x = 1 és cosy = 0.

Vektorgeometria (2) First Prev Next Last Go Back Full Screen Close Quit

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

Vektorok és koordinátageometria

A C# programozási nyelv alapjai

Érdekes informatika feladatok

Összetett programozási tételek Rendezések Keresések PT egymásra építése. 10. előadás. Programozás-elmélet. Programozás-elmélet 10.

Lineáris algebra. (közgazdászoknak)

2. Visszalépéses keresés

Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1

BASH script programozás II. Vezérlési szerkezetek

Arany Dániel Matematikai Tanulóverseny 2012/2013-as tanév kezdők III. kategória I. forduló

Webprogramozás szakkör

2. Visszalépéses stratégia

Gauss-Jordan módszer Legkisebb négyzetek módszere, egyenes LNM, polinom LNM, függvény. Lineáris algebra numerikus módszerei

Exponenciális, logaritmikus függvények

Pásztor Attila. Algoritmizálás és programozás tankönyv az emeltszintű érettségihez

Programozási alapismeretek 3. előadás

Analitikus térgeometria

20. tétel A kör és a parabola a koordinátasíkon, egyenessel való kölcsönös helyzetük. Másodfokú egyenlőtlenségek.

Koordináta-geometria. Fogalom. Jelölés. Tulajdonságok, definíciók

Időjárási csúcsok. Bemenet. Kimenet. Példa. Korlátok. Nemes Tihamér Nemzetközi Informatikai Tanulmányi Verseny, 2-3. korcsoport

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

Programozási segédlet

Feladatok Házi feladat. Keszeg Attila

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

NULLADIK MATEMATIKA ZÁRTHELYI

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás 3. előadás

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

Táblázatok fontosabb műveletei 1

Kifejezések. Kozsik Tamás. December 11, 2016

Programozási tételek általánosítása 2. Szlávi Péter 2015

Demográfiai modellek

EGYVÁLTOZÓS FÜGGVÉNYEK ÁBRÁZOLÁSA

Egyenletek, egyenlőtlenségek grafikus megoldása TK. II. kötet 25. old. 3. feladat

Abszolútértékes egyenlôtlenségek

Arany Dániel Matematikai Tanulóverseny 2016/2017-es tanév első (iskolai) forduló Haladók II. kategória

Számítógépes Grafika mintafeladatok

Hódmezővásárhelyi Városi Matematikaverseny április 14. A osztályosok feladatainak javítókulcsa

Feladatok megoldásokkal a harmadik gyakorlathoz (érintési paraméterek, L Hospital szabály, elaszticitás) y = 1 + 2(x 1). y = 2x 1.

Lineáris egyenletrendszerek

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

Egyszerű példaprogramok gyakorláshoz

Analitikus térgeometria

Az első fájlos program

Oktatási Hivatal. 1 pont. A feltételek alapján felírhatók az. összevonás után az. 1 pont

Szkriptnyelvek. 1. UNIX shell

Programok értelmezése

MATEMATIKA ÉRETTSÉGI október 15. KÖZÉPSZINT I.

Edényrendezés. Futási idő: Tegyük fel, hogy m = n, ekkor: legjobb eset Θ(n), legrosszabb eset Θ(n 2 ), átlagos eset Θ(n).

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

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)

Átírás:

SZÁMÍTÓGÉPI GRAFIKA VÁGÁS FELADAT: Ha az alakzat nagyobb, mint a képtartomány, amelyben megjelenítendő, akkor a kívül eső részeket el kell hagyni, azaz az alakzatról le kell vágni, röviden szólva: az alakzatot vágni kell. Tegyük föl, hogy az alakzat (egyenes) szakaszokra bontható. (A tartományok vágása hasonlóan megoldható, bár további problémákat is fölvet.) Az alábbiakban szakaszok vágását vizsgáljuk. Cohen-Sutherland módszere Cohen-Sutherland algoritmusa a következő felismerésre épít: A szakasz és a képtartomány kölcsönös viszonya lényegében a következő négyféle lehet: a szakasz 1. teljesen benne van a képtartományban (l. az ábrán az A szakaszt), 2. csak egyik végpontja esik a tartományba (l. az ábrán az B szakaszt), 3. bár mindkét végpontja kívül esik a tartományon mégis a középső darabja a tartományban fut (l. az ábrán az C szakaszt), 4. és a tartomány nem rendelkezik közös ponttal (l. az ábrán az D szakaszt). 1. ábra. Szakasz és képtartomány viszonya. Mindenek előtt próbálja ki: mire lehet gondolni (csvagasfp.exe,/csvagastp.exe)! Szokás szerint a képernyővel megegyező állású téglalapra gondolunk képtartomány esetén. 1

A lényeg Osszuk fel a képtartományt magába foglaló síkot 9 részre, és sorszámozzuk meg az alábbiak szerint. Vegyük észre a sorszámokban a bináris szabályszerűséget! 9=1001 2 1=0001 2 3=0011 2 8=1000 2 0=0000 2 2=0010 2 12=1100 2 4=0100 2 6=0110 2 (-: Ugye megvan a bináris logika? :-) Egy-egy bit tartozik a felső, a balsó, az alsó és a jobbsó a négy kívül levő síkrészhez. A vágandó szakasz végpontjait kódoljuk a szerint, melyik tartományba esik. Ha a szakasz mindkét végpontja 0-kódú, akkor kirajzolható. Ha nem, akkor gondolkodni kell! :-) Vegyük észre: akkor és csak akkor fut a szakasz egyértelműen szerencsétlen tartomány(ok)ba, ha a két végpont-kód bites ÉS-művelet eredménye nem 0 értékű. (Például: 9 ÉS 3 = 1001 2 ÉS 0011 2 = 0001 2 éppen az a bit 1-es, amelyik a szerencsétlen tartományhoz van rendelve.) Ha egyéb eset áll fenn, akkor egyszer vagy kétszer metszi a (0-kódú) képtartomány határoló egyeneseit. A feladat e metszéspontok megtalálása. Valahogy így : Eljárás CSVagas(Változó p1,p2:tpont): Változó c,c1,c2:tkod; p:tpont c1:=végpontkód(p1); c2:=végpontkód(p2) Ciklus amíg nem ((c1=0) és (c2=0)) [legalább egyik végpont még nincs belül] és ((c1 ÉS c2)=0) [a szakasz nem biztos, hogy kívül fut] Ha c1=0 akkor [p1 OK. Nézzük a másikat: Csere(p1,p2)] p:=p1; p1:=p2; p2:=p; c:=c1; c1:=c2; c2:=c Elágazás vége [p1 felöli új metszéspont meghatározása => p1] Elágazás (c1 ÉS 1)=1 esetén FelsoVagas(p1.x,p1.y,p2.x,p2.y) (c1 ÉS 2)=2 esetén JobbVagas(p1.x,p1.y,p2.x,p2.y) (c1 ÉS 4)=4 esetén AlsoVagas(p1.x,p1.y,p2.x,p2.y) (c1 ÉS 8)=8 esetén BalVagas(p1.x,p1.y,p2.x,p2.y) Elágazás vége c1:=végpontkód(p1) Ciklus vége balsó 1xxx 2, alsó x1xx 2, jobbsó xx1x 2, felső xxx1 2 A logikai műveletek jelei kisbetűsek, a bit-műveletek NAGYBETŰSEK. 2

Ha (c1=0) és (c2=0) akkor {a belső szakasz kirajzolható} Szakasz(p1,p2) Elágazás vége Eljárás vége. 2. ábra. Képernyő-koordinátarendszer és képtartomány Függvény VégpontKód(Konstans p:tpont):tkód Változó c:tkod c:=0 Ha p.y<kf akkor c:=c VAGY 1 Ha p.x>kj akkor c:=c VAGY 2 Ha p.y>ka akkor c:=c VAGY 4 Ha p.x<kb akkor c:=c VAGY 8 VégpontKód:=c Eljárás vége. Az egyes vágáseljárások meghatározzák a p1 és p2 pontra illeszkedő egyenes és a megfelelő határoló egyenes metszéspontját. Ez két lineáris egyenletből álló egyenletrendszer megoldását jelenti. Például a FelsőVágás esetében: az y=(y 2 -y 1 )/(x 2 -x 1 )*(x-x 1 )+y 1 és az y=kf egyenletek megoldását keressük. Azaz x-re kell rendezni a KF=(y 2 -y 1 )/(x 2 -x 1 )*(x-x 1 )+y 1 egyenletet, amiből már következik a keresett x és y: x=x 1 +(x 2 -x 1 )/(y 2 -y 1 )*(KF-y 1 ) y=kf Azaz az eljárás kódja: Eljárás FelsoVagas(Változó x1,y1,x2,y2:egész 1 ): x1:=x1+(x2-x1)/(y2-y1)*(kf-y1); y1:=kf Eljárás vége. A program az alábbi deklarációk után válik teljesen érthetővé, egyértelművé: Típus TPont=Rekord(x,y:Egész) TKod=0..12 1 Világos, hogy valójában csak az 1. pont koordinátái fognak változni, így precízebb lenne az alábbi szignatúra: Eljárás FeloVagas(Változó x1,y1:egész, Konstans x2,y2:egész) 3

3. ábra. A Cohen-Sutherland algoritmusa működés közben. A (Turbo/Free Pascal) keretprogram olvasható alább, amelyben csak néhány eljárás törzse maradt kitöltendő. (Letölthető a Free Pascal-hoz: LetoltendoVagasFP.zip) A KERETPROGRAM 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 Program Vagas; Uses Crt,Graph; Const gpath='c:\langs\tp\bgi'; {KépTartományt határoló egyenesek paraméterei (VGA-hoz igazítva):} KF0=100; KB0=100; KJ0=500; KA0=350; MaxX0=640; MaxY0=480; {Próbaszakaszok száma:} SzakaszDb=5; Type TPont=Record x,y:integer TSzakasz=Array [1..2] of TPont; TKod=0..12; Const {Próbaszakaszok:} sz:array [1..SzakaszDb] of TSzakasz=( ((x:kb0+229;y:kf0+129),(x:kj0-229;y:ka0-129)), ((x:kb0-19;y:kf0+19),(x:kb0+190;y:kf0+39)), ((x:kb0-9;y:ka0-19),(x:kj0+19;y:ka0-99)), ((x:kb0-9;y:kf0-9),(x:kj0+19;y:kf0-19)), ((x:kb0-59;y:ka0+59),(x:kj0+69;y:kf0-69)) ); p1,p2:tpont; i:integer; KF,KB,KA,KJ:Integer; 4

27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 Procedure Inic; i,j, gd,gm:integer; nyx,nyy:real; DetectGraph(gd,gm); InitGraph(gd,gm,gPath); ClearDevice; {képernyőre transzformálás (TP->FP miatt):} nyx:=getmaxx/maxx0; nyy:=getmaxy/maxy0; KF:=Round(KF0*nyY); KA:=Round(KA0*nyY); KB:=Round(KB0*nyX); KJ:=Round(KJ0*nyX); For i:=1 to SzakaszDb do For j:=1 to 2 do sz[i][j].x:=round(sz[i][j].x*nyx); sz[i][j].y:=round(sz[i][j].y*nyy); SetLineStyle(SolidLn, 0, ThickWidth); SetColor(Green); Rectangle(KB,KF,KJ,KA); Procedure Szakasz(Const p1,p2:tpont); Line(p1.x,p1.y,p2.x,p2.y); Function VegpontKod(Const p:tpont):tkod; Procedure FelsoVagas( x1,y1,x2,y2:integer); Procedure AlsoVagas( x1,y1,x2,y2:integer); Procedure BalVagas( x1,y1,x2,y2:integer); Procedure JobbVagas( x1,y1,x2,y2:integer); 5

78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 Procedure CSVagas( p1,p2:tpont); c,c1,c2:tkod; p:tpont; Inic; For i:=1 to SzakaszDb do SetColor(Red); p1:=sz[i][1]; p2:=sz[i][2]; Szakasz(p1,p2); ReadKey; CSVagas(p1,p2); ReadKey End. Minden egyben letölthető: Vagas.zip. 6

A MEGOLDÁS: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 Program Vagas; Uses Crt,Graph; Const gpath='c:\langs\tp\bgi'; {KépTartományt határoló egyenesek paraméterei (VGA-hoz igazítva):} KF0=100; KB0=100; KJ0=500; KA0=350; MaxX0=640; MaxY0=480; {Próbaszakaszok száma:} SzakaszDb=5; Type TPont=Record x,y:integer TSzakasz=Array [1..2] of TPont; TKod=0..12; Const sz:array [1..SzakaszDb] of TSzakasz=( ((x:kb0+229;y:kf0+129),(x:kj0-229;y:ka0-129)), ((x:kb0-19;y:kf0+19),(x:kb0+190;y:kf0+39)), ((x:kb0-9;y:ka0-19),(x:kj0+19;y:ka0-99)), ((x:kb0-9;y:kf0-9),(x:kj0+19;y:kf0-19)), ((x:kb0-59;y:ka0+59),(x:kj0+69;y:kf0-69)) ); p1,p2:tpont; i:integer; KF,KB,KA,KJ:Integer; Procedure Inic; i,j, gd,gm:integer; nyx,nyy:real; DetectGraph(gd,gm); InitGraph(gd,gm,gPath); ClearDevice; {képernyőre transzformálás (TP->FP miatt):} nyx:=getmaxx/maxx0; nyy:=getmaxy/maxy0; KF:=Round(KF0*nyY); KA:=Round(KA0*nyY); KB:=Round(KB0*nyX); KJ:=Round(KJ0*nyX); For i:=1 to SzakaszDb do For j:=1 to 2 do sz[i,j].x:=round(sz[i,j].x*nyx); sz[i,j].y:=round(sz[i,j].y*nyy); 7

46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 SetLineStyle(SolidLn, 0, ThickWidth); SetColor(Green); Rectangle(KB,KF,KJ,KA); Procedure Szakasz(Const p1,p2:tpont); Line(p1.x,p1.y,p2.x,p2.y); Function VegpontKod(Const p:tpont):tkod; c:tkod; c:=0; If p.y<kf then c:=c OR 1; If p.x>kj then c:=c OR 2; If p.y>ka then c:=c OR 4; If p.x<kb then c:=c OR 8; VegpontKod:=c Procedure FelsoVagas( x1,y1,x2,y2:integer); x1:=round(x1+(x2-x1)/(y2-y1)*(kf-y1)); y1:=kf Procedure AlsoVagas( x1,y1,x2,y2:integer); x1:=round(x1+(x2-x1)/(y2-y1)*(ka-y1)); y1:=ka Procedure BalVagas( x1,y1,x2,y2:integer); y1:=round(y1+(y2-y1)/(x2-x1)*(kb-x1)); x1:=kb Procedure JobbVagas( x1,y1,x2,y2:integer); y1:=round(y1+(y2-y1)/(x2-x1)*(kj-x1)); x1:=kj Procedure CSVagas( p1,p2:tpont); c,c1,c2:tkod; p:tpont; Hogy ne legyen a részletszámítások során sem túlcsordulás az első adandó helyen osztunk. 8

95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 VegpontKod(c1,p1); VegpontKod(c2,p2); While not ((c1=0) and (c2=0)) {legalább egyik még nincs belül} and ((c1 AND c2)=0) {nem biztos, hogy kívül} do If c1=0 then {p1 OK. Nézzük a másikat: Csere(p1,p2)} c:=c1; c1:=c2; c2:=c; p:=p1; p1:=p2; p2:=p; {p1 felöli új metszéspont meghatározása => p1} If (c1 AND 1)=1 then FelsoVagas(p1.x,p1.y,p2.x,p2.y) else if (c1 AND 2)=2 then JobbVagas(p1.x,p1.y,p2.x,p2.y) else if (c1 AND 4)=4 then AlsoVagas(p1.x,p1.y,p2.x,p2.y) else if (c1 AND 8)=8 then BalVagas(p1.x,p1.y,p2.x,p2.y) {EndIf}; VegpontKod(c1,p1); {Metszéspont-keresés -- nyomkövetés:} SetLineStyle(CenterLn, 0, NormWidth); SetColor(Yellow); Szakasz(p1,p2); ReadKey; SetLineStyle(SolidLn, 0, ThickWidth); {Nyomkövetés vége} If (c1=0) and (c2=0) then {a belső szakasz kirajzolható} SetColor(Blue); Szakasz(p1,p2); Inic; For i:=1 to SzakaszDb do SetColor(Red); p1:=sz[i][1]; p2:=sz[i][2]; Szakasz(p1,p2); ReadKey; CSVagas(p1,p2); ReadKey End. 9