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

A VIK Wikiből

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.


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:

Tm=[3000030000300003]


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

Tproj=[1000010000110020]

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.

[3000030000300003]*[1000010000110020]=[3000030000330060]

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:

p1=[3339] javította: adamo
p2=[33159]

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]
xh bent kint
xh bent kint
yh bent kint
yh bent kint
zh bent kint
zh bent bent

Jól látszik, hogy p1=[3,3,3,9] 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:

x=3t+3(1t)
y=3t+3(1t)
z=3t+15(1t)
h=9t9(1t)

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

x=h3t+3(1t)=9t9(1t)t=23
x=h3t+3(1t)=9t+9(1t)t=13
y=h3t+3(1t)=9t9(1t)t=23
y=h3t+3(1t)=9t+9(1t)t=13
z=h3t+15(1t)=9t9(1t)t=23

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 p1 a belső pont. Ha a szakasz egyenletébe behelyettesítjük a t=13 értéket, akkor azt kapjuk, hogy a levágott p2 pont koordinátái: [x,y,z,h]=[3,3,9,3]. Ugyanezt t=23-ra kiszámolva kapjuk, hogy p2=[3,3,3,3].

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

Képzeljünk el egy kockát, amelyben van egy p1 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 (d(p1,p2) és d(p1,p2)) 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.

d(p1,p2)=(33)2+(33)2+(3(9))2+(9(3))2= 36+144=13.41
d(p1,p2)=(33)2+(33)2+(33)2+(93)2=36+36=8.48

Megjegyzés: Mivel p2 pont koordinátái: [x,y,z,h]=[3,3,9,3], ezért d(p1,p2)=(33)2+(33)2+(39)2+(9(3))2= 144+144=16.97
Szerencsére ez nem befolyásolja a feladat további megoldását :) -- Bandita - 2008.06.03.

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

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

p1=[13,13,13]
p2=[1,1,1]

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

Xw=(Xd+1)Vsx2+Vx
Yw=(Yd+1)Vsy2+Vy

A p1 pont a képernyőn:
Xw1=(13+1)3=4
Yw1=(13+1)3=4

A p2 pont a képernyőn:
Xw2=(1+1)3=6
Yw2=(1+1)3=6

Í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 t=23 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:

1Xh/h11Yh/h11Zh/h1

Azaz, ha h>0:

hXhhhYhhhZhh

ha h<0:

hXhhhYhhhZhh

Ebből pedig:

Vágósíkok [x,y,z,h]=[3,3,-3,9] [x,y,z,h]=[3,3,15,-9]
xh bent
xh bent
yh bent
yh bent
zh bent
zh bent
xh bent
xh bent
yh bent
yh bent
zh bent
zh kint

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

-- Gyenö - 2007.10.29.