Számítógépes grafika és képfeldolgozás ZH - 2007. 10. 29., második turnus, C csoport
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.