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

(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

vx1=200   vy1=200   vx2=400   vy2=300
wx1=100   wy1=100   wx2=500   wy2=500

vwidth=vx2vx1=400200=200   vheight=vy2vy1=300200=100
wwidth=wx2wx1=500100=400   wheight=wy2wy1=500100=400

Egy pontra:

X=(xwx1)vwidthwwidth+vx1=xvwidthwwidthwx1vwidthwwidth+vx1

Y=(ywy1)vheightwheight+vy1=yvheightwheightwy1vheightwheight+vy1

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