Giáo trình Đồ họa máy tính - Chương 4, Phần 1: Hiển thị đối tượng hai chiều

CHÖÔNG 4  
HIEÅN THÒ ÑOÁI TÖÔÏNG HAI CHIEÀU  
Chöông naøy seõ ñeà caäp tôùi caùc kó thuaät ñeå hieån thò caùc ñoái töôïng hai chieàu  
treân caùc thieát bò nhö maøn hình, maùy in, …  
Caùc heä ñoà hoïa cho pheùp ngöôøi duøng moâ taû caùc hình aûnh baèng heä toïa ñoä  
theá giôùi thöïc. Noù coù theå laø baát kì heä toïa ñoä Descartes naøo maø ngöôøi duøng  
caûm thaáy thuaän tieän nhaát khi söû duïng. Caùc hình aûnh ñöôïc moâ taû trong heä  
toïa ñoä thöïc sau ñoù seõ ñöôïc caùc heä ñoà hoïa aùnh xaï vaøo heä toïa ñoä thieát bò.  
Thoâng thöôøng caùc heä ñoà hoïa cho pheùp ngöôøi duøng xaùc ñònh vuøng naøo cuûa  
hình aûnh ñöôïc hieån thò vaø noù seõ ñöôïc hieån thò ôû ñaâu treân maøn hình. Ta coù  
theå choïn moät vuøng hay moät soá vuøng ñeå hieån thò cuøng moät luùc, caùc vuøng  
naøy coù theå ñaët ôû caùc nôi khaùc nhau treân maøn hình hay loàng vaøo nhau. Quaù  
trình bieán ñoåi naøy ñoøi hoûi caùc pheùp bieán ñoåi nhö dòch chuyeån, quay, bieán  
ñoåi tæ leä; vaø caùc thao taùc loaïi boû caùc vuøng hình aûnh naèm ngoaøi vuøng ñöôïc  
ñònh nghóa, ….  
1. QUY TRÌNH HIEÅN THÒ ÑOÁI TÖÔÏNG HAI CHIEÀU  
1.1. Moät soá khaùi nieäm  
Cöûa soå (window) laø moät vuøng ñöôïc choïn ñeå hieån thò trong heä toïa ñoä theá  
giôùi thöïc.  
Vuøng quan saùt (viewport) laø vuøng ñöôïc choïn treân thieát bò hieån thò ñeå caùc  
ñoái töôïng ôû trong cöûa soå aùnh xaï vaøo.  
Cöûa soå xaùc ñònh caùi gì ñöôïc thaáy treân thieát bò hieån thò, coøn vuøng quan saùt  
xaùc ñònh nôi naøo noù seõ ñöôïc hieån thò.  
ÔÛ ñaây chuùng ta neân phaân bieät khaùi nieäm cöûa soå ñöôïc duøng trong phaàn  
naøy vôùi khaùi nieäm cöûa soå ñöôïc duøng trong caùc chöông trình öùng duïng treân  
caùc heä ñieàu haønh nhö Windows.  
Thoâng thöôøng cöûa soå vaø vuøng quan saùt coù daïng hình chöõ nhaät, coù caùc  
caïnh song song vôùi caùc truïc toïa ñoä. Tuy nhieân chuùng cuõng coøn coù moät soá  
daïng khaùc nhö ña giaùc, hình troøn, …  
Quaù trình aùnh xaï moät vuøng ñònh nghóa trong heä toïa ñoä theá giôùi thöïc vaøo  
moät vuøng trong heä toïa ñoä thieát bò ñöôïc goïi laø pheùp bieán ñoåi heä quan saùt  
(viewing transformation).  
Window  
Viewport  
ywmax  
yvmax  
yvmin  
ywmin  
xwmin  
xwmax  
xvmin  
xvmax  
Hình 4.1 – Pheùp bieán ñoåi heä quan saùt vôùi cöûa soå vaø vuøng quan saùt coù daïng laø caùc hình chöõ nhaät  
Quy trình hieån thò caùc ñoái töôïng trong ñoà hoïa hai chieàu coù theå ñöôïc moâ taû  
qua sô ñoà sau :  
Tröôùc tieân, caùc ñoái töôïng seõ ñöôïc moâ taû baèng caùc ñoái töôïng ñoà hoïa cô sôû  
vaø caùc thuoäc tính cuûa chuùng trong töøng heä toïa ñoä cuïc boä (modeling  
coordinates - MC) nhaèm ñôn giaûn hoùa vaø taän duïng caùc ñaëc tröng rieâng cuûa  
töøng loaïi. Sau ñoù, chuùng ta seõ duøng caùc pheùp bieán ñoåi heä toïa ñoä ñeå  
chuyeån caùc moâ taû töø caùc heä toïa ñoä cuïc boä naøy sang moät heä toïa ñoä theá  
giôùi thöïc (world coordinates - WC) duy nhaát chöùa toaøn boä caùc ñoái töôïng thaønh  
phaàn. Pheùp chuyeån ñoåi naøy ñöôïc goïi laø pheùp chuyeån ñoåi moâ hình (modeling  
coordinates transformation).  
Tieáp theo, chuùng ta seõ ñònh moät heä toïa ñoä quan saùt (viewing coordinates - VC),  
laø heä toïa ñoä moâ taû vò trí cuûa ngöôøi quan saùt ñoái töôïng. Nhôø vieäc söû duïng  
heä toïa ñoä naøy maø cuøng moät moâ taû, caùc ñoái töôïng coù theå ñöôïc quan saùt ôû  
nhieàu goùc ñoä vaø vò trí khaùc nhau.  
Sau khi chuyeån caùc moâ taû ñoái töôïng töø heä toïa ñoä theá giôùi thöïc sang heä toïa  
ñoä quan saùt, chuùng ta seõ ñònh nghóa cöûa soå trong heä toïa ñoä naøy, ñoàng thôøi  
ñònh nghóa vuøng quan saùt trong heä toïa ñoä thieát bò chuaån (normalized device  
coordinates - NDC) coù toïa ñoä caùc chieàu thay ñoåi trong khoaûng töø 0 ñeán 1.  
Sau khi thöïc hieän pheùp aùnh xaï töø cöûa soå sang vuøng quan saùt, taát caû caùc  
phaàn cuûa ñoái töôïng naèm ngoaøi vuøng quan saùt seõ bò xeùn (clip) vaø toaøn boä  
nhöõng gì naèm trong vuøng quan saùt seõ ñöôïc aùnh xaï sang heä toïa ñoä thieát bò  
(device coordinates - DC). Vieäc ñöa ra heä toïa ñoä thieát bò chuaån nhaèm giuùp cho  
vieäc töông thích deã daøng vôùi nhieàu loaïi thieát bò hieån thò khaùc nhau.  
Chuyeån ñoåi töø heä  
toïa ñoä cuïc boä  
sang heä toïa ñoä  
theá giôùi thöïc  
Chuyeån ñoåi töø heä  
toïa ñoä theá giôùi thöïc  
sang heä toïa ñoä  
quan saùt  
AÙnh xaï töø heä toïa  
ñoä thieát bò  
chuaån sang heä  
toïa ñoä thieát bò  
Chuyeån ñoåi töø heä toïa  
ñoä quan saùt sang heä  
toïa ñoä thieát bò chuaån  
MC  
WC  
VC  
NDC  
DC  
Hình 4.2 – Quy trình hieån thò ñoái töôïng hai chieàu  
Baèng caùch thay ñoåi vò trí cuûa vuøng quan saùt chuùng ta coù theå quan saùt caùc  
ñoái töôïng taïi caùc vò trí khaùc nhau treân maøn hình hieån thò, ñoàng thôøi, baèng  
caùch thay ñoåi kích thöôùc cuûa vuøng quan saùt, chuùng ta coù theå thay ñoåi kích  
thöôùc vaø tính caân xöùng cuûa caùc ñoái töôïng ñöôïc hieån thò. Chuùng ta coù theå  
thöïc hieän caùc hieäu öùng thu phoùng baèng caùch aùnh xaï caùc cöûa soå coù kích  
thöôùc khaùc nhau vaøo vuøng quan saùt coù kích thöôùc coá ñònh. Khi caùc cöûa soå  
ñöôïc thu nhoû, phaàn naèm trong cöûa soå seõ ñöôïc phoùng to giuùp chuùng ta deã  
daøng quan saùt caùc chi tieát maø khoâng theå thaáy ñöôïc trong caùc cöûa soå lôùn  
hôn.  
1.2. Heä toïa ñoä quan saùt vaø heä toïa ñoä thieát bò chuaån  
1.2.1. Heä toïa ñoä quan saùt  
Ñeå thieát laäp heä toïa ñoä quan saùt, tröôùc tieân ta seõ choïn moät ñieåm P0  
x0 , y0  
trong heä  
toïa ñoä theá giôùi thöïc laøm goác toïa ñoä. Sau ñoù chuùng ta seõ söû duïng moät vector V moâ taû höôùng  
quan saùt ñeå ñònh höôùng cho truïc tung yv cuûa heä toïa ñoä. Vector V ñöôïc goïi laø view-up  
vector.  
Töø V chuùng ta coù theå tính ñöôïc caùc vector ñôn vò v  
vx ,vy  
vaø u  
ux ,uy töông öùng  
cho caùc truïc tung yv vaø truïc hoaønh xv cuûa heä toïa ñoä. Caùc vector ñôn vò naøy seõ ñöôïc duøng  
ñeå taïo thaønh hai doøng ñaàu tieân cuûa ma traän quay MR ñeå ñöa caùc truïc xv yv truøng vôùi caùc  
truïc xw yw cuûa heä truïc toïa ñoä theá giôùi thöïc.  
yworld  
yworld  
yview  
y
v
i
e
y0  
w
T
xview  
x0  
xworld  
xworld  
R
x
v
i
e
w
(a)  
(b)  
Hình 4.3 – Pheùp bieán ñoåi moät ñieåm töø heä toïa ñoä quan saùt sang heä toïa ñoä thöïc  
Ma traän cuûa pheùp chuyeån moät ñieåm trong heä toïa ñoä theá giôùi thöïc sang heä  
toïa ñoä quan saùt laø tích cuûa hai ma traän cuûa caùc pheùp bieán ñoåi : pheùp tònh  
tieán goác toïa ñoä heä quan saùt veà goác toïa ñoä heä toïa ñoä theá giôùi thöïc, pheùp  
quay ñöa caùc truïc cuûa heä toïa ñoä quan saùt truøng vôùi caùc truïc cuûa heä toïa ñoä  
theá giôùi thöïc. MWC,VC MT MR  
.
1.2.2. Heä toïa ñoä thieát bò chuaån  
Do caùch ñònh nghóa cuûa caùc heä toïa ñoä thieát bò khaùc nhau neân moät hình aûnh  
hieån thò ñöôïc treân thieát bò naøy chöa chaéc hieån thò chính xaùc treân thieát bò kia.  
Chính vì vaäy caàn phaûi xaây döïng heä toïa ñoä thieát bò chuaån ñaïi dieän chung cho  
caùc thieát bò ñeå coù theå moâ taû caùc hình aûnh cuûa theá giôùi thöïc maø khoâng  
phuï thuoäc vaøo baát cöù thieát bò naøo.  
Trong heä toïa ñoä naøy, caùc toïa ñoä x, y seõ ñöôïc gaùn caùc giaù trò trong khoaûng  
töø 0 ñeán 1. Nhö vaäy, vuøng khoâng gian cuûa heä toïa ñoä thieát bò chuaån chính laø  
hình vuoâng ñôn vò coù goùc traùi döôùi laø (0,0) vaø goùc phaûi treân (1,1).  
y
(1,1)  
1
1
x
Hình 4.4 – Heä toïa ñoä thieát bò chuaån  
1.3. Chuyeån ñoåi töø cöûa soå sang vuøng quan saùt  
Pheùp chuyeån ñoåi töø cöûa soå sang vuøng quan saùt bao goàm 3 pheùp bieán ñoåi :  
pheùp tònh tieán ñeå dòch chuyeån goùc traùi döôùi veà goác toïa ñoä (hình 4.5a), pheùp  
bieán ñoåi tæ leä ñeå chænh kích thöôùc cuûa cöûa soå veà cuøng kích thöôùc cuûa  
vuøng quan saùt (hình 4.5b, hình 4.5c), cuoái cuøng laø pheùp tònh tieán dòch chuyeån  
y
y
v
v
(xmax,ymax  
)
(umax,vmax)  
(xmin,ymin  
)
(umin,vmin)  
x
x
u
u
(a)  
(b)  
(c)  
(d)  
veà goùc traùi döôùi cuûa vuøng quan saùt (hình 4.5d).  
Hình 4.5 – Pheùp chuyeån ñoåi töø cöûa soå sang vuøng quan saùt  
Ta coù ma traän cuûa pheùp bieán ñoåi :  
umax umin vmax vmin  
xmax xmin ymax ymin  
MWV MTW  
xmin ,ymin  
MS  
,
MTV  
umin ,vmin  
umax umin  
xmax xmin  
0
0
0
1
vmax vmin  
ymax ymin  
vmax vmin  
0
umax umin  
xmax xmin  
xmin  
umin ymin  
vmin  
ymax ymin  
Nhö vaäy neáu P  
x, y  
laø ñieåm trong cöûa soå thì noù seõ coù toïa ñoä trong vuøng quan saùt laø :  
umax umin  
xmax xmin  
vmax vmin  
ymax ymin  
sx  
x xmin umin ,sy  
y ymin  
vmin  
vôùi sx   
, sy   
.
sx,sy laø caùc heä soá tæ leä cuûa caùc kích thöôùc cuûa cöûa soå vaø vuøng quan saùt. Khi  
sx sy 1, caùc ñoái töôïng qua pheùp chuyeån ñoåi seõ ñöôïc giöõ nguyeân hình daùng vaø tính caân  
xöùng.  
1.4. Caùc thuaät toaùn xeùn hình  
Thao taùc loaïi boû caùc phaàn hình aûnh naèm ngoaøi moät vuøng cho tröôùc ñöôïc goïi  
laø xeùn hình. Vuøng ñöôïc duøng ñeå xeùn hình goïi laø cöûa soå xeùn (clip window).  
Tuøy thuoäc vaøo töøng öùng duïng cuï theå maø cöûa soå xeùn coù theå coù daïng laø  
ña giaùc hay laø ñöôøng cong kheùp kín. Trong phaàn naøy chuùng ta seõ khaûo saùt  
caùc thuaät toaùn xeùn hình vaøo cöûa soå xeùn laø hình chöõ nhaät tröôùc, sau ñoù seõ  
khaûo saùt caùc cöûa soå xeùn coù daïng khaùc. Ñeå ñôn giaûn, trong caùc thuaät toaùn  
xeùn hình, cöûa soå xeùn ñöôïc goïi laø cöûa soå.  
2. CAÙC THUAÄT TOAÙN XEÙN ÑIEÅM, ÑOAÏN THAÚNG  
Giaû söû cöûa soå xeùn laø cöûa soå hình chöõ nhaät coù toïa ñoä cuûa caùc ñieåm döôùi beân traùi vaø  
ñieåm treân beân phaûi laàn löôït laø  
xmin, ymin  
vaø  
xmax, ymax  
.
Moät ñieåm P  
x xmax  
x, y  
ñöôïc coi laø naèm beân trong cöûa soå neáu thoûa heä baát phöông trình :  
x
min  
ymin y ymax  
Baây giôø, ta seõ xeùt baøi toaùn xeùn ñoaïn thaúng ñöôïc cho bôûi hai ñieåm P1x1, y1  
vaø  
P2  
x2 , y2  
vaøo cöûa soå hình chöõ nhaät treân.  
P7  
P4  
P2  
P2  
P6  
P8  
P1  
P1  
P'6  
Window  
Window  
P3  
P'5  
(a)  
P5  
(b)  
Hình 4.6 – Minh hoïa thao taùc xeùn caùc ñoaïn thaúng vaøo moät cöûa soå hình chöõ nhaät. Tröôùc khi xeùn (a). Sau khi  
xeùn (b).  
Thao taùc xeùn hình laø moät trong nhöõng thao taùc cô baûn cuûa quaù trình hieån thò  
ñoái töôïng, do ñoù vaán ñeà toái öu toác ñoä luoân laø ñích cho caùc thuaät toaùn nhaém  
ñeán. YÙ töôûng chung cuûa caùc thuaät toaùn xeùn ñoaïn thaúng ñoù laø loaïi boû  
pheùp toaùn tìm giao ñieåm giöõa ñoaïn thaúng vôùi bieân cuûa cöûa soå moät caùch  
nhanh nhaát ñoái vôùi caùc ñoaïn thaúng ñaëc bieät nhö naèm hoaøn toaøn trong hoaëc  
hoaøn toaøn beân ngoaøi cöûa soå (ví duï nhö ñoaïn P1P2 vaø P3P4 trong hình 4.6). Ñoái  
vôùi caùc ñoaïn thaúng coù khaû naêng caét cöûa soå, caàn phaûi ñöa ra caùch tìm giao  
ñieåm thaät nhanh.  
Nhaän xeùt raèng, caùc ñoaïn thaúng maø coù caû hai ñieåm naèm hoaøn toaøn trong  
cöûa soå thì caû ñoaïn thaúng naèm trong cöûa soå, ñaây cuõng chính laø keát quaû sau  
khi xeùn (ví duï nhö ñoaïn thaúng P1P2), maët khaùc ñoái vôùi caùc ñoaïn thaúng maø  
coù hai ñieåm naèm veà cuøng moät phía cuûa cöûa soå thì luoân naèm ngoaøi cöûa soå  
vaø seõ bò maát sau khi xeùn (ví duï nhö ñoaïn thaúng P3P4). Vôùi caùc ñoaïn thaúng coù  
khaû naêng caét cöûa soå (ví duï nhö ñoaïn thaúng P5P6 vaø P7P8) ñeå vieäc tìm giao  
ñieåm nhanh caàn ruùt goïn vieäc tìm giao ñieåm vôùi nhöõng bieân cöûa soå khoâng  
caàn thieát ñeå xaùc ñònh phaàn giao neáu coù cuûa ñoaïn thaúng vaø cöûa soå.  
Ngöôøi ta thöôøng söû duïng phöông trình tham soá cuûa ñoaïn thaúng trong vieäc tìm  
giao ñieåm giöõa ñoaïn thaúng vôùi cöûa soå.  
x x1 t  
y y1 t  
x2 x1  
x1 tDx, Dx x2 x1  
y1 tDy, Dy y2 y1,  
y2 y1  
0 t 1  
Neáu giao ñieåm öùng vôùi giaù trò t naèm ngoaøi ñoaïn  
khoâng thuoäc veà cöûa soå.  
0,1 thì giao ñieåm ñoù seõ  
2.1. Thuaät toaùn Cohen-Sutherland  
Ñaây laø moät trong nhöõng thuaät toaùn ra ñôøi sôùm nhaát vaø thoâng duïng nhaát.  
Baèng caùch keùo daøi caùc bieân cuûa cöûa soå, ngöôøi ta chia maët phaúng thaønh  
chín vuøng goàm cöûa soå vaø taùm vuøng xung quanh noù.  
Khaùi nieäm maõ vuøng (area code)  
Moät con soá 4 bit nhò phaân goïi laø maõ vuøng seõ ñöôïc gaùn cho moãi vuøng ñeå  
moâ taû vò trí töông ñoái cuûa vuøng ñoù so vôùi cöûa soå. Baèng caùch ñaùnh soá töø 1  
ñeán 4 theo thöù töï töø phaûi qua traùi, caùc bit cuûa maõ vuøng ñöôïc duøng theo quy  
öôùc sau ñeå chæ moät trong boán vò trí töông ñoái cuûa vuøng so vôùi cöûa soå bao  
goàm : traùi, phaûi, treân, döôùi.  
Bit 1 : traùi (LEFT)  
Bit 2 : phaûi (RIGHT)  
Bit 3 : treân (TOP)  
Bit 4 : döôùi (BOTTOM)  
Giaù trò 1 töông öùng vôùi vò trí bit naøo trong maõ vuøng seõ chæ ra raèng ñieåm ñoù  
ôû vò trí töông öùng, ngöôïc laïi bit ñoù seõ ñöôïc ñaët baèng 0. Ví duï moät vuøng coù  
maõ laø 1001, thì noù seõ naèm phía döôùi (bit 4 baèng 1), beân traùi (bit 1 baèng 1) so  
vôùi cöûa soå, vuøng coù maõ laø 0000 chính laø cöûa soå.  
TOP  
0101  
0001  
1001  
0100  
0110  
0010  
1010  
4
3
2
1
LEFT  
LEFT  
RIGHT  
0000  
RIGHT  
TOP  
Window  
BOTTOM  
BOTTOM  
1000  
Hình 4.7 – Maõ vuøng quy ñònh vò trí töông ñoái cuûa vuøng so vôùi cöûa soå  
Caùc giaù trò bit trong maõ vuøng ñöôïc tính baèng caùch xaùc ñònh toïa ñoä cuûa ñieåm  
thuoäc vuøng ñoù vôùi caùc bieân cuûa cöûa soå. Bit 1 ñöôïc ñaët laø 1 neáu  
x, y  
x xmin , caùc bit khaùc ñöôïc tính töông töï.  
Thuaät toaùn  
Gaùn maõ vuøng töông öùng cho caùc ñieåm ñaàu cuoái P , P2 cuûa ñoaïn thaúng caàn xeùn laàn löôït  
1
laø c1,c2 . Ta coù nhaän xeùt :  
Caùc ñoaïn thaúng naèm hoaøn toaøn beân trong cöûa soå seõ coù c1 c2 0000, öùng  
vôùi caùc ñoaïn naøy, keát quaû sau khi xeùn laø chính noù.  
Neáu toàn taïi k   
1,..,4 , sao cho vôùi bit thöù k cuûa c1,c2 ñeàu coù giaù trò 1, luùc  
naøy ñoaïn thaúng seõ naèm veà cuøng phía öùng vôùi bit k so vôùi cöûa soå, do ñoù  
naèm hoaøn toaøn ngoaøi cöûa soå. Ñoaïn naøy seõ bò loaïi boû sau khi xeùn. Ví duï,  
neáu c1 1001,c2 0101, roõ raøng bit 1 cuûa chuùng ñeàu baèng 1 (öùng vôùi bieân  
traùi), do ñoù ñoaïn thaúng naèm hoaøn toaøn veà bieân traùi cuûa cöûa soå. Ñeå xaùc  
ñònh tính chaát naøy, ñôn giaûn chæ caàn thöïc hieän pheùp toaùn logic AND treân  
c1,c2 . Neáu keát quaû khaùc 0000, ñoaïn thaúng seõ naèm hoaøn toaøn ngoaøi cöûa soå.  
Neáu c1,c2 khoâng thuoäc veà hai tröôøng hôïp treân, ñoaïn thaúng coù theå hoaëc  
khoâng caét ngang cöûa soå (ví duï ñoaïn P5 P6 , P7 P8 trong hình 4.6) chaéc chaén seõ  
toàn taïi moät ñieåm naèm ngoaøi cöûa soå, khoâng maát tính toång quaùt giaû söû ñieåm  
ñoù laø  
P1 . Baèng caùch xeùt maõ vuøng cuûa P laø c1 ta coù theå xaùc ñònh ñöôïc caùc  
1
bieân maø ñoaïn thaúng coù theå caét ñeå töø ñoù choïn moät bieân vaø tieán haønh tìm  
giao ñieåm P 'cuûa ñoaïn thaúng vôùi bieân ñoù. Luùc naøy, ñoaïn thaúng ban ñaàu  
1
ñöôïc xeùn thaønh P P '. Tôùi ñaây chuùng ta laïi laëp laïi thao taùc ñaõ xeùt cho  
1
1
ñoaïn thaúng môùi P P ' cho tôùi khi xaùc ñònh ñöôïc phaàn naèm trong hoaëc loaïi  
1
1
boû toaøn boä ñoaïn thaúng.  
Chuùng ta minh hoïa thuaät toaùn baèng hình veõ 4.8. Vôùi ñoaïn thaúng P P2 , ta seõ kieåm  
1
tra  
P laàn löôït vôùi caùc bieân traùi, phaûi, döôùi, treân vaø tìm ra ñieåm naøy naèm döôùi cöûa soå, sau  
1
ñoù chuùng ta tìm giao ñieåm P ' cuûa ñoaïn thaúng vôùi bieân döôùi. Luùc naøy ñoaïn thaúng ban ñaàu  
1
ñöôïc xeùn ngaén laïi thaønh P 'P2 . Vì P2 naèm ngoaøi cöûa soå neân baèng caùch xeùt töông töï,  
1
chuùng ta seõ tieán haønh tìm giao ñieåm P2 ' cuûa P 'P2 vôùi bieân treân vaø luùc naøy ñoaïn P 'P2 ' ,  
1
1
chính laø phaàn naèm hoaøn toaøn trong cöûa soå.  
Trong tröôøng hôïp ñoaïn P3 P4 P3 naèm beân traùi cöûa soå neân chuùng ta coù theå xaùc ñònh  
,
ñieåm giao P3 ', vaø töø ñoù loaïi boû ñoaïn thaúng P3 P3 '. Baèng caùch kieåm tra maõ vuøng, chuùng ta  
deã daøng xaùc ñònh ñöôïc ñoaïn thaúng P3 'P4 naèm hoaøn toaøn beân döôùi cöûa soå neân coù theå boû ñi  
toaøn boä.  
P2  
P'2  
P3  
P'1  
P'3  
P1  
P4  
Hình 4.8 – Minh hoïa thuaät toaùn Cohen - Sutherland  
Caùc ñieåm giao vôùi caùc bieân cöûa soå cuûa ñoaïn thaúng coù theå ñöôïc tính töø phöông trình  
tham soá nhö ñaõ ñeà caäp ôû phaàn treân. Tung ñoä y cuûa ñieåm giao ñoaïn thaúng vôùi bieân ñöùng  
cuûa cöûa soå coù theå tính töø coâng thöùc y y1 m  
Töông töï, hoaønh ñoä x cuûa ñieåm giao ñoaïn thaúng vôùi bieân ngang cuûa cöûa soå coù theå tính töø  
coâng thöùc : x x1 y y1 / m , trong ñoù y coù theå laø ymin hay ymax  
x x1  
, trong ñoù x coù theå laø xmin hay xmax .  
.
Löu ñoà thuaät toaùn Cohen-Sutherland duøng ñeå xeùn moät ñoaïn thaúng qua hai ñieåm  
(x1,y1) vaø (x2,y2) vaøo cöûa soå hình chöõ nhaät cho tröôùc  
Begin  
EnCode(P1,c1);  
EnCode(P2,c2)  
(c1!=0000) || (c2!=0000)  
No  
Yes  
(c1&c2 == 0000)  
Yes  
No  
Xaùc ñònh giao ñieåm cuûa ñoaïn  
thaúng vôùi bieân cuûa cöûa soå  
baèng caùch xeùt maõ vuøng cuûa  
ñieåm naèm ngoaøi cöûa soå  
End  
Caøi ñaët minh hoïa thuaät toaùn Cohen - Sutherland  
#define TRUE  
1
0
1
2
4
#define FALSE  
#define LEFT  
#define RIGHT  
#define TOP  
#define BOTTOM  
typedef struct {  
int x, y;  
8
}POINT;  
typedef struct {  
int Left, Top, Right, Bottom;  
}RECT;  
typedef int CODE;  
#define Accept(a,b)  
#define Reject(a,b)  
(!(a|b))  
(a&b)  
// Tra ve ma vung cua p la c  
void EnCode(POINT p, CODE &c, RECT rWin)  
{
c = 0;  
if(p.x < rWin.Left)  
c |= LEFT;  
if(p.x > rWin.Right)  
c |= RIGHT;  
if(p.y > rWin.Top)  
c |= TOP;  
if(p.y < rWin.Bottom)  
c |= BOTTOM;  
}
// Hoan vi hai diem p1 va p2 sao cho p1 luon nam ngoai cua so  
void SwapPoint(POINT& p1, POINT &p2, CODE &c1, CODE &c2)  
{
if(!c1) // Neu p1 nam hoan toan trong cua so  
{
POINT p;  
p = p1;  
p1 = p2;  
p2 = p;  
CODE c;  
c = c1;  
c1 = c2;  
c2 = c;  
}
}
// Tra ve TRUE neu co cat cua so. Nguoc lai tra ve FALSE  
int CohenSutherlandClipping(POINT P1, POINT P2, POINT &Q1, POINT &Q2, RECT rWin)  
{
int fStop = FALSE, fResult = FALSE;  
CODE c1, c2;  
while(!fStop)  
{
EnCode(P1, c1, rWin);  
EnCode(P2, c2, rWin);  
// Neu duong thang nam hoan toan ben trong cua so  
if(Accept(c1, c2))  
{
fStop  
fResult = TRUE;  
} // Accept  
= TRUE; // break  
else  
{
// Neu duong thang nam hoan toan ben ngoai cua so  
if(Reject(c1,c2))  
{
fStop = TRUE; // break  
} // Reject  
else // Xet truong hop duong thang co the cat cua so  
{
SwapPoint(P1, P2, c1, c2);  
float m;  
if(P2.x!=P1.x)  
m = float(P2.y-P1.y)/(P2.x-P1.x);  
if(c1 & LEFT)  
{
P1.y += (rWin.Left-P1.x)*m;  
P1.x = rWin.Left;  
} // Left  
else  
{
if(c1 & RIGHT)  
{
P1.y += (rWin.Right-P1.x)*m;  
P1.x = rWin.Right;  
} // Right  
else  
{
if(c1 & TOP)  
{
if(P2.x!=P1.x)  
P1.x += (rWin.Top - P1.y)/m;  
P1.y = rWin.Top;  
} // Top  
else // Bottom  
{
if(P2.x!=P1.x)  
P1.x  
+= (rWin.Bottom - P1.y)/m;  
P1.y = rWin.Bottom;  
} // Bottom  
}
}
} // Xet truong hop duong thang co the cat cua so  
}
} //while  
Q1 = P1;  
Q2 = P2;  
return (fResult);  
} //CohenSutherlandClipping  
2.2. Thuaät toaùn Liang-Barsky  
Thuaät toaùn Liang-Barsky ñöôïc phaùt trieån döïa vaøo vieäc phaân tích daïng tham soá  
cuûa phöông trình ñoaïn thaúng.  
x x1 t  
y y1 t  
x2 x1  
x1 tDx, Dx x2 x1  
y1 tDy, Dy y2 y1,  
y2 y1  
0 t 1  
ÖÙng vôùi moãi giaù trò t, ta seõ coù moät ñieåm P töông öùng thuoäc ñöôøng thaúng.  
Caùc ñieåm öùng vôùi t 1seõ thuoäc veà tia P2x.  
Caùc ñieåm öùng vôùi t 0 seõ thuoäc veà tia P2x’.  
Caùc ñieåm öùng vôùi 0 t 1 seõ thuoäc veà ñoaïn thaúng P P2  
.
1
x
P2(x2, y2)  
t>1  
t=1  
P1(x1, y1)  
t=0  
t<0  
x'  
Hình 4.9 – Phöông trình tham soá cuûa ñoaïn thaúng  
Taäp hôïp caùc ñieåm thuoäc veà phaàn giao cuûa ñoaïn thaúng vaø cöûa soå öùng vôùi  
caùc giaù trò t thoûa heä baát phöông trình :  
x
y
x1 tDx xmax  
y1 tDy ymax  
min  
min  
0 t 1  
p1  Dx, q1 x1 xmin  
p2 Dx, q2 xmax x1  
p3  Dy, q3 y1 ymin  
p4 Dy, q4 ymax y1  
Ñaët  
Luùc naøy ta vieát heä phöông trình treân döôùi daïng :  
p t q , k   
0 t 1  
1,2,3,4  
k
k
Nhö vaäy vieäc tìm ñoaïn giao thöïc chaát laø tìm nghieäm cuûa heä baát phöông trình  
naøy. Coù hai khaû naêng xaûy ra ñoù laø :  
Heä baát phöông trình voâ nghieäm, nghóa laø ñöôøng thaúng khoâng coù phaàn giao  
vôùi cöûa soå neân seõ bò loaïi boû.  
Heä baát phöông trình coù nghieäm, luùc naøy taäp nghieäm seõ laø caùc giaù trò t thoûa  
t   
t1,t2  
0,1 .  
Ta xeùt caùc tröôøng hôïp :  
Neáu k   
k treân laø voâ nghieäm, do ñoù heä voâ nghieäm.  
Neáu k 1,2,3,4 : (pk 0) (qk 0) thì vôùi caùc baát phöông trình maø öùng  
1,2,3,4  
: (pk 0) (qk 0)thì roõ raøng baát phöông trình öùng vôùi  
vôùi pk = 0 laø caùc baát phöông trình hieån nhieân, luùc naøy heä baát phöông trình  
caàn giaûi töông ñöông vôùi heä baát phöông trình coù pk 0.  
Vôùi caùc baát phöông trình pk t qk maø pk 0, ta coù t qk / pk  
Vôùi caùc baát phöông trình pk t qk maø pk 0, ta coù t qk / pk  
t1,t2  
.
.
Vaäy nghieäm cuûa heä baát phöông trình laø  
vôùi :  
qk  
pk  
t max(  
, p 0  
0 )  
1
k
qk  
pk  
t min(  
, p 0   
1 )  
2
k
t1 t2  
Neáu heä treân coù nghieäm thì ñoaïn giao Q1Q2 seõ laø  
Q1 (x1 t1 Dx, y1 t1 Dy),Q2 (x1 t2 Dx, y1 t2 Dy)  
.
Neáu xeùt thuaät toaùn naøy ôû khía caïnh hình hoïc ta coù :  
Tröôøng hôïp k   
1,2,3,4 : (pk 0) (qk 0) töông öùng vôùi tröôøng hôïp  
ñoaïn thaúng caàn xeùt song song vôùi moät trong caùc bieân cuûa cöûa soå ( pk 0)  
vaø naèm ngoaøi cöûa soå (qk 0) neân seõ bò loaïi boû sau khi xeùn.  
Vôùi pk 0, giaù trò t rk qk / pk seõ töông öùng vôùi giao ñieåm cuûa ñoaïn  
thaúng vôùi bieân k keùo daøi cuûa cöûa soå. Tröôøng hôïp pk 0, keùo daøi caùc bieân  
cöûa soå vaø ñoaïn thaúng veà voâ cöïc, ta coù ñöôøng thaúng ñang xeùt seõ coù höôùng ñi  
töø beân ngoaøi vaøo beân trong cöûa soå. Neáu pk 0, ñöôøng thaúng seõ coù höôùng  
ñi töø beân trong cöûa soå ñi ra. Do ñoù hai ñaàu muùt cuûa ñoaïn giao seõ öùng vôùi  
caùc giaù trò t1,t2 ñöôïc tính nhö sau : Giaù trò t1 chính laø giaù trò lôùn nhaát cuûa  
caùc rk qk / pk maø pk 0 (ñöôøng thaúng ñi töø ngoaøi vaøo trong cöûa soå) vaø 0;  
giaù trò t2 chính laø giaù trò nhoû nhaát cuûa caùc rk qk / pk maø pk 0 (ñöôøng  
thaúng ñi töø trong cöûa soå ñi ra) vaø 1.  
Hình 4.10 – Xeùt vôùi bieân traùi ñoaïn thaúng P1P2 coù höôùng ñi töø ngoaøi vaøo trong, nhöng so vôùi bieân phaûi ñoaïn  
P2  
P'2  
P'1  
P1  
thaúng P’1P’2 laïi coù höôùng ñi töø trong cöûa soå ñi ra  
Khi caøi ñaët thuaät toaùn Liang-Barsky, ban ñaàu caùc giaù trò t1, t2 ñöôïc khôûi ñoäng  
t1 0,t2 1. Vôùi moãi laàn xeùn ñoaïn thaúng vôùi moät bieân cuûa cöûa soå, caùc giaù trò p,q seõ ñöôïc  
truyeàn cho haøm ClipTest ñeå xaùc ñònh ñoaïn thaúng coù bò loaïi boû hay bò xeùn bôùt moät ñoaïn  
hay khoâng. Khi p 0, tham soá r q / p seõ ñöôïc xem xeùt ñeå caäp nhaät t1 , khi p 0 , r  
duøng ñeå caäp nhaät t2 . Khi caäp nhaät t1 vaø t2 neáu t1 t2 , ñoaïn thaúng seõ bò loaïi boû. Ngoaøi  
ra neáu (p=0 vaø q<0), chuùng ta cuõng seõ loaïi boû ñoaïn thaúng vì noù song song vaø naèm ngoaøi  
cöûa soå. Neáu ñoaïn thaúng khoâng bò loaïi boû sau boán laàn goïi vôùi caùc tham soá p, q töông öùng  
vôùi caùc bieân cuûa cöûa soå, caùc giaù trò t1 vaø t2 seõ ñöôïc duøng ñeå suy ra toïa ñoä hai ñieåm ñaàu  
muùt cuûa ñoaïn giao.  
Caøi ñaët minh hoïa thuaät toaùn Liang - Barsky  
// Tra ve TRUE neu khong xay ra truong hop nam ngoai cua so  
int ClipTest(int p, int q, float &t1, float &t2)  
{
float r;  
if (p<0)  
{
r = float(q)/p;  
if (r>t2)  
return FALSE;  
else  
if (r>t1)  
t1 = r;  
}
else  
{
if (p>0)  
{
r = float(q)/p;  
if (r<t1)  
return FALSE;  
else  
if (r<t2)  
t2 = r;  
}
else // p=0  
{
if (q<0)  
return FALSE;  
}
}
return TRUE;  
}
{
int LiangBarskyClipping(POINT P1, POINT P2, RECT R, POINT *Q1, POINT *Q2)  
float t1, t2;  
int Dx, Dy, x1, y1, x2, y2, xmin, ymin, xmax, ymax  
;
t1 = 0;  
t2 = 1;  
x1 = P1.x; y1 = P1.y;  
x2 = P2.x; y2 = P2.y;  
Dx = x2 - x1; Dy = y2 - y1;  
xmin = R.Left; ymin = R.Top;  
xmax = R.Right; ymax = R.Bottom;  
if (ClipTest(-Dx, x1 - xmin, t1, t2)) // Giai he bat phuong trinh 1  
{
if (ClipTest(Dx, xmax - x1, t1, t2)) // Giai he bat phuong trinh 2  
{
if (ClipTest(-Dy, y1 - ymin, t1, t2)) // Giai he bat phuong trinh 3  
{
if (ClipTest(Dy, ymax - y1, t1, t2)) // Giai he bat phuong trinh 4  
{
Q1.x = x1 + t1. Dx;  
Q1.y = y1 + t1. Dy;  
Q2.x = x1 + t2. Dx;  
Q2.y = y1 + t2. Dy;  
return TRUE;  
} // Giai he bat phuong trinh 4  
} // Giai he bat phuong trinh 3  
} // Giai he bat phuong trinh 2  
} // Giai he bat phuong trinh 1  
return FALSE;  
} // LiangBarskyClipping  
Nhaän xeùt  
Thoâng thöôøng, thuaät toaùn Liang-Barsky cho toác ñoä toát hôn thuaät toaùn Cohen-  
Sutherland vì ruùt goïn ñöôïc soá giao ñieåm caàn tính. Moãi laàn caäp nhaät caùc giaù  
trò t1,t2 , chæ caàn moät pheùp chia, vaø giao ñieåm cuûa ñoaïn thaúng vôùi cöûa soå  
chæ ñöôïc tính duy nhaát moät laàn sau khi ñaõ tìm ra ñöôïc giaù trò t1,t2 . Trong khi ñoù  
thuaät toaùn Cohen-Sutherland ñoâi luùc phaûi tính giao ñieåm cho caùc ñieåm khoâng  
naèm trong bieân cuûa cöûa soå ñoøi hoûi nhieàu pheùp toaùn hôn.  
3. THUAÄT TOAÙN XEÙN ÑA GIAÙC  
Chuùng ta coù theå hieäu chænh caùc thuaät toaùn xeùn ñoaïn thaúng ñeå xeùn ña giaùc  
baèng caùch xem ña giaùc nhö laø moät taäp caùc ñoaïn thaúng lieân tieáp noái vôùi  
nhau. Tuy nhieân, keát quaû sau khi xeùn nhieàu khi laïi laø taäp caùc ñoaïn thaúng rôøi  
nhau. Ñieàu chuùng ta mong muoán ôû ñaây ñoù laø keát quaû sau khi xeùn phaûi laø  
moät caùc ña giaùc ñeå sau naøy coù theå chuyeån thaønh caùc vuøng toâ.  
Hình 4.11 – Keát quaû sau khi xeùn ña giaùc ban ñaàu. Ña giaùc ban ñaàu (a). Keát quaû laø caùc ñoaïn rôøi nhau (b)  
(a)  
(b)  
(c)  
vaø keát quaû laø caùc ña giaùc (c)  
Trong phaàn naøy chuùng ta seõ khaûo saùt moät trong caùc thuaät toaùn xeùn ña giaùc  
ñoù laø thuaät toaùn Sutherland-Hodgeman.  
Hình 4.12 – Quaù trình xeùn moät ña giaùc vaøo cöûa soå  
Thuaät toaùn naøy seõ tieán haønh xeùn ña giaùc laàn löôït vôùi caùc bieân cöûa soå.  
Ñaàu tieân, ña giaùc seõ ñöôïc xeùn doïc theo bieân traùi cuûa cöûa soå, keát quaû sau  
böôùc naøy seõ ñöôïc duøng ñeå xeùn tieáp bieân phaûi, roài cöù töông töï nhö vaäy cho  
caùc bieân treân, döôùi. Sau khi xeùn heát vôùi boán bieân cuûa cöûa soå, ta ñöôïc keát  
quaû cuoái cuøng.  
Vôùi moãi laàn xeùn ña giaùc doïc theo moät bieân naøo ñoù cuûa cöûa soå, neáu goïi  
Vi ,Vi1 laø hai ñænh keà caïnh ViVi1 , ta coù 4 tröôøng hôïp coù theå xaûy ra khi xeùt  
töøng caëp ñænh cuûa ña giaùc ban ñaàu vôùi bieân cuûa cöûa soå nhö sau:  
(i) Neáu Vi naèm ngoaøi, Vi1 naèm trong, ta löu giao ñieåm I cuûa ViVi1 vôùi  
bieân cuûa cöûa soå vaø Vi1  
.
(ii) Neáu caû Vi , Vi1 ñeàu naèm trong, ta seõ löu caû Vi , Vi1  
.
(iii) Neáu Vi naèm trong, Vi1 naèm ngoaøi, ta seõ löu Vi vaø I.  
(iv) Neáu caû Vi , Vi1 ñeàu naèm ngoaøi, ta khoâng löu gì caû.  
Vi  
I
Vi+1  
Vi  
Vi+1  
Vi  
Vi+1  
I
Vi+1  
Vi  
(i)  
(ii)  
(iii)  
(iv)  
Hình 4.13 – Caùc tröôøng hôïp khi xeùt Vi ,Vi1 vôùi caùc bieân cuûa cöûa soå  
Caøi ñaët minh hoïa thuaät toaùn Sutherland-Hodgeman  
#include <graphics.h>  
#include <mem.h>  
#include <conio.h>  
#include <stdio.h>  
#include <stdlib.h>  
#define TRUE  
#define FALSE  
#define LEFT  
#define RIGHT  
#define TOP  
1
0
1
2
4
8
#define BOTTOM  
typedef struct {  
int x, y;  
}POINT;  
typedef struct {  
int Left, Top, Right, Bottom;  
}RECT;  
// Xac dinh p co nam ben trong cua so neu xet theo mot canh b  
int Inside(POINT p, int Edge, RECT rWin)  
{
switch(Edge)  
{
case LEFT :  
if(p.x < rWin.Left)  
return FALSE;  
break;  
case RIGHT:  
if(p.x > rWin.Right)  
return FALSE;  
break;  
case TOP :  
if(p.y > rWin.Top)  
return FALSE;  
break;  
case BOTTOM :  
if(p.y < rWin.Bottom)  
return FALSE;  
break;  
}
return TRUE;  
} //Inside  
// Tra ve giao diem cua doan noi p1&p2 voi canh b  
POINT Intersect(POINT p1, POINT p2, int Edge, RECT rWin)  
{
POINT iPt;  
float m;  
if(p1.x != p2.x)  
m = float(p2.y-p1.y)/(p2.x-p1.x);  
switch(Edge)  
{
case LEFT :  
iPt.x = rWin.Left;  
iPt.y = p2.y + (rWin.Left-p2.x)*m;  
break;  
case RIGHT :  
iPt.x = rWin.Right;  
iPt.y = p2.y + (rWin.Right-p2.x)*m;  
break;  
case TOP :  
iPt.y = rWin.Top;  
if(p1.x != p2.x)  
iPt.x = p2.x + (rWin.Top-p2.y)/m;  
else  
iPt.x = p2.x;  
break;  
case BOTTOM :  
iPt.y = rWin.Bottom;  
if(p1.x != p2.x)  
iPt.x = p2.x + (rWin.Bottom-p2.y)/m;  
else  
iPt.x = p2.x;  
break;  
}
return (iPt);  
} // Intersect  
// Tien hanh cat da giac voi mot canh nao do cua cua so.  
void ClipEdge(POINT *pIn, int N, POINT *pOut, int &Cnt, int Edge,  
RECT rWin)  
{
int FlagPrevPt = FALSE;  
Cnt = 0;  
POINT pPrev;  
pPrev = pIn[0];  
if(Inside(pPrev, Edge, rWin)) // Save point  
{
pOut[Cnt] = pPrev;  
Cnt++;  
FlagPrevPt = TRUE;  
}
for(int i=1; i<N; i++)  
{
if(FlagPrevPt) // Diem bat dau nam trong  
{
if(Inside(pIn[i], Edge, rWin)) // Save point P  
{
pOut[Cnt] = pIn[i];  
Cnt++;  
}
else // Save I  
{
}
FlagPrevPt = FALSE;  
pOut[Cnt] = Intersect(pPrev, pIn[i], Edge, rWin);  
Cnt++;  
}
else // Diem bat dau canh nam ngoai  
{
if(Inside(pIn[i], Edge, rWin)) // Save point I, P  
{
FlagPrevPt = TRUE;  
pOut[Cnt] = Intersect(pPrev, pIn[i], Edge, rWin);  
Cnt++;  
pOut[Cnt] = pIn[i];  
Cnt++;  
}
}
pPrev = pIn[i];  
}
// Neu Diem cuoi va dau giao voi bien cua cua so Save point I  
if(!(Inside(pIn[N], Edge, rWin) == Inside(pPrev, Edge, rWin)))  
{
pOut[Cnt] = Intersect(pPrev, pIn[N], Edge, rWin);  
Cnt++;  
}
pOut[Cnt] = pOut[0];  
} // Intersect  
void ClipPolygon(POINT *pIn, int N, POINT *pOut, int &Cnt,  
RECT rWin)  
{
POINT pTmp[20];  
_fmemcpy(pTmp, pIn, (N+1)*sizeof(POINT));  
ClipEdge(pTmp, N, pOut, Cnt, LEFT, rWin);  
N = Cnt;  
_fmemcpy(pTmp, pOut, (N+1)*sizeof(POINT));  
ClipEdge(pTmp, N, pOut, Cnt, RIGHT, rWin);  
N = Cnt;  
_fmemcpy(pTmp, pOut, (N+1)*sizeof(POINT));  
ClipEdge(pTmp, N, pOut, Cnt, TOP, rWin);  
N = Cnt;  
_fmemcpy(pTmp, pOut, (N+1)*sizeof(POINT));  
ClipEdge(pTmp, N, pOut, Cnt, BOTTOM, rWin);  
} // ClipPolygon  
Nhaän xeùt  
Thuaät toaùn Sutherland-Hodgeman cho keát quaû raát chính xaùc khi laøm vieäc vôùi  
caùc ña giaùc loài, tuy nhieân vôùi caùc ña giaùc loõm keát quaû hieån thò coù theå seõ  
coù ñoaïn thöøa nhö hình 4.11. Ñieàu naøy xaûy ra khi ña giaùc sau khi xeùn bò taùch  
thaønh hai hay nhieàu vuøng. Do chuùng ta chæ löu keát quaû xuaát trong moät danh  
saùch caùc ñænh neân ñænh cuoái cuûa danh saùch öùng vôùi ña giaùc tröôùc seõ noái  
vôùi ñænh ñaàu cuûa danh saùch öùng vôùi ña giaùc sau. Moät trong nhieàu caùch ñeå  
khaéc phuïc ñieåm naøy laø phaân ña giaùc loõm thaønh hai hay nhieàu ña giaùc loài vaø  
xöû lí moãi ña giaùc loài rieâng.  
TOÙM TAÉT  
Hieån thò ñoái töôïng laø quaù trình ñöa caùc moâ taû ñoái töôïng töø theá giôùi thöïc sang moät thieát bò xuaát cuï theå  
naøo ñoù. Quy trình naøy baét ñaàu baèng caùch ñònh nghóa töøng ñoái töôïng thaønh phaàn trong heä toïa ñoä cuïc boä  
vaø keát thuùc baèng vieäc chuyeån toaøn boä ñoái töôïng leân heä toïa ñoä thieát bò. Baèng caùch ñöa ra ñònh nghóa heä  
toïa ñoä quan saùt vaø caùc khaùi nieäm cöûa soå, vuøng quan saùt; moãi ñoái töôïng coù theå ñöôïc quan saùt ôû nhieàu vò trí  
vaø goùc ñoä khaùc nhau. Thoâng thöôøng moãi hình aûnh maø chuùng ta quan saùt ñöôïc treân maøn hình thieát bò ñöôïc  
goïi laø moät theå hieän (view) cuûa ñoái töôïng.  
Quaù trình aùnh xaï moät vuøng ñònh nghóa trong heä toïa ñoä theá giôùi thöïc vaøo moät vuøng trong heä toïa ñoä  
thieát bò ñöôïc goïi laø pheùp bieán ñoåi heä quan saùt. Ñaây thöïc chaát laø pheùp bieán ñoåi heä toïa ñoä. Quaù trình loaïi  
boû caùc phaàn hình aûnh naèm ngoaøi moät vuøng cho tröôùc ñöôïc goïi laø xeùn hình. Vuøng ñöôïc duøng ñeå xeùn hình  
goïi laø cöûa soå xeùn.  
Caùc thuaät toaùn xeùn ñoaïn thaúng Cohen-Sutherland, Liang-Barsky ñeàu taäp trung giaûi quyeát hai vaán ñeà  
chính nhaèm toái öu toác ñoä thuaät toaùn ñoù laø : loaïi boû vieäc tìm giao ñieåm ñoái vôùi caùc ñoaïn thaúng chaéc chaén  
khoâng caét cöûa soå (nhö naèm hoaøn toaøn trong, naèm hoaøn toaøn ngoaøi), vaø vôùi caùc ñoaïn coù khaû naêng caét  
cöûa soå, caàn phaûi tìm caùch haïn cheá soá laàn caàn tìm giao ñieåm vôùi caùc bieân khoâng caàn thieát. Thuaät toaùn  
Cohen-Sutherland giaûi quyeát hai yù naøy thoâng qua kieåu döõ lieäu maõ vuøng maø veà maët baûn chaát ñoù chæ laø söï  
moâ taû vò trí töông ñoái cuûa vuøng ñang xeùt so vôùi caùc bieân cuûa cöûa soå. Coøn thuaät toaùn Liang-Barsky thì tuy  
döïa vaøo phöông trình tham soá cuûa ñoaïn thaúng ñeå laäp luaän nhöng thöïc chaát laø döïa treân vieäc xeùt caùc giao  
ñieåm coù theå coù giöõa ñoaïn thaúng keùo daøi vôùi caùc bieân cuûa cöûa soå (cuõng ñöôïc keùo daøi). Caùc giao ñieåm  
naøy töông öùng vôùi caùc giaù trò rk qk / pk . Caû hai thuaät toaùn naøy ñeàu coù theå ñöôïc môû roäng cho vieäc xeùn  
hình trong ñoà hoïa ba chieàu.  
BAØI TAÄP  
1. Phaân tích caùc heä toïa ñoä duøng trong quy trình hieån thò ñoái töôïng hai chieàu.  
2. Vieát ñoaïn chöông trình minh hoïa quaù trình chuyeån ñoåi töø cöûa soå sang vuøng quan saùt.  
3. YÙ nghóa cuûa maõ vuøng trong thuaät toaùn Cohen-Sutherland.  
4. Haõy cho moät ñoaïn thaúng minh hoïa maø trong tröôøng hôïp naøy thuaät toaùn phaûi thöïc  
hieän vieäc tìm giao ñieåm 4 laàn theo thöù töï LEFT, TOP, RIGHT, BOTTOM.  
5. Caøi ñaët thuaät toaùn Cohen-Sutherland ñeå xeùn moät ña giaùc. Phaân tích caùc tröôøng hôïp  
thuaät toaùn naøy cho keát quaû laø caùc ñoaïn thaúng rôøi raïc.  
6. So saùnh hai thuaät toaùn Cohen-Sutherland vaø Liang-Barsky veà soá pheùp toaùn thöïc hieän  
trong caùc tröôøng hôïp chính.  
7. Caøi ñaët thuaät toaùn Liang-Barsky vaø so saùnh vôùi toác ñoä thuaät toaùn Cohen-Sutherland.  
8. Hieäu chænh caùc thuaät toaùn xeùn ñoaïn thaúng ñaõ hoïc ñeå coù theå xeùn ñoaïn thaúng vaøo cöûa  
soå hình chöõ nhaät nghieâng vôùi truïc hoaønh moät goùc  
.  
9. Trình baøy vaø caøi ñaët thuaät toaùn phaân moät ña giaùc loõm thaønh caùc ña giaùc loài.  
10. Döïa treân keát quaû cuûa baøi taäp treân, hieäu chænh thuaät toaùn Sutherland-Hodgeman ñeå  
xeùn caùc ña giaùc loõm ñöôïc chính xaùc.  
doc 20 trang Thùy Anh 27/04/2022 7820
Bạn đang xem tài liệu "Giáo trình Đồ họa máy tính - Chương 4, Phần 1: Hiển thị đối tượng hai chiều", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • docgiao_trinh_do_hoa_may_tinh_chuong_4_phan_1_hien_thi_doi_tuon.doc
  • htmChuong4.htm