Számítógépes grafika és képfeldolgozás ZH - 2007. 10. 29., második turnus, C csoport

A VIK Wikiből
A lap korábbi változatát látod, amilyen (vitalap) 2012. október 21., 22:18-kor történt szerkesztése után volt. (Új oldal, tartalma: „{{GlobalTemplate|Infoalap|SzgGrafZH20071029C2}} ==1. feladat (7 pont)== (Kb. mint a kiadott feladatsor 44. feladata.) '''Írjon 2D aláosztott görbe (Catmull-Clark…”)
(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


1. feladat (7 pont)

(Kb. mint a kiadott feladatsor 44. feladata.)

Írjon 2D aláosztott görbe (Catmull-Clark subdivision curve) rajzoló rutint C++ nyelven. A függvény bemeneti változói: int n a csomópontok száma, float x[], float y[] a csomópontok megfelelő koordinátáit tartalmazó tömbök, int level az aláosztás szintje (0 az aláosztatlan görbét jelenti). A görbe színe piros. A megjelenítést GL_LINE_STRIP segítségével OpenGL-lel valósítsa meg, a felhasználható függvények (glBegin, glVertex2d, glColor3d, glEnd).

Megoldás: A kódot nem próbáltam ki, lehet, hogy vannak benne hibák, de az elv szerintem jó.

// Egyszerre csak egy felosztást végez, majd rekurzívan hívja önmagát,
// nem feltétlenül így kell, de most így egyszerűbb
void subdivide(int n, float x[], float y[], int level) {
  int new_n = n;
  float new_x[] = x[];
  float new_y[] = y[];
  if(level > 0) {  // ha level==0, akkor nem kell felosztani
	 new_n = n + n-1;  // az új lista elemszáma
	 new_x[] = new float[new_n];
	 new_y[] = new float[new_n];
	 // Először minden két régi pont közé (félútra) felveszünk
	 // egy-egy új pontot
	 for(int i=0, int j=0; i<new_n-2; i+=2, j++) {
		new_x[i] = x[j]; new_y[i] = y[j];
		new_x[i+1] = x[j]*0.5 + x[j+1]*0.5;
		new_y[i+1] = y[j]*0.5 + y[j+1]*0.5;
	 }
	 // Majd minden régi pontot (kivéve a legelsőt és a legutolsót)
	 // áthelyezünk úgy, hogy az eredeti helye 1/2, a két vele szomszédos
	 // új pont helye pedig 1/4 - 1/4 aránnyal súlyozódik. 
	 for(int i=2; i<new_n-2; i+=2) {
		new_x[i] = new_x[i-1]*0.25 + new_x[i]*0.5 + new_x[i+1]*0.25;
		new_y[i] = new_y[i-1]*0.25 + new_y[i]*0.5 + new_y[i+1]*0.25; 
	 }
	 subdivide(new_n, new_x, new_y, level-1);
  }
  glColor3d(1., 0., 0.);
  glBegin(GL_LINE_STRIP);
	 for(int i=0; i<new_n; i++) {
		glVertex2d(new_x[i], new_y[i]);
	 }
  glEnd();
}

-- Fodor Bálint - 2007.12.04.

Az y változtatását még hozzáírtam -- UzsokiMate - 2007.12.04.

2. feladat (3 pont)

A kétdimenziós világban kameránk ablaka (100, 100) és (500, 500) sarokpontokkal definiált, a nézet sarokpontjai (200, 200), (400, 300). Adja meg a nézeti transzformációs mátrixot.

http://www.fsz.bme.hu/~szirmay/grafika/bme2d.ppt 7. slide

  • *w* mint world
  • *v* mint viewport

[math] v_{x1} = 200 [/math]   [math] v_{y1} = 200 [/math]   [math] v_{x2} = 400 [/math]   [math] v_{y2} = 300 [/math]
[math] w_{x1} = 100 [/math]   [math] w_{y1} = 100 [/math]   [math] w_{x2} = 500 [/math]   [math] w_{y2} = 500 [/math]

[math] v_{width} = v_{x2} - v_{x1} = 400 - 200 = 200 [/math]   [math] v_{height} = v_{y2} - v_{y1} = 300 - 200 = 100 [/math]
[math] w_{width} = w_{x2} - w_{x1} = 500 - 100 = 400 [/math]   [math] w_{height} = w_{y2} - w_{y1} = 500 - 100 = 400 [/math]

Egy pontra:

[math] X = (x-w_{x1})\cdot\frac{v_{width}}{w_{width}} + v_{x1} = x\cdot\frac{v_{width}}{w_{width}} - w_{x1}\cdot\frac{v_{width}}{w_{width}} + v_{x1} [/math]

[math] Y = (y-w_{y1})\cdot\frac{v_{height}}{w_{height}} + v_{y1} = y\cdot\frac{v_{height}}{w_{height}} - w_{y1}\cdot\frac{v_{height}}{w_{height}} + v_{y1} [/math]

Innen már felírható a mátrix:

[math]\begin{displaymath} \underline{\underline{T}}_{v} = \left[\begin{array}{rrr} \frac{v_{width}}{w_{width}} & 0 & 0 \\ 0 & \frac{v_{height}}{w_{height}} & 0 \\ v_{x1} - w_{x1}\frac{v_{width}}{w_{width}} & v_{y1} - w_{y1}\frac{v_{height}}{w_{height}} & 1 \end{array}\right] = \left[\begin{array}{rrr} \frac{200}{400} & 0 & 0 \\ 0 & \frac{100}{400} & 0 \\ 200 - 100 \cdot \frac{200}{400} & 200 - 100 \cdot \frac{100}{400} & 1 \end{array}\right] = \end{displaymath}[/math]

[math]\begin{displaymath} = \left[\begin{array}{rrr} 0.5 & 0 & 0 \\ 0 & 0.25 & 0 \\ 150 & 175 & 1 \end{array}\right] \end{displaymath}[/math]

-- DeVi - 2007.11.07.


-- palacsint - 2007.10.29.