Mintakérdések a Számítógépes grafika és képfeldolgozás tárgy vizsgájára való felkészüléshez (1.rész)

A VIK Wikiből
Ugrás a navigációhoz Ugrás a kereséshez

Ez az oldal a korábbi SCH wiki-ről lett áthozva. Az eredeti változata itt érhető el.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor kérlek javíts rajta egy rövid szerkesztéssel.

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót



Tovább: SzgGrafKerdesKidolg2, SzgGrafKerdesKidolg3, SzgGrafKerdesKidolg4, SzgGrafKerdesKidolg5

A lent található feladatokat és megoldásokat áttöltöttem az egységesített SzgGrafFeladatok oldalra, ami az előadó honlapján található grafkerdes.doc fájl alapján készült, annak számozásaival van összhangban. Ennek a wiki oldalnak a szerkesztése helyett kérlek szerkeszd az új SzgGrafFeladatok oldalt! -- Subi - 2007.10.29.

1.

 Mik azok az összetett görbék és miért van rájuk szükség.

2.

 Hogyan definiálható a B-spline és milyen tulajdonságai vannak.

Sünis Könyv 58.

A B-spline olyan görbeleírás, amely a lokális vezérelhetőség és a símaság (deriválhatóság) között ad kompromisszumot. Approximációs görbe, tehát a vezérlőpontokon jellemzően nem halad át. (Az első és az utolsó vezérlőponton sem) Általános esetben a szomszédos csomópontok távolságára nincs megkötés.

A görbe bázisfüggvényeit úgy származtatjuk, hogy kiindulunk olyan bázisfüggvényekből, amelyek a hozzájuk tartozó csomópontintervallumon Bi=1 értéket vesznek fel, egyébként pedig nullát. Ezután a B-spline fokszámának megfelelő számszor lineáris simítást végzünk.

Ha egy B-spline fokszáma n. akkor egy vezérlőpont a görbe n+1 szegmensére van hatással, tehát a fokszám növelésével a lokális vezérelhetőség csökken.


3.

 Mi a NURBS.

Non-Uniform Rational B-Spline, a B-Spline egy kezelhetőbb változata. A vezérlőpontokhoz még egy w súlyt is rendelünk, ennek növelésével a görbe az adott pontban egyre jobban csúcsosodik. Előnye, hogy a kúpszeletek tökéletesen leírhatók legalább harmadfokú NURBS-ökkel, hátránya hogy (hacsak homogén koordinátákban nem számolunk), osztásokra is szükség van a görbe kirajzolásához.

A görbe egy pontjának meghatározása: [math] r(t) = {{\sum w_iB_i^{NUBS} r_i}\over{\sum w_jB_j^{NUBS}}} = B_i^{NURBS} r_i [/math]

A bázisfüggvények kiszámítása a NUBS bázisfüggvényeiből tehát: [math] B_i^{NURBS} = {{w_i B_i^{NUBS}}\over{\sum w_jB_j^{NUBS}}} [/math]

4.

Adja meg a kvadratikus felületek általános definícióját. Milyen konkrét tagjai vannak ennek a családnak.

Kvadratikus felületnek nevezzük azokat a felületeket, melyek legfeljebb másodfokú implicit egyenlettel leírhatók. Általános, homogén koordinátás alakban megadva:

[math] [x, y, z, 1] Q \left[ \begin{array}{r} x \\ y \\ z \\ 1 \end{array} \right] = 0 [/math]

Ahol Q egy 4x4-es mátrix. Kvadratikus felülettel leírható például a kúp, ellipszoid, hengerpalást, paraboloid.

5.

 Rajzolja fel a szárnyas él adatstruktúrát, és írjon programot, amely egy lapnak kiírja az összes csúcsát.

Sünis könyv 140.o.
Adatszerkezet:

class Edge {
  Vertex * vertex_start, vertex_end; //Az él kezdő- és végpontja
  Face * face_left, face_right;		//Az él jobb- és baloldali lapja
  Edge * loop_left, loop_right;		//A végpontból kiinduló két él
  Edge * next;							  //Az éllista következő eleme
}

struct Vertex {
  Vector point;
  Edge * edge;  //A csúcsot tartalmazó él
}

struct Face {
  Edge * edge;
  Face * next;
}

Program (vázlatosan):

void printVertex(Vertex * v) {
  cout << v.x << "," << v.y << "," v.z;
}

void printVertices(Face * face) {
  Edge * edge = face.edge;
  Edge * current = NULL;
  
  bool goRight = (edge.face_right == face) ? true : false;

  print(edge.vertex_end);

  while( edge != current ) {
	 if( goRight ) {
		current = edge.loop_right;
	 } else {
		current = edge.loop_left;
	 }

	 print(current.vertex_end);
  }
}

6.

Mik az Euler operátorok és miért van rájuk szükség.

Sünis könyv 75.o.

Euler egyenlet: lapok + csúcsok = élek + 2

Az Euler operátorokat poligonhálóra alkalmazva az Euler tulajdonság nem sérül.

Típusai: A, Él kettévágás Egy él egy pontján felveszünk egy új csúcsot, ami ezáltal két élre bomlik. A csúcsok száma eggyel, az élek száma szintén eggyel növekszik.

B, Poligon kettévágás Egy lap két csúcsát egy új éllel kötünk össze, ezáltal a lap két lapra esik szét. Az éleg és a lapok száma egyaránt eggyel növekszik.

C, Élzsugorítás Egy élet egy pontba zsugorítunk. Az él eltűnik, a két végpontját egyesítjük. Az élek száma eggyel csökkel, a csúcsok száma eggyel csökken. Ha az élhez kapcsolódó egyik vagy minkét poligon egy háromszög, akkor az eltűnik, a a másik két éle pedig egyesül.

D, Poligon kihúzás Kiválasztunk egy lapot, és az elmozdítjuk az eredeti helyről, ehhez a kiválasztott lap éleit és csúcsait meg kell duplázni. Ha *e* éle van a kiválaszott lapnak, akkor *e* új él jön létre, és *e* új pont. Ezután az új pontokat össze kell kötni a nekik megfelelő régi pontokkal. (még *e* új él és *e* új lap.)


7.

Írjon C++ nyelven egy CSG fát megvalósító osztályt.

8.

 Írjon erősen emelkedő szakaszt rajzoló programot, a Bresenham algoritmus alapján.

9.

Írjon erősen emelkedő szakaszt rajzoló programot, a DDA algoritmus alapján.

2008-as házi feladat keretben implementált DDA szakaszrajzoló algoritmus:

Ezen a helyen volt linkelve a(z) DDA.cpp nevű fájl ("DDA.cpp" link szöveggel) a régi wiki http://wiki-old.sch.bme.hu/bin/view/Infoalap/SzgGrafKerdesKidolg oldaláról. (Ha szükséged lenne a fájlra, akkor a pontos oldalmegnevezéssel együtt küldd el a wiki@sch.bme.hu címre a kérésedet)


Erősen emelkedő szakaszokra kicsit furán viselkedik :)
-- Bandita - 2009.01.02.
A hiba a rajzoló for ciklusban van, a ciklusváltozó minden esetben iMX-ig megy, pedig erősen emelkedőnél iMY-ig kellene. Az iMX-et iLength-re cserélve tökéletesen működik. Aki tudja, a forrásban is javíthatja.
-- LG - 2009.01.20.

10.

 Írjon programot, amely egy szakaszt egy konvex sokszögre vág.

-- Geri - 2006.12.29. -- Peti - 2006.08.02. -- Sales - 2006.07.27.