<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="hu">
	<id>https://vik.wiki/index.php?action=history&amp;feed=atom&amp;title=2008._01._03._vizsga</id>
	<title>2008. 01. 03. vizsga - Laptörténet</title>
	<link rel="self" type="application/atom+xml" href="https://vik.wiki/index.php?action=history&amp;feed=atom&amp;title=2008._01._03._vizsga"/>
	<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=2008._01._03._vizsga&amp;action=history"/>
	<updated>2026-05-12T20:19:31Z</updated>
	<subtitle>Az oldal laptörténete a wikiben</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://vik.wiki/index.php?title=2008._01._03._vizsga&amp;diff=138307&amp;oldid=prev</id>
		<title>Unknown user: Új oldal, tartalma: „{{GlobalTemplate|Infoalap|SzgGrafVizsga20080103}}   __TOC__  ==Infók &lt;br&gt;== * rendelkezésre álló idő 80 perc.  &lt;br&gt; * Összesen szerezhető pontok: 40 (=20+10+5+5)…”</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=2008._01._03._vizsga&amp;diff=138307&amp;oldid=prev"/>
		<updated>2012-10-21T20:16:44Z</updated>

		<summary type="html">&lt;p&gt;Új oldal, tartalma: „{{GlobalTemplate|Infoalap|SzgGrafVizsga20080103}}   __TOC__  ==Infók &amp;lt;br&amp;gt;== * rendelkezésre álló idő 80 perc.  &amp;lt;br&amp;gt; * Összesen szerezhető pontok: 40 (=20+10+5+5)…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Új lap&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{GlobalTemplate|Infoalap|SzgGrafVizsga20080103}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Infók &amp;lt;br&amp;gt;==&lt;br /&gt;
* rendelkezésre álló idő 80 perc.  &amp;lt;br&amp;gt;&lt;br /&gt;
* Összesen szerezhető pontok: 40 (=20+10+5+5)  &amp;lt;br&amp;gt;&lt;br /&gt;
* A vizsga sikeres = (1. feladat &amp;gt;= 6 pont) &amp;amp;&amp;amp; (összes pont &amp;gt;= 16 pont);  &amp;lt;br&amp;gt;&lt;br /&gt;
* {{InLineFileLink|Infoalap|SzgGrafVizsga20080103|megooldas.doc|Hivatalos megoldás}}&lt;br /&gt;
&lt;br /&gt;
==1. feladat &amp;lt;br&amp;gt;==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Írjon Color Trace (Vector s, Vector d, int depth) függvényt, amely megkapja a sugár kezdőpontját (s) és irányát (d, amely egység hosszú), a maximális rekurziós mélységet (depth), és kiszámolja a sugár mentén visszafelé haladó fény sugársűrűségét az r,g,b hullámhosszokon. A globális változóval megadott színtér (scene) nsik db síkból áll, amelyek mindkét oldala Phong-Blinn modell szerint spekulárisan (figyelem, nem Phong modellről van szó!) veri vissza a fényt. A sík két oldala ugyanolyan optikai paraméterekkel rendelkezik. Egy, globális változóval megadott irányfényforrás van (light), amely csak a (végtelen távoli) fényforrásból látható felületeket világítja meg (árnyékszámítás kell!).&amp;#039;&amp;#039;&amp;#039;	&amp;lt;br&amp;gt;&lt;br /&gt;
Pontozás:  &amp;lt;br&amp;gt;&lt;br /&gt;
* megoldás elvének leírása képletekkel = 3 pont  &amp;lt;br&amp;gt;&lt;br /&gt;
* láthatósági feladat megoldása C++ nyelven = 6 pont  &amp;lt;br&amp;gt;&lt;br /&gt;
* spekuláris visszaverődés számítása Phong-Blinn modell szerint C++-ban = 6 pont (Phong modell 0 pontot ér)  &amp;lt;br&amp;gt;&lt;br /&gt;
* árnyékszámítás C++-ban = 5 pont  &amp;lt;br&amp;gt;&lt;br /&gt;
* Minden olyan program és pszeudokód, amely jelöléseiben vagy funkciójában nem felel meg a kitűzött feladatnak = -10 pont  &amp;lt;br&amp;gt;&lt;br /&gt;
A felhasználható osztályok:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Color{&lt;br /&gt;
float r,g,b;&lt;br /&gt;
Color (float r0, float g0, float b0){r=r0; g=g0; b=b0;}&lt;br /&gt;
Color operator* (Color c){return Color(r*c.r, g*c.g, b*c.b);}&lt;br /&gt;
Color operator* (float c){return Color(r*c, g*c, b*c);}&lt;br /&gt;
Color operator+ (Color c){return Color(r+c.r, g+c.g, b+c.b);}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Vector{&lt;br /&gt;
float x,y,z;&lt;br /&gt;
Vector (float x0, float y0, float z0){x=x0; y=y0; z=z0;}&lt;br /&gt;
Vector operator*(float c){return Vector(x*c, y*c, z*c);}&lt;br /&gt;
Vector operator+(Vector c){return Vector(x+c.x, y+c.y, z+c.z);}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Sik{&lt;br /&gt;
Vector r0;	//helyvektor Descartes koordinátái&lt;br /&gt;
Vector N;	//sík normálvektora (egységhosszú)&lt;br /&gt;
Color ks;	//a spekuláris fényvisszaverődési tényező&lt;br /&gt;
float shininess;	//a Phong-Blinn modell exponens&lt;br /&gt;
} scene[nsik];&lt;br /&gt;
&lt;br /&gt;
struct Feny{&lt;br /&gt;
Vector D;	//fényforrás iránya&lt;br /&gt;
Color I;	//bejövő sugársűrűség&lt;br /&gt;
} light;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A megoldás elve:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A Trace függvény megkeresi azt a síkot melyet a sugár legelőször metsz.&lt;br /&gt;
A sugár paraméteres egyenlete: r(t)=s+d*t.&lt;br /&gt;
A sík implicit egyenlete: (r-r0)*N=0.&lt;br /&gt;
Az előbbit az utóbbiba helyettesítve:&lt;br /&gt;
(r(t)-r0)*n=0&lt;br /&gt;
(s+d*t-r0)*n=0&lt;br /&gt;
(s-r0+d*t)*n=0&lt;br /&gt;
(s-r0)*n+d*t*n=0&lt;br /&gt;
d*n*t=-(s-r0)*n&lt;br /&gt;
Ebből meghatározható a metszésponthoz tartozó t érték: t=(r0-s)*n / d*n&lt;br /&gt;
Amiből a metszéspont: p=s+d*t&lt;br /&gt;
&lt;br /&gt;
Ezután a metszéspontból sugarat indít a fényforrás irányával ellentétes irányba, és megnézi az metsz-e más síkot. Ha igen, akkor a pont árnyékban van, nincs abban a pontban direkt megvilágításból érkező fény. Ha nem, akkor a kimenő sugársűrűséghez hozzáadja a direkt megvilágításból származó fény hatását.&lt;br /&gt;
A Phong-Blinn modell a nézeti irány vektorának (V) és a megvilágítási irány vektorának (L) felezővektora (H=L+V/|L+V) és a felületi normálvektor (N) által bezárt szöggel (fi) számolja a spekulárisan visszavert sugársűrűséget az alábbi módon: Lout=Lin*ks*(cos fi)^shininess.&lt;br /&gt;
A cos fi skaláris szorzatként is megkapható egységvektorok esetén: cos fi=H*N&lt;br /&gt;
&lt;br /&gt;
A direkt megvilágítás vizsgálata után az ideális visszaverődési irányból érkező sugársűrűségre számolja a spekuláris visszaverődést ugyanilyen módon és ezt is hozzáadja a kimenő sugársűrűséghez.&lt;br /&gt;
Ehhez a visszaverődés iránya: R=V+2*cos alfa, ahol az alfa a normálvektor és a nézeti irány által bezárt szög. A cos alfa=-N*V skaláris szorzatnak felel meg.&lt;br /&gt;
A visszaverődési irányból érkező sugársűrűség a függvény rekurzív hívásával kereshető meg, a sugarat a metszéspontból a visszaverődési irány felé indítva. (Persze csak a megadott mélységig)&lt;br /&gt;
&lt;br /&gt;
-- [[BudaiPeterIstvan|buc]] - 2008.01.04.&lt;br /&gt;
&lt;br /&gt;
==2. feladat &amp;lt;br&amp;gt;==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Melyik pixelt változtatja meg az alábbi program?&amp;#039;&amp;#039;&amp;#039; &amp;lt;br&amp;gt;&lt;br /&gt;
Pontozás: &amp;lt;br&amp;gt;&lt;br /&gt;
* a pixel x,y koordinátáinak megadása számítással együtt = 10 pont &amp;lt;br&amp;gt;&lt;br /&gt;
* az alábbi sorok jelentésének taglalása = -5 pont &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
glDisable(GL_DEPTH_TEST);&lt;br /&gt;
glViewport(0 /*left*/, 0 /*bottom*/, 200 /*width*/, 200 /*height*/)&lt;br /&gt;
glMatrixMode(GL_PROJECTION);&lt;br /&gt;
glLoadIdentity();&lt;br /&gt;
gluPerspective(90 /*fov*/, 1 /*aspect*/, 1 /*fp*/, 1000 /*bp*/);&lt;br /&gt;
glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
glLoadIdentity();&lt;br /&gt;
gluLookAt(0 /*eyex*/, 0 /*eyey*/, 6 /*eyez*/, 0 /*lax*/, 0 /*lay*/, -1 /*laz*/, 0 /*upx*/, 1 /*upy*/, 0 /*upz*/);&lt;br /&gt;
glTranslatef(-15.0, -10.0, -49.0);&lt;br /&gt;
glBegin(GL_POINTS);&lt;br /&gt;
glVertex4f(0, 0, 2, -2);&lt;br /&gt;
glEnd();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Megoldás:&amp;#039;&amp;#039;&amp;#039; &amp;lt;br&amp;gt;&lt;br /&gt;
Hát ahogy azt már órán számtalanszor hallhattuk, az OpenGL kódot visszafelé kell olvasni. :)&amp;lt;br&amp;gt;&lt;br /&gt;
Így:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
glBegin(GL_POINTS);&lt;br /&gt;
glVertex4f(0, 0, 2, -2);&lt;br /&gt;
glEnd();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Felveszünk egy pontot a [0,0,2,-2] koordinátára.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
glLoadIdentity();&lt;br /&gt;
gluLookAt(0 /*eyex*/, 0 /*eyey*/, 6 /*eyez*/, 0 /*lax*/, 0 /*lay*/, -1 /*laz*/, 0 /*upx*/, 1 /*upy*/, 0 /*upz*/);&lt;br /&gt;
glTranslatef(-15.0, -10.0, -49.0);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
A modelview trafó mátrixát állítjuk be. Vagyis...&amp;lt;br&amp;gt;&lt;br /&gt;
glTranslatef(-15.0, -10.0, -49.0); -&amp;gt; Ez egy eltolás. Tehát eltoljuk a dolgokat a [-15,-10,-49] pontba. Ez mátrixban így néz ki:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \left[ \begin{array}{rrrr} 1 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\ 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 \\ 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 \\ -15 &amp;amp; -10 &amp;amp; -49 &amp;amp; 1 \end{array} \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Ha a fenti pontunkat megszorozzuk ezzel a mátrixszal, akkor eredményül a [30,20,100,-2] pontot kapjuk. Homogén osztás után ez a [-15,-10,-50,1] pont lesz.&lt;br /&gt;
Ezek után jön a gluLookAt(...), ami megmondja, hogy honnan is nézünk mi erre a pontra rá. Én a feladatban úgy emlékszem, hogy a szem z koordinátája is 0 volt, tehát a szem az origóban volt. A következő 3 koordináta adja meg a nézeti irányt, amiből kiderül, hogy a kamera a -Z irányba néz. (Ez nekünk történetesen pont jó, mert a mi pontunk is arra van.) Az utolsó 3 koordináta meg megadja a függőleges irányt. Ez az y tengely lesz.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
glMatrixMode(GL_PROJECTION);&lt;br /&gt;
glLoadIdentity();&lt;br /&gt;
gluPerspective(90 /*fov*/, 1 /*aspect*/, 1 /*fp*/, 1000 /*bp*/);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Itt a gluPerspective adja meg a perspektív transzformáció paramétereit. (A perspektív transzformációhoz érdemes megnézni a könyv 195. oldalát.)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
glViewport(0 /*left*/, 0 /*bottom*/, 200 /*width*/, 200 /*height*/)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ez pedig megadja, hogy a viewportunk 200x200-as.&amp;lt;br&amp;gt;&lt;br /&gt;
A mi pontunk z=-50-nél van, így ez a pixel a képernyőn a [(-15+50)*2, (-10+50)*2] vagyis [70,80] lesz.&amp;lt;br&amp;gt;&lt;br /&gt;
(Csak végig kell gondolni, hogy a z=-50-nél az a négyzet, amit lát a kamera (négyzet, mert aspect=1) [-50,-50] és [50,50] koordináták közötti terület. És ezt a négyzetet kell egy [0,0] [200,200] nagyságú négyzetre &amp;quot;transzformálni&amp;quot;, ami a képernyő.)&lt;br /&gt;
-- [[ZoltanH|Mezzanine]] - 2008.01.03.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Magyarázat a mintamegoldáshoz:&lt;br /&gt;
A gluPerspective első két paramétere szerencsére biztositja hogy a nézeti gúlát ne kelljen normálni (a 90 fokos látószög és az 1-es aspect miatt), igy az x-y koordináták maradnak önmaguk a perspektiv transzf. után, csak a Z és a súly változik. A Z némileg összetettebb képlet szerint - de ez itt nem is fontos, kiszámitását mellőzzük -, a súly pedig egyszerüen a Kamera-koordinátarendszer Z értékének ellentettje lesz.&lt;br /&gt;
&lt;br /&gt;
Most jön a vágás, még homogén alakban. Jelen esetben egyszerüen örülünk hogy minden érték abszolútértékben kisebb mint a súly - a Zről feltételezzük, mivel nem jegyeztük meg a pontos képletét -, vagyis a pont látható lesz.&lt;br /&gt;
&lt;br /&gt;
Ezután elvégezzük a homogén osztást, majd végiggondoljuk hogy ha a pont x-y koordinátái a (+-1,+-1)-es négyzet közepéről nézve (-0.3,-0.2), akkor 200x200as, bal alulról tekintett rendszerben ez (70,80)-nak fog megfelelni. Ez egyébként a képernyőtranszformáció, ahol az x-y képernyőkoordinátákat úgy kapjuk hogy a homogén-osztott x-y eszközkoordinátát hozzáadjuk 1-hez, majd ezt szorozzuk a képszélesség felével.&lt;br /&gt;
&lt;br /&gt;
Mivel egyetlen pontról szólt a feladat, a Z koordinátának a képernyő rendszerben már nincs jelentősége.&lt;br /&gt;
-- [[TuriAndras|leves]] - 2008.01.15.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3. feladat &amp;lt;br&amp;gt;==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Milyen képfeldolgozási műveletet végeztünk?&amp;#039;&amp;#039;&amp;#039; &amp;lt;br&amp;gt;&lt;br /&gt;
Eredeti kép részlete: &amp;lt;br&amp;gt;&lt;br /&gt;
(a sötét képen fehér pixelek voltak &amp;quot;elszórva&amp;quot;) &amp;lt;br&amp;gt;&lt;br /&gt;
Feldolgozott kép részlete: &amp;lt;br&amp;gt;&lt;br /&gt;
(a fehér pixelek eltűntek a képről) &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adott egy kép salt and pepper típusú zajjal, majd a másodikon már nincs ilyen zaj =&amp;gt; rank v median szűrés&amp;#039;&amp;#039;&amp;#039; &amp;lt;br&amp;gt;&lt;br /&gt;
Írja le a művelet lényegét! (5 pont)&lt;br /&gt;
&lt;br /&gt;
==4. feladat &amp;lt;br&amp;gt;==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Milyen képfeldolgozási műveletet végeztünk?&amp;#039;&amp;#039;&amp;#039; &amp;lt;br&amp;gt;&lt;br /&gt;
[https://wiki.sch.bme.hu/pub/Infoalap/SzgGrafVizsga20070116/taurus1_FS2.PNG Adva volt ez a kép és a &amp;quot;párja&amp;quot;]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;(Adott egy szürkeárnyalatos kép, a második fekete-fehér, láthatóan ditheringes de nem mátrixos. =&amp;gt; 1 bitre redukálunk, dithering, mintha még FS-hibapropagáció is lett volna, de ez nem biztos)&amp;#039;&amp;#039;&amp;#039; &amp;lt;br&amp;gt;&lt;br /&gt;
Írja le a művelet lényegét! (5 pont)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- [[KocsisIstvan|Sirály]] - 2008.01.03.&lt;br /&gt;
-- [[KovacsZoltan]] - 2008.01.03.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Infoalap]]&lt;/div&gt;</summary>
		<author><name>Unknown user</name></author>
	</entry>
</feed>