PótZH 2006. 12. 07., B csoport, első turnus

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|SzgGrafPZH20061207B1}} 18:15-18:45 '''Adott egy szakasz két végponttal a modell-koordinátarendszerben: (1,1,-3) és (1,1,3). Van egy tra…”)
(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


18:15-18:45

Adott egy szakasz két végponttal a modell-koordinátarendszerben: (1,1,-3) és (1,1,3). Van egy transzformációs mátrixunk, ami modellből visz világkoordinátába:

[math] T_m = \left[\begin{array}{rrrr} 3 & 0 & 0 & 0 \\ 0 & 3 & 0 & 0 \\ 0 & 0 & 3 & 0 \\ 0 & 0 & 0 & 3 \\ \end{array} \right] [/math]


És van egy másik transzformációs mátrixunk, ami világkoordinátákból visz normalizált eszközkoordinátákba:

[math] T_{proj} = \left[\begin{array}{rrrr} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & -1 \\ 0 & 0 & 2 & 0 \\ \end{array} \right] [/math]

Mely pixeleket színezi ki a DDA szakaszrajzoló algoritmus, ha a viewport felbontása 6x6?

-- Mezzanine - 2006.12.07.

Megoldás:

A két mátrixot össze kell szorozni, majd a homogén koordinátás pontokkal balról meg kell szorozni.

[math] \left[ \begin{array}{rrrr} 3 & 0 & 0 & 0 \\ 0 & 3 & 0 & 0 \\ 0 & 0 & 3 & 0 \\ 0 & 0 & 0 & 3 \\ \end{array} \right] * \left[ \begin{array}{rrrr} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & -1 \\ 0 & 0 & 2 & 0 \\ \end{array} \right] = \left[ \begin{array}{rrrr} 3 & 0 & 0 & 0 \\ 0 & 3 & 0 & 0 \\ 0 & 0 & 3 & -3 \\ 0 & 0 & 6 & 0 \\ \end{array} \right] [/math]

Ezzel a konkatenált mátrixszal szorozzuk meg balról az egyes pontokkal. A pontokat előtte természetesen homogén koordinátára alakítjuk, azaz mögé csapunk egy 1-est. A transzformációk után a pontok:

[math] p_1= \left[ \begin{array}{rrrr} 3 & 3 & -3 & 9 \\ \end{array} \right] [/math] javította: adamo
[math] p_2= \left[ \begin{array}{rrrr} 3 & 3 & 15 & -9 \\ \end{array} \right] [/math]

A vágást a homogén koordinátarendszerben kell elvégezni, hiszen látszik, hogy átfordulás lesz (a negyedik koordináta a kettő pont között 9-ről -9-re vált, tehát a 0-t érinti!). Írjuk fel a vágósíkokat, illetve hogy azok szerint az egyes pontok a sík jó oldalán vannak, avagy sem.


Vágósíkok [x,y,z,h]=[3,3,-3,9] [x,y,z,h]=[3,3,15,-9]
[math] x \leq h [/math] bent kint
[math] x \geq -h [/math] bent kint
[math] y \leq h [/math] bent kint
[math] y \geq -h [/math] bent kint
[math] z \leq h [/math] bent kint
[math] z \geq -h [/math] bent bent

Jól látszik, hogy [math]p_1 = [3,3,-3,9][/math] belső pont, hiszen minden vágósík szerint belülre esik. Ezután azon sorokra, ahol valamely pont kiesik a síkból, el kell végeznünk a megfelelő síkra történő vágást. Írjuk fel a szakasz egyenletét a koordinátákra külön-külön:

[math] x = 3t + 3(1-t) [/math]
[math] y = 3t + 3(1-t) [/math]
[math] z = -3t + 15(1-t) [/math]
[math] h = 9t - 9(1-t) [/math]

Most nézzük meg, hogy az egyes vágósíkokkal való metszetüknél [math] t [/math] milyen értéket vesz fel!

[math] x=h \Longrightarrow 3t+3(1-t)=9t-9(1-t) \Longrightarrow t=\frac{2}{3} [/math]
[math] x=-h \Longrightarrow 3t+3(1-t)=-9t+9(1-t) \Longrightarrow t=\frac{1}{3} [/math]
[math] y=h \Longrightarrow 3t+3(1-t)=9t-9(1-t) \Longrightarrow t=\frac{2}{3} [/math]
[math] y=-h \Longrightarrow 3t+3(1-t)=-9t+9(1-t) \Longrightarrow t=\frac{1}{3} [/math]
[math] z=h \Longrightarrow -3t+15(1-t)=9t-9(1-t) \Longrightarrow t=\frac{2}{3} [/math]

A fentiekből tehát kiderül, hogy a szakaszunk két helyen is metszi a vágósíkokat. Igen ám, de honnan tudjuk, hogy melyik metszéspont az, amelyik minket érdekel? Tudjuk, hogy a [math]p_1[/math] a belső pont. Ha a szakasz egyenletébe behelyettesítjük a [math]t=\frac{1}{3}[/math] értéket, akkor azt kapjuk, hogy a levágott [math]p_2'[/math] pont koordinátái: [math][x,y,z,h]=[3,3,-9,-3][/math]. Ugyanezt [math]t=\frac{2}{3}[/math]-ra kiszámolva kapjuk, hogy [math]p_2''=[3,3,3,3][/math].

Megjegyzés: Szerintem egy apró számítási hiba miatt [math]p_2'[/math] pont koordinátái: [math][x,y,z,h]=[3,3,9,-3][/math]. -- Bandita - 2008.06.03.

Képzeljünk el egy kockát, amelyben van egy [math]p_1[/math] belső pontunk és egy olyan szakasz indul ki belőle, amely két helyen is metsz (nyilván két különböző) síkot. Hogyan lehetséges ez? Úgy, hogy igazából nem egy kockára vágunk, hanem a kockát határoló síkokra! Nyilván az lesz a számunkra érdekes metszéspont, amely a belső ponthoz közelebb esik (a másik metszéspont ugyanis már a kockán kívül, annak egyik lapja által kijelölt síkkal való metszést jelenti!). Meg kell határoznunk tehát [math](d(p_1,p_2')[/math] és [math]d(p_1,p_2''))[/math] távolságot, és az a pont lesz a jó nekünk, amelyre ez a távolságmérték kisebb. Emlékeztető: vektorok távolságát úgy számítjuk, hogy a koordinátánkénti különbségek négyzetét összegezzük, majd az egész összegnek a gyökét vesszük.

[math]d(p_1,p_2')=\sqrt{(3-3)^2+(3-3)^2+(-3-(-9))^2+(9-(-3))^2}=[/math] [math]\sqrt{36+144}=13.41[/math]
[math]d(p_1,p_2'')=\sqrt{(3-3)^2+(3-3)^2+(-3-3)^2+(9-3)^2}=\sqrt{36+36}=8.48[/math]

Megjegyzés: Mivel [math]p_2'[/math] pont koordinátái: [math][x,y,z,h]=[3,3,9,-3][/math], ezért [math]d(p_1,p_2')=\sqrt{(3-3)^2+(3-3)^2+(-3-9)^2+(9-(-3))^2}=[/math] [math]\sqrt{144+144}=16.97[/math]
Szerencsére ez nem befolyásolja a feladat további megoldását :) -- Bandita - 2008.06.03.

Ebből látható, hogy a [math]p_2''[/math] lesz a metszéspont, amit kerestünk, vagyis a síkokra vágott pontunk [math]p_2=[3,3,3,3][/math]-ban lesz.

Így a szakasz két végpontja a vágás, illetve homogén osztás után:

[math] p_1=[\frac{1}{3},\frac{1}{3},-\frac{1}{3}] [/math]
[math] p_2=[1,1,1] [/math]

A képernyőkoordinátarendszerben a szakaszt a következőképpen kapjuk meg:

[math] X_w = (X_d+1)\frac{V_{sx}}{2}+V_x [/math]
[math] Y_w = (Y_d+1)\frac{V_{sy}}{2}+V_y [/math]

A [math] p_1 [/math] pont a képernyőn:
[math] X_{w1} = \left(\frac{1}{3}+1\right)\cdot3=4 [/math]
[math] Y_{w1} = \left(\frac{1}{3}+1\right)\cdot3=4 [/math]

A [math] p_2 [/math] pont a képernyőn:
[math] X_{w2} = (1+1)\cdot3=6 [/math]
[math] Y_{w2} = (1+1)\cdot3=6 [/math]

Így a szakaszrajzoló algoritmus a (4,4), (5,5) és (6,6) pixeleket fogja kiszínezni. A vágósíkokkal való metszésszámításnál egyébként már látszódott, hogy a szakasz mind az x, mind az y (sőt, a z) vágósíkokat is ugyanazon [math] t=\frac{2}{3} [/math] paraméternél metszi, azaz éppen a képernyő jobb felső sarkán hagyja el a képernyőt.

-- NeoXon - 2006.12.08.

Megjegyzés: Ebben a gondolatmenetben egy apró hiba, hogy a vágósikok pontos számítása:

[math] \begin{array}{r} -1 \leq Xh/h \leq 1 \\ -1 \leq Yh/h \leq 1 \\ -1 \leq Zh/h \leq 1 \\ \end{array} [/math]

Azaz, ha h>0:

[math] \begin{array}{r} -h \leq Xh \leq h \\ -h \leq Yh \leq h \\ -h \leq Zh \leq h \\ \end{array} [/math]

ha h<0:

[math] \begin{array}{r} -h \geq Xh \geq h \\ -h \geq Yh \geq h \\ -h \geq Zh \geq h \\ \end{array} [/math]

Ebből pedig:

Vágósíkok [x,y,z,h]=[3,3,-3,9] [x,y,z,h]=[3,3,15,-9]
[math] x \leq h [/math] bent
[math] x \geq -h [/math] bent
[math] y \leq h [/math] bent
[math] y \geq -h [/math] bent
[math] z \leq h [/math] bent
[math] z \geq -h [/math] bent
[math] x \geq h [/math] bent
[math] x \leq -h [/math] bent
[math] y \geq h [/math] bent
[math] y \leq -h [/math] bent
[math] z \geq h [/math] bent
[math] z \leq -h [/math] kint

De ez nem befolyásolja a végeredményt, szerencsére :)

-- Gyenö - 2007.10.29.