<?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=GrafikaGyakorloInkrementalisKepszintezis</id>
	<title>GrafikaGyakorloInkrementalisKepszintezis - Laptörténet</title>
	<link rel="self" type="application/atom+xml" href="https://vik.wiki/index.php?action=history&amp;feed=atom&amp;title=GrafikaGyakorloInkrementalisKepszintezis"/>
	<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=GrafikaGyakorloInkrementalisKepszintezis&amp;action=history"/>
	<updated>2026-05-17T20:02:02Z</updated>
	<subtitle>Az oldal laptörténete a wikiben</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://vik.wiki/index.php?title=GrafikaGyakorloInkrementalisKepszintezis&amp;diff=137336&amp;oldid=prev</id>
		<title>Unknown user: Új oldal, tartalma: „{{GlobalTemplate|Infoalap|GrafikaGyakorloInkrementalisKepszintezis}}  ===Mintakérdések a Számítógépes grafika és képfeldolgozás tárgy vizsgájára való felk…”</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=GrafikaGyakorloInkrementalisKepszintezis&amp;diff=137336&amp;oldid=prev"/>
		<updated>2012-10-21T19:58:49Z</updated>

		<summary type="html">&lt;p&gt;Új oldal, tartalma: „{{GlobalTemplate|Infoalap|GrafikaGyakorloInkrementalisKepszintezis}}  ===Mintakérdések a Számítógépes grafika és képfeldolgozás tárgy vizsgájára való felk…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Új lap&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{GlobalTemplate|Infoalap|GrafikaGyakorloInkrementalisKepszintezis}}&lt;br /&gt;
&lt;br /&gt;
===Mintakérdések a Számítógépes grafika és képfeldolgozás tárgy vizsgájára való felkészüléshez ===&lt;br /&gt;
&lt;br /&gt;
====Inkrementális képszintézis====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;84. A szem a koordináta rendszer origójában van és z irányba néz, a látószög x-ben és y-ban is 90 fokos, az első vágósík 0.1-en, a hátsó 2-n van. Adja meg azt a transzformációs mátrixot, amely a látható tartományt a  [-1,-1,0], [1,1,1] sarokpontokkal definiált téglatestbe viszi át. Miért kell vágni a transzformáció végrehajtása előtt a z=0.1 síkra?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Mivel nem volt megadva, feltételeztem, hogy (az OpenGL-lel ellentétben) a transzformáció előtt és után is jobbsodrású koordinátarendszerben vagyunk, a szem a pozitív z irányba néz, és a tartomány &amp;quot;állása&amp;quot; nem változik (vagyis pl. az elülső vágósík transzformálódik a z=0 síkba és a hátsó a z=1-be, stb.).&lt;br /&gt;
* A projektív transzformációk lényeges jellemzője, hogy melyik síkot viszik az ideális síkba. Minden transzformáció előállítható úgy, hogy először elvégzünk egy (nemnulla determinánsú, de azon kívül tetszőleges) projekciót, ami az ideális síkot a helyére rakja, majd ezután már csak affin transzformációkat végzünk.&lt;br /&gt;
* Itt tudjuk, hogy a szem, amit az ideális síkra akarunk elvinni, az origóban van. Valamint, az első és hátsó vágósíkok párhuzamosak maradnak, ezért a metszetük, a z=0, h=0 ideális egyenes is ideális marad. A sík, ami az &amp;quot;idealizálni&amp;quot; kívánt pontot és egyenest is tartalmazza, a z=0 sík, ezt visszük az ideális síkba. &amp;lt;math&amp;gt; \left[\begin{array}{cccc} 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; 0 &amp;amp; 1 \\ 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 \end{array}\right] &amp;lt;/math&amp;gt; (x-et és y-t békén hagyjuk, z-t és h-t pedig kicseréljük, így lesz a z=0 síkból a h=0 ideális sík.)&lt;br /&gt;
* Ez a látható tartományt átviszi a (-1, -1, 10), (1, 1, 0.5) sarkú téglatestbe. Ezután csak z-t kell korrigálni, hogy a (10, 0.5) tartományból a (0, 1)-be menjen, erre megfelelő z&amp;#039;=z*(-1/9.5)+h*(10/9.5) (mivel most &amp;quot;rendes&amp;quot; pontokkal dolgozunk, és h=1-et használunk). Ezt az előző transzformáció után fűzve: &amp;lt;math&amp;gt; \left[\begin{array}{cccc} 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; 10/9.5 &amp;amp; 1 \\ 0 &amp;amp; 0 &amp;amp; -1/9.5 &amp;amp; 0 \end{array}\right] &amp;lt;/math&amp;gt;&lt;br /&gt;
* Azért kell vágni, mert a hátsó vágósík mögött lévő pontok furcsán viselkednek a transzformáció során. A negatív z-jű pontok átkerülnének a pozitív oldalra, és így &amp;quot;szem mögötti&amp;quot; dolgokat is kirajzolhatnánk, a z=0 pontok a végtelenbe kerülnének, a z=0 és hátsó vágósík közti pontok pedig nagy negatív z koordinátát kapnának.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;85. Írja fel a festőalgoritmus pszeudokódját.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Az algoritmus az egyik legprimitívebb megoldás arra, hogy egymást takaró objektumokat rajzoljunk ki. Egyszerűen sorbarendezi az objektumokat a képernyőtől való távolság szerint, és a legtávolabbitól kezdve rajzolja ki, így takarásnál a közelebbi felülírja a távolabbit. Már 3 téglalap esetén is van olyan elhelyezkedés, amit nem tud jól kirajzolni.&lt;br /&gt;
* A pszeudokódja nagyon egyszerű: az objektumokat rendezetten beszúrja egy listába, majd rajzoláskor a lista elemeit sorban rajzolja ki.&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Painter%27s_algorithm Wikipédia: festőalgoritmus]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;86. Írja fel a Warnock algoritmus pszeudokódját.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Az algoritmus szintén egymást takaró objektumok kirajzolására van. Lényege, hogy két esetben nagyon egyszerű a rajzolást elvégezni: ha csak egy objektumunk van (ekkor kirajzoljuk és kész), illetve ha csak egy pixelnyi területre rajzolunk (ekkor egyértelmű, milyen sorrendben vannak az objektumok). Ha egyik sem teljesül, akkor a rajzolandó területet felbonthatjuk részekre, mindegyik rész-területről eldöntjük, mely objektumok tartoznak bele, és rekurzívan kirajzoljuk a részeket. Ha egy rész-területbe csak egy objektum (darabja) esik, akkor rajzolunk, ha nem, tovább bontunk, egészen addig, amíg az 1x1 pixelt el nem érjük. Felbontani általában 2x2 negyed-tégalapra szokás.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
WarnockDraw(Rectangle area, Array objects) {&lt;br /&gt;
  if (area is 1x1)&lt;br /&gt;
	 objects.sortByDepthAtPixel(area.x, area.y);&lt;br /&gt;
	 objects[0].draw();&lt;br /&gt;
  else if (objects.size==1)&lt;br /&gt;
	 objects[0].draw();&lt;br /&gt;
  else&lt;br /&gt;
	 WarnockDraw(area.upperLeftQuarter(), objects.selectVisible(area.upperLeftQuarter()));&lt;br /&gt;
	 WarnockDraw(area.lowerLeftQuarter(), objects.selectVisible(area.lowerLeftQuarter()));&lt;br /&gt;
	 WarnockDraw(area.upperRightQuarter(), objects.selectVisible(area.upperRightQuarter()));&lt;br /&gt;
	 WarnockDraw(area.lowerRightQuarter(), objects.selectVisible(area.lowerRightQuarter()));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Warnock_algorithm Wikipédia: Warnock algoritmus]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;87. Írjon 3D háromszög megjelenítőt, amely a képernyőkoordináta rendszerbe transzformált csúcspontokat kapja meg, és a takaráshoz z-buffer algoritmust használ. A háromszöget konstans színnel kell kitölteni. Feltételezheti, hogy a vektor műveletek rendelkezésre állnak és azt is, hogy a háromszög vetületében a koordináták az alábbi relációban állnak.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{InLineImageLink|Infoalap|GrafikaGyakorloInkrementalisKepszintezis|Clipboard02.png}}&lt;br /&gt;
&lt;br /&gt;
* A z-buffer egy globális float zBuffer[][] tömb, a kisebb z értékű objektum van előrébb, a képernyőt a Color pixel[][] tömbbel lehet írni. Az elején kiszámítjuk (zInc), mennyivel kell az x növelésekor a z-t növelni (levezetést lásd az OpenGL, Cg rész 98. feladatánál), majd végigfutunk először az alsó majd a felső felén a háromszögnek.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void triangle(Vector v1, Vector v2, Vector v3, Color c) {&lt;br /&gt;
  int x=v1.x, y=v1.y;&lt;br /&gt;
  float z, zInc=(v1.z*(v2.y-v3.y)+v2.z*(v3.y-v1.y)+v3.z*(v1.y-v2.y));&lt;br /&gt;
  zInc=zInc/(v1.x*(v2.y-v3.y)+v2.x*(v3.y-v1.y)+v3.x*(v1.y-v2.y));&lt;br /&gt;
  int xStart, xEnd;&lt;br /&gt;
  for ( ; y&amp;lt;v2.y; y++) {&lt;br /&gt;
	 xStart=v1.x+(int)((float)(v2.x-v1.x)*(float)y/(float)(v2.y-v1.y));&lt;br /&gt;
	 xEnd=v1.x+(int)((float)(v3.x-v1.x)*(float)y/(float)(v3.y-v1.y));&lt;br /&gt;
	 z=(float)v1.z+(float)(v2.z-v1.z)*(float)y/(float)(v2.y-v1.y);&lt;br /&gt;
	 for (x=xStart; x&amp;lt;=xEnd; x++) {&lt;br /&gt;
		if (z&amp;lt;zBuffer[y][x]) pixel[y][x]=c;&lt;br /&gt;
		z+=zInc;&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
  for ( ; y&amp;lt;v3.y; y++) {&lt;br /&gt;
	 xStart=v2.x+(int)((float)(v3.x-v2.x)*(float)y/(float)(v3.y-v2.y));&lt;br /&gt;
	 xEnd=v1.x+(int)((float)(v3.x-v1.x)*(float)y/(float)(v3.y-v1.y));&lt;br /&gt;
	 z=(float)v2.z+(float)(v3.z-v2.z)*(float)y/(float)(v3.y-v2.y);&lt;br /&gt;
	 for (x=xStart; x&amp;lt;=xEnd; x++) {&lt;br /&gt;
		if (z&amp;lt;zBuffer[y][x]) pixel[y][x]=c;&lt;br /&gt;
		z+=zInc;&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;88. Phong árnyalás. Adja meg, hogy az egyes vektorok milyen koordinátarendszerben értendők.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;89. Phong árnyalással jelenít meg egy háromszöget, amelynek csúcspontjai világ-koordinátarendszerben (6, 4, 0),(10, 4, 0),(6, 6, 0). A háromszög csúcsaihoz rendre a következő normálvektorokat rendeltük (1,0,0),(0,1,0),(0,0,1). A háromszög diffúz, a visszaverési együttható (1, 0.5, 0.5). Egyetlen irányfényforrás van, amely a (11, 5, 4) irányból világít (R=3,G=1,B=2) intenzitással. A szem a (5, 6, 7) pontban van. Milyen színű lesz RGB színrendszerben a háromszög (8,5,0) pontja (az eredményt egy értékes jegy pontossággal kérjük)?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Phong árnyalásnál a normál-, megvilágítási, és nézeti vektort is lineárisan interpoláljuk (és az interpolált vektorokat persze normálni kell). Itt irányfényforrásunk van, tehát a megvilágítási vektor mindenhol ugyanaz, nem kell interpolálni, a felület pedig diffúz, tehát a BRDF-je nem függ a nézeti iránytól, a nézeti vektort sem kell interpolálni.&lt;br /&gt;
* Először előállítjuk a (8, 5, 0) pontot a csúcsok lineáris kombinációjaként, úgy, hogy az együtthatók összege 1 legyen. (8, 5, 0)=0*(6, 4, 0)+0.5*(10, 4, 0)+0.5*(6, 6, 0). Ugyanezekkel az együtthatókkal kell a normálvektorokat is kombinálni: 0*(1, 0, 0)+0.5*(0, 1, 0)+0.5*(0, 0, 1)=(0, 0.5, 0.5), ezt normálva: &amp;lt;math&amp;gt; (0, \frac{1}{\sqrt{2}}, \frac{1}{\sqrt{2}}) &amp;lt;/math&amp;gt;&lt;br /&gt;
* A megvilágítási vektort normálva: &amp;lt;math&amp;gt; (\frac{11}{\sqrt{162}}, \frac{5}{\sqrt{162}}, \frac{4}{\sqrt{162}}) &amp;lt;/math&amp;gt;, majd skalárisan szorozva a normállal: &amp;lt;math&amp;gt; \frac{9}{\sqrt{324}}=0.5=\cos\theta &amp;lt;/math&amp;gt; A Lambert-törvény alapján a kimenő sugársűrűség: &amp;lt;math&amp;gt; L_{ki}=L_{be}k_d\cos\theta &amp;lt;/math&amp;gt;, ahol &amp;lt;math&amp;gt; k_d &amp;lt;/math&amp;gt; a visszaverési együttható osztva &amp;lt;math&amp;gt; \pi &amp;lt;/math&amp;gt;-vel. Ezt kiszámolva mindegyik komponensre, a pixel színe: &amp;lt;math&amp;gt; (\frac{1.5}{\pi}, \frac{0.25}{\pi}, \frac{0.5}{\pi}) \approx (0.5, 0.08, 0.16) &amp;lt;/math&amp;gt;&lt;br /&gt;
* [http://www.cs.cmu.edu/afs/cs/academic/class/16823-f06/appearance-modeling-5.ppt Diffúz felület BRDF-je]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;90. Gouraud árnyalás. Milyen hardvertámogatás építhető hozzá?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* A Gouraud árnyalás a háromszögek csúcsaiban határozza meg a normálvektorok alapján a színt, majd a belső pontok színét ezek interpolációjával számítja (ellentétben a Phong árnyalással, ami a normálvektorokat interpolálja, és minden pixelt a normálvektor ismeretében külön árnyal). Egy háromszög pixeleinek színe emiatt lineárisan fogg függeni, az eredeti világkoordinátáitól, és a transzformációk utáni képernyőkoordinátáktól is. Tehát, ha a háromszög egy képernyő-sorba eső pixeleit rajzoljuk, azok színe a szomszédos pixelek közt mindig ugyanannyival változik, így ha előre kiszámítjuk ezt a növekményt, akkor a soron végiglépkedéskor mindig csak egy összeadást kell majd végrehajtanunk.&lt;br /&gt;
* Ezt egy regiszterrel és egy (lebegőpontos) összeadóval lehet megvalósítani. Az összeadó egyik bemenete az eltárolt szín-növekmény, a másik pedig egy regiszter, ami az előző szín-értéket tárolja. A kimenetét pedig ugyanebben a regiszterben tároljuk, és onnan rakjuk ki a kimenetre. Ha több komponensből áll a szín, akkor mindegyik komponensnek kell egy külön ilyen modul.&lt;br /&gt;
* A megvalósítás érdekessége, hogy mivel a színt ugyanúgy lehet soronként lineárisan számítani, mint a z-értéket vagy a textúrakoordinátákat, ezért egy ilyen hardveregység többféle műveletet is végezhet.&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Gouraud_shading Wikipédia: Gouraud árnyalás]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;91. Háromszög textúrázása inkrementális képszintézisben.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Egy háromszög csúcsainak textúrakoordinátáival tulajdonképpen egy homogén lineáris transzformációt definiálunk, ami a tér pontjait a textúra pontjaira képezi. A háromszög rajzolásakor a képernyőkoordinátákból a textúra megfelelő pixelét egy ebből kiszámítható homogén lineáris transzformációval lehet megkapni.&lt;br /&gt;
* Ez annyiból kényelmetlen, hogy elvégzéséhez lebegőpontos osztást kellene végezni (a homogén koordinátákból a végén kiszámítani a tényleges kétdimenziós textúrakoordinátákat), ezért általában az osztást kihagyják, és a törtnek, ami a koordinátákat megadná, a nevezőjét elhagyják. Ez sokkal gyorsabbá teszi a számítást, mivel alkalmazható a z-értékek számításához is használt növekményes módszer (lásd 90. feladat), viszont torzul a megjelenített kép.&lt;br /&gt;
* Textúra leképzés diasor 5.-9. dia&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Texture_mapping#Perspective_correctness Wikipédia: perspektíva a textúrázásnál]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;92. Buckaleképzés. Elv, és cél, a buckák megadásának módja, Normálvektor számítása.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* A valódi tárgyak felszíne nem teljesen sima, apró egyenetlenségek vannak rajta. Ezek nagyon kicsik a tárgy méreteihez képest, de a felszín kinézetét mégis láthatóan befolyásolják. Nem modellezhetőek pontosan geometriailag, és a pontos kirajzolásukhoz durván meg kellene növelni a leírás bonyolultságát. Ezért egy közelítést alkalmazunk: a felületet az egyszerű geometriájú közelítésével írjuk le, és tároljuk, a valódi felület melyik pontja mennyire tér el a közelítéstől. A megjelenítésnél az egyszerű geometriát rajzoljuk fel, de az árnyalásnál, a normálok számításánál figyelembe vesszük az eltéréseket.&lt;br /&gt;
* Az eltéréseket kétféleképp lehet leírni. Tárolhatjuk, hogy az egyes pontok mennyivel vannak &amp;quot;magasabban&amp;quot; illetve &amp;quot;mélyebben&amp;quot; (a felületre merőleges irányban), mint ami a geometriából következne, vagy tárolhatjuk a megjelenítéshez használt, és a geometriából számított normál különbségét.&lt;br /&gt;
* A normál számításához mindkét esetben az egyszerű felülethez rögzített koordinátarendszert használjuk. Ha &amp;lt;math&amp;gt; \underline{s}(u, v) &amp;lt;/math&amp;gt; alakban van adva, akkor az első két tengely az u és v szerinti parciális derivált (vagyis két érintővektor), a harmadik pedig az eredeti normál. Ezeket rendre &amp;lt;math&amp;gt; \underline{s}_u,\; \underline{s}_v,\; \underline{n}_s &amp;lt;/math&amp;gt;-sel jelöljük.&lt;br /&gt;
* Az első esetben legyen d(u, v) a buckák magasságát leíró térkép, &amp;lt;math&amp;gt; d_u,\; d_v &amp;lt;/math&amp;gt; ennek parciális deriváltjai. Az eredő normál: &amp;lt;math&amp;gt; \underline{n}_r=\underline{n}_s + d_u \underline{n}_s \times \underline{s}_v - d_v \underline{n}_s \times \underline{s}_u &amp;lt;/math&amp;gt;. Általában ezt még normálni kell.&lt;br /&gt;
* Szirmay könyv 243.-244. oldal&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Bump_mapping Wikipédia: buckaleképzés]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;93. Írjon egy C függvényt, amely egy 3D háromszöget az x=0 síkra vág. A függvény bemenete tehát három pont, kimenete pedig azon háromszögek tömbje és darabszáma, amelyek a kapott háromszögnek az x=0 sík feletti részét adják ki.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Array egy tömb típus, add() egy elemet ad hozzá, inside() egy pontról mondja meg, hogy az x&amp;gt;0 félsíkban van-e (1, ha igen, 0, ha nem), intersect() egy szakasz és az x=0 sík metszéspontját adja meg. A type változó utolsó 3 bitjében tároljuk el, melyik pont melyik oldalon van, majd egy switch a 8 esetet külön lekezeli (ebből csak a lényegesen különböző 4 van leírva).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int inside(Point p) {&lt;br /&gt;
  return (p.x&amp;gt;0) ? 1 : 0;&lt;br /&gt;
}&lt;br /&gt;
Point intersect(Point p1, Point p2) {&lt;br /&gt;
  return p1+(p2-p1)*(-p1.x/(p2.x-p1.x));&lt;br /&gt;
}&lt;br /&gt;
Array clip(Point *p1, Point *p2, Point *p3) {&lt;br /&gt;
  Array ret=emptyArray;&lt;br /&gt;
  Point temp;&lt;br /&gt;
  int type;&lt;br /&gt;
  type=inside(p1)+2*inside(p2)+4*inside(p3);&lt;br /&gt;
  switch (type) {&lt;br /&gt;
	 case 0:&lt;br /&gt;
		break;&lt;br /&gt;
	 case 1:&lt;br /&gt;
		add(&amp;amp;ret, p1);&lt;br /&gt;
		temp=intersection(p1, p2);  add(&amp;amp;ret, &amp;amp;temp);&lt;br /&gt;
		temp=intersection(p3, p1);  add(&amp;amp;ret, &amp;amp;temp);&lt;br /&gt;
		break;&lt;br /&gt;
	 case 2: /* lásd case 1 */&lt;br /&gt;
	 case 3:&lt;br /&gt;
		add(&amp;amp;ret, p1);&lt;br /&gt;
		add(&amp;amp;ret, p2);&lt;br /&gt;
		temp=intersection(p2, p3);  add(&amp;amp;ret, &amp;amp;temp);&lt;br /&gt;
		temp=intersection(p3, p1);  add(&amp;amp;ret, &amp;amp;temp);&lt;br /&gt;
		break;&lt;br /&gt;
	 case 4: /* lásd case 1 */&lt;br /&gt;
	 case 5: /* lásd case 3 */&lt;br /&gt;
	 case 6: /* lásd case 3 */&lt;br /&gt;
	 case 7:&lt;br /&gt;
		add(&amp;amp;ret, p1);&lt;br /&gt;
		add(&amp;amp;ret, p2);&lt;br /&gt;
		add(&amp;amp;ret, p3);&lt;br /&gt;
		break;&lt;br /&gt;
  }&lt;br /&gt;
  return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;94. Implementálja a Sutherland-Hodgman poligonvágó algoritmust 3D-ben, Descartes koordinátákban megadott háromszögekre.  A megvalósítandó C++ Vagas függvény bemenete a háromszögek száma a háromszögeket tartalmazó tömb (in), a vágási tartomány két sarka (Vector min, Vector max), kimenete (referenciaváltozó) pedig a vágott háromszögeket tartalmazó tömb (out). A tömb típus (Tomb) a következő műveletekkel kezelhető:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Add( Haromszog h ): egy új háromszög tömbhöz vétele&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;int Size( ): a tárolt háromszögek számának lekérdezése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Elem(int i): az i. háromszög lekérése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*A háromszög típus a következő műveletekkel kezelhető:*&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Vector&amp;amp; P(int i): Az i. csúcs koordinátái,&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Vector&amp;amp; T(int i): Az i. csúcshoz tartozó uv textúrakoordináták&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*A Vector-on az összeadás, skalárral szorzás műveletek már implementáltak. Ha a megoldás hasonló blokkokból áll, akkor elegendő egyetlen blokkot leírni, és szövegesen utalni arra, hogy a többiben mik lennének az eltérések. Segítség: a vágás során egy háromszögből négyszög is keletkezhet, amelyet két háromszögre kell bontani. Feltételezheti, hogy a Haromszog típus elbír 4 csúcspontot is.*&lt;br /&gt;
&lt;br /&gt;
* A Vagas függvény a tartományt határoló összes síkkal meghívja a sikraVagTombot függvényt. A sikraVagTombot minden háromszögre külön meghívja a sikraVagHaromszoget függvényt, visszatérési értékként megkapja, háromszög vagy négyszög lett-e az eredmény (utóbbi esetben szétvágja két háromszögre). A sikraVagHaromszoget végigmegy a háromszög élein, és a Sutherland-Hodgman algoritmus alapján pontokat adogat a kimeneti sokszöghöz, ehhez felhasználja az inside és intersectCoeff függvényeket. Előbbi megmondja, egy p kezdőpontó, d irányvektorú síknak a &amp;quot;jó&amp;quot; oldalán van-e egy pont, utóbbi a metszéspont számításához szükséges együtthatót számolja.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bool inside(Vector p, Vector d, Vector v) {&lt;br /&gt;
  if ((v-p)*d&amp;gt;0) return true;&lt;br /&gt;
  return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float intersectCoeff(Vector p, Vector d, Vector v1, Vector v2) {&lt;br /&gt;
  return ((v2-p)*d)/((v2-v1)*d);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool sikraVagHaromszoget(Vector p, Vector d, Haromszog in, Haromszog&amp;amp; out) {&lt;br /&gt;
  int outIndex=0;&lt;br /&gt;
  bool previousInside=inside(p, d, in.P(2)), currentInside;&lt;br /&gt;
  for (int i=0; i&amp;lt;3; i++) {&lt;br /&gt;
	 currentInside=inside(p, d, in.P(i));&lt;br /&gt;
	 if (currentInside &amp;amp;&amp;amp; previousInside) {&lt;br /&gt;
		out.P(outIndex)=in.P(i);&lt;br /&gt;
		out.T(outIndex)=in.T(i);&lt;br /&gt;
		outIndex++;&lt;br /&gt;
	 } else if (currentInside &amp;amp;&amp;amp; !previousInside) {&lt;br /&gt;
		float c=intersectCoeff(p, d, in.P((i-1+3)%3), in.P(i));&lt;br /&gt;
		out.P(outIndex)=in.P((i-1+3)%3)*c+in.P(i)*(1-c);&lt;br /&gt;
		out.T(outIndex)=in.T((i-1+3)%3)*c+in.T(i)*(1-c);&lt;br /&gt;
		outIndex++;&lt;br /&gt;
		out.P(outIndex)=in.P(i);&lt;br /&gt;
		out.T(outIndex)=in.T(i);&lt;br /&gt;
		outIndex++;&lt;br /&gt;
	 } else if (!currentInside &amp;amp;&amp;amp; previousInside) {&lt;br /&gt;
		out.P(outIndex)=in.P((i-1+3)%3)*c+in.P(i)*(1-c);&lt;br /&gt;
		out.T(outIndex)=in.T((i-1+3)%3)*c+in.T(i)*(1-c);&lt;br /&gt;
		outIndex++;&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
  if (outIndex&amp;gt;2) return true;&lt;br /&gt;
  return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void sikraVagTombot(Vector p, Vector d, Tomb in, Tomb&amp;amp; out) {&lt;br /&gt;
  Haromszog h;&lt;br /&gt;
  for (int i=0; i&amp;lt;in.Size(); i++) {&lt;br /&gt;
	 bool negyszog=sikraVagHaromszoget(p, d, in.Elem(i), &amp;amp;h);&lt;br /&gt;
	 if (negyszog) {&lt;br /&gt;
		Haromszog h1;&lt;br /&gt;
		h1.P(0)=h.P(0);&lt;br /&gt;
		h1.P(1)=h.P(1);&lt;br /&gt;
		h1.P(2)=h.P(2);&lt;br /&gt;
		h1.T(0)=h.T(0);&lt;br /&gt;
		h1.T(1)=h.T(1);&lt;br /&gt;
		h1.T(2)=h.T(2);&lt;br /&gt;
		out.Add(h1);&lt;br /&gt;
		h1.P(0)=h.P(2);&lt;br /&gt;
		h1.P(1)=h.P(3);&lt;br /&gt;
		h1.P(2)=h.P(0);&lt;br /&gt;
		h1.T(0)=h.T(2);&lt;br /&gt;
		h1.T(1)=h.T(3);&lt;br /&gt;
		h1.T(2)=h.T(0);&lt;br /&gt;
		out.Add(h1);&lt;br /&gt;
	 } else out.Add(h);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Vagas(Vector min, Vector max, Tomb in, Tomb&amp;amp; out) {&lt;br /&gt;
  Tomb temp;&lt;br /&gt;
  sikraVagTombot(min, Vector(1, 0, 0), in, &amp;amp;temp);&lt;br /&gt;
  in=temp;&lt;br /&gt;
  sikraVagTombot(min, Vector(0, 1, 0), in, &amp;amp;temp);&lt;br /&gt;
  in=temp;&lt;br /&gt;
  sikraVagTombot(min, Vector(0, 0, 1), in, &amp;amp;temp);&lt;br /&gt;
  in=temp;&lt;br /&gt;
  sikraVagTombot(max, Vector(-1, 0, 0), in, &amp;amp;temp);&lt;br /&gt;
  in=temp;&lt;br /&gt;
  sikraVagTombot(max, Vector(0, -1, 0), in, &amp;amp;temp);&lt;br /&gt;
  in=temp;&lt;br /&gt;
  sikraVagTombot(max, Vector(0, 0, -1), in, &amp;amp;temp);&lt;br /&gt;
  out=temp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- [[KisGergelyG|G]] - 2008.12.26.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Infoalap]]&lt;/div&gt;</summary>
		<author><name>Unknown user</name></author>
	</entry>
</feed>