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

A VIK Wikiből
(SzgGrafZH20071029C2 szócikkből átirányítva)

Ez az oldal a korábbi SCH wikiről lett áthozva.

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

     
     

 
 

Egy pontra:

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

Értelmezés sikertelen (ismeretlen „\begin{displaymath}” függvény): {\displaystyle \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}}

Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle \begin{displaymath} = \left[\begin{array}{rrr} 0.5 & 0 & 0 \\ 0 & 0.25 & 0 \\ 150 & 175 & 1 \end{array}\right] \end{displaymath}}

-- DeVi - 2007.11.07.


-- palacsint - 2007.10.29.