Számítógépes grafika és képfeldolgozás vizsga, 2009. január 14.

A VIK Wikiből
A lap korábbi változatát látod, amilyen (vitalap) 2012. október 21., 20:16-kor történt szerkesztése után volt. (Új oldal, tartalma: „{{GlobalTemplate|Infoalap|SzgGrafVizsga20090114}} <noautolink> 60 perc játékidő, 16 ponttól van meg. ==1. feladat== '''Írjon C függvényt, amely a sík egy im…”)
(eltér) ← Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)
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


<noautolink>

60 perc játékidő, 16 ponttól van meg.

1. feladat

Írjon C függvényt, amely a sík egy implicit egyenletével adott egyenesének, és két végponttal adott szakasz metszéspontját kiszámítja - 6p

Megoldás vázlata: implicit egyenlet [math]ax+by+c = 0[/math] . Szakasz egyenlete [math]x(t) = x1*t + x2 *(1-t)[/math] és [math]y(t) = y1*t + y2 *(1-t)[/math]. Be kell helyettesiteni [math]x(t)[/math] és [math]y(t)[/math] -t az implicit egyenletbe és t-re megoldani. Ha ekkor [math]0 \leq t \leq 1[/math] akkor ebből visszahelyettesítés után megvan a metszéspont. (mivel szakasz ezért van t-re a kikötés)

A C függény:

int Metszet (float A, float B, float C, Pont P, Pont Q,  Pont& M)
{
	if (P.x == Q.x && P.y == Q.y)  // Ha a két pont ugyanaz
	{return -1;}

	if (A*(P.y-Q.y) - B*(P.x-Q.x) == 0) // Ha a szakasz párhuzamos az egyenessel
	{return -1;}

	float t = -1*(A*Q.x+B*Q.y+C)/(A*(P.x-Q.x)+B*(P.y-Q.y)); // t meghatározása

	if (0 <= t && t <= 1) // Ha a pont a szakaszon belül van
	{
		M.x = Q.x + t*(P.x-Q.x);
		M.y = Q.y + t*(P.y-Q.y);
		return 1;
	}
	else
	{return -1;}
}

Kérdés: Jól használtam a referenciát ugye?

Egy kis módosítás: A C függvényben A,B,C típusa int->float! Elnézést a hanyagságomért. Javítsd a PDFben is kérlek!

-- Dave - 2009.01.18.


Egy kicsit részletesebben:

Implicit egyenlet: Ax + By + C = 0. A szakasz 2 végpontja: P és Q.

Ha P = Q, akkor csak 1 pont van, nem adunk vissza semmit. Ha A*(P.y-Q.y) - B*(P.x-Q.x) = 0 , azaz az egyenes és a szakasz párhuzamos: nincs metszéspont.

Egyébként: x(t) = P.x*t + Q.x*(1-t) = t*(P.x-Q.x) + Q.x, valamit y(t) = P.y*t + Q.y*(1-t) = t*(P.y-Q.y) + Q.y

Behelyettesítve az implicit egyenletbe: A*(t*(P.x-Q.x) + Q.x) + B*(t*(P.y-Q.y) + Q.y) + C = 0

Kifejezve t-re: t = -1*(A*Q.x+B*Q.y+C) / (A*(P.x-Q.x)+B*(P.y-Q.y))

Ha 0<=t<=1 akkor visszadjuk a metszéspontot.

2. feladat

Kd-fa. A fa szerkezet, jellemzése (3p) A fa felépítésének algorimusa pszeudokóddal (3p) A fa bejárása, ha egy sugár által metszett cellákat szeretnénk meglátogatni a sugár kezdőpontjának mért távolság sorrendjében (ebben nem vagyok biztos hogy ez volt a kiirás) (kezdőcella 2p, következő cella 3p)

Megoldás vázlata: sünis könyv xyz oldal.

Vagy: I15E.pdf (89oldalas) 54-57.oldal.

Dave - 2009.01.17.

3. feladat

Mit csinál a csúcspont árnyaló (vertex shader) a következő programkód hatására. Adjon C++ vagy Cg nyelvű függvényekkel választ. Pár Cg típus... (homalyos a foto, lehetnek hibak)

static float kd[4] = [kdr, kdg, kdb, kda], float ks[4] = [ksr, ksg, ksb, ksa]

glMaterialfv(GL_FRONT, GL_DIFFUSE, kd);
glMaterialfv(GL_FRONT, GL_SPECULARR, ks);
glMaterialfv(GL_FRONT, GL_SHININESS, n);

static float I[4] = [Ir, Ig, Ib, Ia];
glLightfv( GL_LIGHT0, GL_AMBIENT, I);
glLightfv( GL_LIGHT0, GL_SPECULAR, I);
glLightfv( GL_LIGHT0, GL_DIFFUSE, I);

glEnable( GL_LIGHT0);
glEnable( GL_LIGHTING);

glEnable( GL_TEXTURE_2ID);
glDisable( GL_NORMALIZE);
glEnable( GL_DEPTH_TEST);

glViewport( 0, 0, windowwidth, windowheight);
glMatrixMode( GL_PROJECTION);
glLoadIdentity();
glMatrixMode( GL_MODELVIEW);
glLoadIdentity();

static float lightpos[4] = [lpx, lpy, lpz, 0]; // igen az utolso koordinata valoban 0
glLightfv(GL_LIGHT0, GL_POISTION, lightpos);
gluLookAt(0,0,1, 0,0,0 0,1,0)

glNormal3f(nx,ny,nz)
glBegin(GL_POINTS);
glTexCoord2f(u, v);
glVertex3f(x0, y0, z0);
glEnd();

Sorok taglalása a szokásos -10p. A tökéletes megvalósítás 15p


Megoldás: A világosság valahol itt van. bmeopengl.ppt 32. dia vagy gpucg.ppt 12. dia legalább is ehhez hasonló.

A Megoldás CG nyelven:

void main(
		// Input - A shader megkapja az adott pontra vonatkozó paramétereket
		in float4 position : POSITION,
		in float4 normal	: NORMAL,
		in float2 texcoord : TEXCOORD0,

		// Uniform - Ezek a paraméterek állandóak, inicializáláskor adtuk meg, minden pontra ugyanazok
		uniform float4x4 MVP, M, MIT,
		uniform float4 lightpos, La, Ld, Ls,
		uniform float4 ka, kd, ks,
		uniform float shininess,

		// Output - A shader elvegzi a műveleteket, majd ezeket adja vissza
		out float4 oPosition  : POSITION,
		out float2 otexcoord  : TEXCOORD0,
		out float4 ocolor	  : COLOR0
			 )
{
	otexcoord = texcoord;
	oPosition = mul(MVP, position);
	float3 V = normalize( mul(M, position).xyz );	
	float3 N = normalize( mul(MIT, normal).xyz );
	float3 L = normalize( mul(M, lightpos).xyz );
	float3 H = normalize( V+L );	 
	ocolor = La*ka + Ld*kd*saturate(dot(L,N)) + Ls*ks*pow(saturate(dot(N,H)), shininess);
}

Egy kicsit rövidítettem és kommenteltem a cuccot, lightpos, La, Ld, Ls, ka, kd, ks, shininess is uniform.

- Dave - 2009.01.20.

Nem kellene még paraméternek egy uniform float4 eyePosition ? Mert szerintem a V-t is ebből kellene inkább kiszámolni

V = normalize(eyePosition.xyz - mul(M,position).xyz)

-- Tommy21 - 2009.05.24.

4. feladat

Foglalja össze az élkeresés, élkiemelés/képélesítés algoritmusait, azok alkalmazási lehetőségeit, és tulajdonságait! 8p