Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 174 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
174
Dung lượng
1,17 MB
Nội dung
Đồ họa máy tính ˆ ´ -O D` HOA MAY T´ INH I ´ Pham Tiˆn So.n e -a D` Lat, 2005 Muc luc L`.i n´i d` u o o ¯ˆ a ´ e e C´c thuˆt to´n v˜ d `.ng cong trˆn thiˆt bi raster a a a e ¯u o ´ Thuˆt to´n sˆ gia a a o 11 ˙ Thuˆt to´n d iˆ’m gi˜.a a a ¯e u 13 1.1.3 ˙ ’ ´ Mˆt sˆ vˆ n d` liˆn quan dˆn thuˆt to´n v˜ d oan thˇng o o a ¯ˆ e ¯e a a e ¯ a ´ ´ e 18 1.1.4 ˙ ’ ’ C´c thuˆc t´ cua d oan thˇng a o ınh ˙ ¯ a 21 - o Du.`.ng tr`n o 22 1.2.1 -o u ˙ ´ Dˆi x´.ng t´m d iˆ’m a ¯e 22 1.2.2 ˙ Thuˆt to´n d iˆ’m gi˜.a v˜ d u.`.ng tr`n a a ¯e u e ¯ o o 23 - o Du.`.ng cong ellipse 28 1.3.1 ´ Ellipse c´ dang ch´ tˇc o ınh a 29 1.3.2 1.3 1.1.2 1.2 - ˙ ’ Doan thˇng a 1.1.1 1.1 ˙ Ellipse tru.`.ng ho.p tˆ’ng qu´t o a o 34 ˙ ’ a ¯u o a a H` hoc cu a c´c d `.ng cong v` mˇt cong ınh 2.1 ˙ ¯a ’ ˆ Mo d` u 47 47 - o Du.`.ng cong Bezier 48 2.2.1 Thuˆt to´n de Casteljau a a 48 2.2.2 Da th´.c Bernstein v` d u.`.ng cong Bezier u a ¯ o 52 ´ ’ C´c t´ chˆ t cua d u.`.ng cong Bezier a ınh a ˙ ¯ o 55 - ` ˙ Diˆu khiˆ’n d a phu.o.ng e e ¯i 59 u a a a Da th´.c t`.ng kh´c v` c´c h`m spline u u 60 2.4.1 ˙ ’ a a a a o Su dung c´c h`m spline nhu c´c h`m trˆn 63 2.4.2 Xˆy du.ng c´c h`m trˆn a a a o 65 2.4.3 - o ˙ ’ Du.`.ng cong spline v` c´c h`m co so a a a 66 2.4.4 ˙ ’ C´c h`m B-spline co so a a 66 2.4.5 ˙ ’ Su dung c´c knot bˆi a o 71 2.4.6 ˙ Vector knot chuˆ’n a 73 2.5 ´ ’ C´c t´ chˆ t cua d u.`.ng cong B-spline a ınh a ˙ ¯ o 75 2.6 ˙ ˙ a Nˆi suy c´c d iˆ’m d iˆu khiˆ’n bˇ ng d u.`.ng cong B-spline o a ¯ e ¯` e e ` ¯ o 77 2.7 ´ ´ Thiˆt kˆ c´c mˇt Bezier v` B-spline e e a a a 80 2.7.1 Patch Bezier 80 2.7.2 D´n c´c patch Bezier a a 81 2.7.3 Patch spline 82 2.2 2.3 2.3.1 2.4 ´ ˙ ’ a ¯ˆ Giao cu a c´c d oi tu.o.ng 83 3.1 ˙ ¯a ’ ˆ Mo d` u 83 3.2 ˙ ’ ˙ ’ Giao cua hai d oan thˇng ¯ a 83 3.2.1 84 Phˆn t´ a ıch ˙ ’ Thuˆt to´n x´c d inh giao hai d oan thˇng a a a ¯ ¯ a 86 - ˙ ’ Doan thˇng v` h` ch˜ nhˆt a a ınh u a 87 3.3.1 ` ˙ e a ’ T` giao bˇ ng c´ch giai hˆ c´c phu.o.ng tr` ım a a ınh 89 3.3.2 Thuˆt to´n chia nhi phˆn a a a 89 3.3.3 Thuˆt to´n Cohen-Sutherland a a 93 3.3.4 Thuˆt to´n Liang-Barsky a a 97 3.2.2 3.3 3.4 ˙ ’ ˙ ¯ ’ Giao cua d oan thˇng v` d a gi´c lˆi 100 a a ¯ a ` o 3.4.1 3.4.2 3.5 ˙ ˙ ’ ´ ’ Vi tr´ tu.o.ng d ˆi cua mˆt d iˆ’m v´.i d u.`.ng thˇng 100 ¯o ˙ o ¯e o ¯ o a ı ˙ ’ ˙ ¯ ’ Thuˆt to´n t` giao cua d oan thˇng v` d a gi´c lˆi 102 a a ım a a ¯ a ` o Giao hai d a gi´c 107 ¯ a 3.5.1 3.5.2 Thuˆt to´n Weiler-Atherton 111 a a 3.5.3 3.6 Thuˆt to´n Sutherland-Hodgman 108 a a C´c ph´p to´n tˆp ho.p trˆn c´c d a gi´c 113 a e a a e a ¯ a ` ` ˙ ’ Ray tracing hai chiˆu: phan xa buˆng k´ 114 e o ın 3.6.1 ˙ ’ Vector phan xa 115 3.6.2 ˙ ’ ˙ ’ Giao cua tia s´ng v` d u.`.ng thˇng a a ¯ o a 3.6.3 ˙ ’ Giao cua tia s´ng v´.i d u.`.ng tr`n 121 a o ¯ o o 3.6.4 Xˆy du.ng v´ du ray tracing 124 a ı 3.6.5 ` Buˆng k´ l` ellipse 126 o ın a Tˆ m`u v` ng o a u 4.1 117 127 C´c d inh ngh˜ 127 a ¯ ıa 4.1.1 ’ V`ng d inh ngh˜ bo.i pixel 127 u ¯ ıa ˙ 4.1.2 ’ V`ng d inh ngh˜ bo.i d a gi´c 129 u ¯ ıa ˙ ¯ a 4.2 ´ a Thuˆt to´n tˆ m`u theo vˆt dˆu loang 129 a a o a e ` 4.3 Thuˆt to´n tˆ m`u theo chay 131 a a o a 4.4 Thuˆt to´n tˆ m`u theo biˆn 134 a a o a e 4.5 So s´nh c´c thuˆt to´n 144 a a a a 4.6 Tˆ m`u c´c h` ch˜ nhˆt 145 o a a ınh u a 4.7 Thuˆt to´n tˆ m`u d a gi´c 147 a a o a ¯ a 4.7.1 4.7.2 ˙ ’ C´c manh vun a 4.7.3 ´ Liˆn kˆt canh v` thuˆt to´n tr`n 151 e e a a a a 4.7.4 4.8 C´c d`ng qu´t ngang 150 a o e ` Tˆ m`u c´c d a gi´c chˆng 158 o a a ¯ a o 151 ˜ Tˆ m`u theo mˆ u tˆ 161 o a a o ` Phˆn phu luc: Thu viˆn graph2D.h a e 163 ˙ ’ T`i liˆu tham kha o a e 171 L`.i n´i d` u o o ¯ˆ a -ˆ ´ ˜ ’ ˙ ’ D` hoa m´y t´ l` mˆt l˜ vu.c hˆ p dˆ n cua khoa hoc m´y t´ o a ınh a o ınh a a ˙ a ınh Ch´ng ta su dung d` hoa u ¯ˆ o ˙ ` ınh ` o o a o e a o m´y t´ nhu mˆt cˆng cu dˆ’ quan s´t thˆng tin nhiˆu l˜ vu.c kh´c nhau, bao gˆm a ınh ¯e o.ng tr` d` hoa tu.o.ng t´c ´ ’ khoa hoc v` cˆng nghˆ, ho´ hoc, kiˆn tr´c v` giai tr´ C´c chu e a e u a ˙ ı a ınh ¯o ˆ a a o ´ ´ ’ ’ cho ph´p ngu.`.i su dung l`m viˆc theo c´ch tu nhiˆn nhˆ t: ngu.`.i su dung cung cˆ p thˆng e o ˙ a e a e a o ˙ a o ng dung thˆng qua c´c hoat d ong bˆn ngo`i cua ho v` s˜ nhˆn d u.o.c thˆng ’ tin cho tr` u ınh ´ o a e a ˙ o ¯ˆ a e a ¯ -ˆ ˙ e ˙ ` ’ ’ tin tro lai bˇ ng h` anh D` hoa m´y t´ d ang gi´p ngu.`.i thay d ˆ’i vˆ quan niˆm v` a ınh ˙ o a ınh ¯ u o ¯o ` e a c su dung m´y t´ c´ch th´ ˙ a u ’ a ınh ´ ˙ ’ ˙ ¯ˆ ’ o Gi´o tr` D` hoa m´y t´ I cung cˆ p mˆt sˆ k˜ thuˆt co ban cua d` hoa m´y t´ a ınh - ˆ o a ınh a o o y a a ınh ´ o.c s˜ d u.o.c -ˆ ˙ e ¯ ` ` ` ´ hai chiˆu (D` hoa m´y t´ ba chiˆu, mˆt phˆn quan khˆng thˆ’ thiˆu d u e ¯ e o a ınh e o a o e -e o o ˙ ´ e u ˙ ’ d` cˆp mˆt gi´o tr` kh´c) Dˆ’ c´ mˆt khung canh to`n diˆn v` sˆu sˇc vˆ nh˜.ng ¯ˆ a e o a ınh a a e a a a ` c h`nh cua d` hoa m´y t´ ˜ ˙ ¯ˆ ’ o nguyˆn l´ v` thu a e y a a ınh, xem c´c t`i liˆu dˆn [9] v` [11] C´c phu.o.ng a a e a a a ˙ ´ ´ ´ ph´p phˆn t´ v` thiˆt kˆ c´c thuˆt to´n gi´o tr` cho ph´p sinh viˆn c´ thˆ’ viˆt a a ıch a e e a a a a ınh e e o e e ˜ a ´ ınh a ınh ¯ e a ¯o a dˆ d`ng c´c chu.o.ng tr` minh hoa Gi´o tr` d u.o.c biˆn soan cho c´c d ˆi tu.o.ng l` sinh e a viˆn To´n-Tin v` Tin hoc e a a ˙ ˙ e ˙ ˙ ’ o u Gi´o tr` su dung ngˆn ng˜ C dˆ’ minh hoa, nhiˆn c´ thˆ’ dˆ d`ng chuyˆ’n d o’i a ınh ˙ ¯e e o e ˜ a e ¯ˆ sang c´c ngˆn ng˜ kh´c; v` d o, sinh viˆn cˆn c´ mˆt sˆ kiˆn th´.c vˆ ngˆn ng˜ C Ngo`i a o u a a ¯´ e ` o o o e a u ` o e u a ´ ´ o.ng tr` thao t´c trˆn cˆ u tr´c d˜ liˆu nhu danh s´ch liˆn kˆt, nˆn d oi ´ ´ e ¯` ` ´ ınh a e a u u e a e e ra, hˆu hˆt c´c chu a e a ´ ˙ ’ ˙ o u ’ hoi sinh viˆn phai c´ nh˜.ng k˜ nˇng lˆp tr` tˆt e y a a ınh o ˙ ` o ´ e ´ ˙ a ˙ ’ ’ Sinh viˆn c˜ng cˆn c´ co so to´n hoc cua nh˜.ng nˇm d` u d hoc: hiˆ’u biˆt vˆ d sˆ e u a u a ¯ˆ ¯ a e e ` ¯ o ´ ˙ ıch, e ınh ’ tuyˆn t´ v` h` hoc giai t´ ph´p t´ vi t´ phˆn e ınh a ınh ıch a ´ ’ ’ Muc d´ cua gi´o tr` l`, o m´.c d o n`o d ´, cho thˆ y c´c tr` u.ng dung d` hoa a ınh a ˙ u ¯ˆ a ¯o a a ınh ´ ¯ˆ o ¯ıch ˙ o.c tao nhu thˆ n`o: Ch´ng ta cˆn viˆt v` chay thu c´c chu.o.ng tr` ´ ` ´ ˙ a ’ du ¯ e a u a e a ınh Mˆt o ng muc d´ ch´ cua gi´o tr` l` gi´p sinh viˆn nˇm v˜.ng c´c phu.o.ng ph´p, tru.´.c ´ ˙ ’ nh˜ u a ınh a u e a u a a o ¯ıch ınh o.ng ˙ ’ ´ hˆt to´n hoc ho´ c´c kh´c niˆm h` hoc v` sau d ´ chuyˆ’n tai th`nh c´c d oan m˜ chu e a a a a e ınh a ¯o e ˙ a a ¯ a tr` ınh ` ´ ` Gi´o tr` bao gˆm bˆn chu.o.ng v` mˆt phˆn phu luc v´.i nh˜.ng nˆi dung ch´ nhu a ınh o o a o a u o ınh o sau: ´ e ´ ˙ ¯o ’ ˆ • Chu.o.ng th´ nhˆ t d` cˆp dˆn c´c phu.o.ng ph´p v˜ c´c “nguyˆn so.” cua d` hoa m´y u a ¯ˆ a ¯e a a e a e a ˙ ’ t´ ınh: d oan thˇng, d u.`.ng tr`n v` ellipse ¯ a ¯ o o a ´ ´ a ` ´ ’ • Phˆn t´ v` thiˆt kˆ bˇ ng h` hoc l` nˆi dung ch´ cua Chu.o.ng Hˆu hˆt c´c a ıch a e e ` ınh a o ınh ˙ a e a ng ch´.c nˇng tao c´c d u.`.ng cong du.a trˆn c´c d iˆ’m ˙ ` ` ¯ˆ ¯ˆ o u phˆn mˆm d` hoa d` u c´ nh˜ a e o e u a a ¯ o e a ¯e ´ ´ ’ m` ngu.`.i su dung lu.a chon Chu.o.ng n`y cung cˆ p nh˜.ng nguyˆn l´ v` c´ch tiˆp cˆn a o ˙ a a u e y a a e a c h`nh m` c´c tr` u.ng dung d` hoa ´p dung thu a a a ınh ´ ¯o a ˆ ´ ˙ ’ ˙ ’ • Chu.o.ng giai quyˆt b`i to´n x´c d inh giao cua nh˜.ng nguyˆn so d` hoa: Giao hai e a a a ¯ u e ¯ˆ o ˙ ’ ˙ ’ ˙ ¯ ’ d oan thˇng, giao cua d oan thˇng v` d a gi´c lˆi (bao h`m c´c h` ch˜ nhˆt) v` giao ¯ a a a ¯ a ` o a a ınh u a a o.ng l` mˆt v´ du cua k˜ thuˆt “ray tracing” hai chiˆu: ´ ` ˙ ’ ’ y cua hai d a gi´c Cuˆi chu ¯ a o a o ı ˙ a e ˙ ` ˙ ’ Chuyˆ’n d ong cua tia s´ng buˆng k´ c´ ch´.a c´c “chu.´.ng ngai vˆt” e ¯ˆ a o ın o u a o a ´ ´ ’ • Chu.o.ng d` cˆp dˆn nh˜.ng thuˆt to´n tˆ m`u v`ng bˆ t k`: V`ng d inh ngh˜ bo.i ¯ˆ a ¯e e u a a o a u a y u ¯ ıa ˙ i d u.`.ng biˆn v` v`ng l` d a gi´c ` ˙ ’ phˆn trong, bo ¯ o a e a u a ¯ a ` ´ ´ a • Phˆn phu luc l` thu viˆn c´c cˆ u tr´c d˜ liˆu v` c´c h`m cˆn thiˆt v` thu.`.ng xuyˆn e a a u u e a a a ` a e a o e a ˙ ’ a ınh su dung gi´o tr` ` ` ´ ’ Trong lˆn xuˆ t ban th´ hai n`y, ch´ng tˆi d u.a thˆm c´c v´ du t´ to´n nhˇ m minh a a ˙ u a u o ¯ e a ı ınh a a gi´p sinh viˆn nˇm v˜.ng kiˆn th´.c d ˜ hoc Ngo`i ra, c´c ´ ` y ´ ´ hoa cho phˆn l´ thuyˆt c˜ng nhu u a e u e a u e u ¯a a a ˜ ´ ’ a ˙ ’ ˙ a ’ ˜ lˆi xuˆ t ban lˆn tru.´.c c˜ng d a d u.o.c chınh l´; mˇc d` vˆy, t´c gia vˆn mong c´ nh˜.ng o a ˙ ` o u ¯˜ ¯ y a u a a o u ban d oc d ´ng g´p t` ¯ ¯o o u ˙ ` ˙ ’ Tˆi xin cam o.n nh˜.ng gi´p d o d ˜ nhˆn d u.o.c t` nhiˆu ngu.`.i m` khˆng thˆ’ liˆt kˆ o u u ¯˜ ¯a a ¯ u e o a o e e e ´ hˆt, d ac biˆt l` c´c ban sinh viˆn, qu´ tr` biˆn soan gi´o tr` n`y e ¯ˇ e a a e a ınh e a ınh a -a D` Lat, ng`y 10 th´ng nˇm 2005 a a a ´ PHAM Tiˆn So.n e Chu.o.ng C´c thuˆt to´n v˜ d `.ng cong trˆn a a a e ¯u o e ´ thiˆt bi raster e ˙ ’ Chu.o.ng n`y tr` b`y c´c thuˆt to´n v˜ d oan thˇng, d u.`.ng tr`n v` ellipse trˆn lattice a ınh a a a a e ¯ a ¯ o o a e ng sˆ nguyˆn v` c´c v`ng lˇp chı su ´ ˙ ’ ˙ ˙ ’ ’ nguyˆn Z C´c thuˆt to´n chı thao t´c trˆn nh˜ e a a a a e u o e a a o a ´ e ˙ ’ dung ph´p to´n cˆng nˆn rˆ t hiˆu qua e a o e a 1.1 - ˙ ’ Doan thˇ ng a ˙ ’ ` ˙ ’ Thuˆt to´n v˜ d oan thˇng x´c d nh toa d o cua c´c pixel nˇ m trˆn hoˇc gˆn v´.i d oan thˇng a a e¯ a a ¯i a e a ` o ¯ a ¯ˆ ˙ a ’ a ´ ˙ ’ ´ ´ ` ´ ` o ¯ ´ thu.c tˆ nhˆ t Vˆ nguyˆn tˇc, ch´ng ta muˆn chon d˜y c´c pixel gˆn v´.i d oan thˇng thu.c tˆ e e a u o a a e a a a e c tˆ d u.o.c xˆ p xı v´.i mˆt d o mˆt pixel; ta cˆn c´ ˙ ’ ˙ ’ ´ ´ ´ ’ ` o nhˆ t v` thˇng nhˆ t X´t d oan thˇng thu e ¯ a ˙ o a a a a e ¯ a a ¯ˆ o a ´ ˙ ’ ´ nh˜.ng t´ chˆ t g` V´.i c´c d oan thˇng c´ hˆ sˆ g´c thuˆc d oan [−1, 1], c´ d ung mˆt pixel u ınh a ı? o a ¯ a o e o o o ¯ o ¯´ o ´ o.c v˜ lˆn trˆn mˆ i cˆt; v´.i c´c d oan thˇng m` hˆ sˆ g´c nˇ m ngo`i d oan n`y, c´ d ung ˜ ˙ ’ ´ du e e ¯ e o o o a ¯ a a e o o ` a a ¯ a o ¯´ ˜ ˙ ’ ´ ’ mˆt pixel d u.o.c v˜ trˆn mˆ i h`ng Tˆ t ca c´c d oan thˇng d u.o.c v˜ v´.i c`ng mˆt d o s´ng, o ¯ e e o a a ˙ a ¯ a ¯ e o u o ¯ˆ a ´.ng, v` nhanh nhˆ t c´ thˆ’ d u.o.c Thuˆt to´n v˜ d oan ˙ ´ a a e ¯ khˆng phu thuˆc v`o d ˆ d`i v` hu o o o a ¯o a a a a o e ¯ d ˆ rˆng, kiˆ’u v˜ Thˆm ch´ ˙ ˙ ’ ˙ ’ ` ´ ’ thˇng c˜ng cˆn ch´ y dˆn c´c thuˆc t´ cua d oan thˇng nhu ¯o o a u a u ´ ¯e a o ınh ˙ ¯ a e e a ı c tiˆ’u ho´ m´.c d o rˇng cu.a tiˆn tr` r`.i rac ho´ d u.`.ng thˇng thu.c ˙ ˙ ’ ´ ´ a u ¯ˆ a ch´ng ta muˆn cu e u o e ınh o a ¯ o a su dung k˜ thuˆt antialiasing (xem [9], [11]) bˇ ng c´ch ´p dung kha nˇng d ˇt cu.`.ng ` ´ ˙ a ¯a ’ tˆ nh` ˙ e o ’ y a a a a o o.ng u.ng nhiˆu bit ˙ ˜ ´ ` d ˆ cua mˆ i pixel trˆn c´c thiˆt bi hiˆ’n thi m` mˆt pixel tu ¯o ˙ o e a e e ´ e ’ a o ˙ ’ ´ ´ ˙ ¯ˆ a ¯e a ¯ ’ e o e u a ¯ˆ o o a o ¯´ o Tru.´.c hˆt ch´ng ta chı d` cˆp dˆn c´c d oan thˇng d o rˆng mˆt pixel v` c´ d ung mˆt i c´c d oan thˇng dˆc) Phˆn cuˆi chu.o.ng s˜ d` cˆp ˜i cˆt (hoˇc h`ng d ˆi v´ a ¯ ˙ ’ ´ o ´ ` ´ pixel trˆn mˆ o e o a a ¯o a o a o e ¯ˆ a e ´ ´ a ˙ e a ¯ ’ ˙ ’ d ˆ u.u tiˆn cao ho.n s˜ d u.o.c tˆ phu lˆn c´c d a gi´c c´ d ˆ u.u tiˆn thˆ p ho.n Gia thiˆt rˇ ng ¯o e e ¯ o a o ¯o e a e ` ng dung d ˜ cho tru.´.c c´c d o u.u tiˆn kh´c v´.i mˆ i d a gi´c2 ˜ ¯a o a ¯ˆ e a o o ¯ a tr` u ınh ´ ˙ y a a ’ ˙ ’ Tru.´.c v˜ h` o e ınh, c´c d a gi´c d a qua bu.´.c tiˆn xu l´ v` c´c canh cua ch´ng d u.o.c a ¯ a ¯˜ o ` e u ¯ ˙ ` ’ lu.u c`ng mˆt bang c´c canh t´ cu.c ET Kiˆ’u d˜ liˆu Edge Info phˆn tru.´.c u o ˙ a ıch e u e a o o.c mo rˆng dˆ’ bao h`m thˆm hai tru.`.ng m`u v` d ˆ u.u tiˆn cua d a gi´c: ˙ ˙ o ¯e ’ ’ du ¯ a e o a a ¯o e ˙ ¯ a typedef struct EdgeNode2D *EdgePtr2D struct EdgePtr2D { int y_upper; float x_int; float Recip_Slope; int Priority; int Color; EdgePtr2D Next; }; ` H` 4.11 minh hoa ba d a gi´c chˆng nhau: A, B v` C v´.i m`u v` d o u.u tiˆn tu.o.ng ınh ¯ a o a o a a ¯ˆ e ’ u.ng l` (GRAY, 6), (WHITE, 3) v` (BLUE, 2) Danh s´ch d˜ liˆu cua d`ng qu´t y = c lu.u ´ a a a u e ˙ o e ng canh c´ giao v´.i d`ng qu´t y = c v` d a ˙ ’ AEL Danh s´ch n`y gˆm thˆng tin cua nh˜ a a ` o o u o o o e a ¯˜ ˙ ´ ´ ` d u.o.c sˇp xˆp theo ho`nh d ˆ tˇng dˆn: x1 ≤ x2 ≤ ≤ x8 C´c mˆ’u tin AEL tu.o.ng ¯ a e a ¯o a a a a -e ¯ ˙ ˙ ˙ ¯ ’ ˙ ’ u.ng mˆt giao d iˆ’m v` ch´.a m`u v` d o u.u tiˆn cua d a gi´c c´ canh giao (Dˆ’ d o.n gian, ´ o ¯e a u a a ¯ˆ e a o ˙ ` ˙ ’ ˙ ’ ch´ng ta bo qua c´c th`nh phˆn yupper v` 1/m) Ngo`i ra, mang Covers[] c´ kiˆ’u Boolean u a a a a a o e ˙ ˜ ´ ` ˙ ’ ˙ y e ’ ’ ’ ˙ ’ ¯e ınh o a ¯´ o a ˙ ˙ ´ d u.o.c su dung dˆ’ quan l´ tiˆn tr` tˆ m`u, d o mˆ i phˆn tu cua mang tu.o.ng u.ng ¯ ´ ˙ ’ ˙ ’ v´.i mˆt d a gi´c Khi x´t d`ng qu´t y = c, mang n`y cho biˆt thˆng tin cua nh˜.ng d a gi´c o o ¯ a e o e a e o u ¯ a a pixel hiˆn h`nh: Chˇng han, Covers[A] bˇ ng True nˆu ho`nh d o x thuˆc d a gi´c A v` ˙ ’ ` ´ ch´ u e a a a e a ¯ˆ o ¯ a a ` ´ ´ ´ ´ bˇ ng False nˆu ngu.o.c lai Biˆn N umCovers cho biˆt sˆ c´c d a gi´c ch´.a pixel hiˆn h`nh a e e e o a ¯ a u e a u tiˆn cao nhˆ t ch´.a pixel hiˆn h`nh ´ ´ ˙ ¯e ¯ ’ ´ v` biˆn V isP oly chı dˆn d a gi´c c´ d ˆ u a e a o ¯o e a u e a ˙ ’ Ch´ng ta tr` b`y thuˆt to´n thˆng qua v´ du n`y V´.i d`ng qu´t y = c, kho.i tao u ınh a a a o ı a o o e cua mang Covers[] d u.o.c g´n bˇ ng False T` phˆn ` ` ’ ˙ ’ x = 0, N umCovers = v` c´c phˆn tu ˙ a a a ˙ ’ u ` ¯ a a a ˙ ¯ˆ ’ a ˙ o ’ tu d` u tiˆn AEL, ta c´ ho`nh d ˆ giao cua d`ng qu´t y = c v´.i d a gi´c n`o d o Doan e o a ¯o e o ¯ a a ¯´ - ` [0, x1 ] d u.o.c tˆ bˇ ng m`u nˆn V` d`ng qu´t d i v`o d a gi´c B tai x = x1 nˆn Covers[B] g´n ¯ o a a ` e ı o e ¯ a ¯ a e a ` ` ˙ ¯e ¯ ’ ´ ˙ ’ ˙ ¯ ’ bˇ ng True, N umCovers bˇ ng 1, v` V isP oly chı dˆn d a gi´c B Su dung m`u cua d a gi´c a a a a a a ˙ ’ ´ ˙ ¯ ’ Trong mˆt sˆ tru.`.ng ho.p, d ˆ u.u tiˆn cua d a gi´c d u.o.c x´c d nh tu d ˆng Nˆu, chˇng han c´c d a gi´c o o o e a ¯ a ¯i e a a ´ ¯o ¯o a ¯ u tiˆn d u.o.c d ˇt tu.o.ng th´ v´.i khoang ´ ˙ a ¯ ` ˙ ’ ’ e ¯ ¯a ıch o l` h` chiˆu cua c´c d a gi´c khˆng gian ba chiˆu th` d ˆ u a ınh e a o e ı ¯o vi tr´ mˇt quan s´t dˆn ch´ng-xem [11] ´ ´ c´ch t` ı a a u a ¯e u 159 y (C) y=c (B) (A) | | | | | | x2 x3x4 x1 | | x5 x6 x7 x x8 ˙ ’ Con tro AEL • x1 NULL • x8 cB • x2 cA • x7 cA • x3 cC • x6 cB • x4 cA cA = GRAY, cB = WHITE, cC = BLUE ` H` 4.11: Tˆ m`u c´c d a gi´c chˆng ınh o a a ¯ a o 160 • x5 cC • cA ˙ ˙ ´ ´ ´ ´ B (l` WHITE) dˆ’ tˆ d oan t` x1 dˆn giao d iˆ’m kˆ tiˆp AEL Ta thˆ y tai x2 , d`ng a ¯e o ¯ u ¯e ¯e e e a o ` qu´t d i v`o d a gi´c A nˆn Covers[A] g´n bˇ ng True, N umCovers bˇ ng Do d a gi´c A e ¯ a ¯ a e a ` a a ¯ a u tiˆn cao ho.n cua B nˆn ta thay d ˆ’i m`u v˜ l` GRAY (cua d a gi´c A) v` tˇt m`u ˙ ´ ˙ ’ ˙ ¯ ’ e e ¯o a e a a a a a c´ d ˆ u o ¯o ` ´ ˙ ’ ˙ ¯ ’ cua B V` vˆy d oan [x1 , x2 ] s˜ d u.o.c tˆ bˇ ng m`u cua d a gi´c B X´t tiˆp danh s´ch AEL, ı a ¯ e ¯ o a a a e e a ˙ ` ˙ ’ ta c´ giao d iˆ’m x3 thuˆc d a gi´c B v` Covers[B] bˇ ng True nˆn d iˆu n`y chı tai x3 o ¯e o ¯ a a a e ¯` e a ˙ ˙ ˙ ¯ ’ ta khoi d a gi´c B Cˆp nhˆt Covers[B] v` N umCovers Giao d iˆ’m x4 l` d iˆ’m d i v`o a a a a ¯e a ¯e ¯ a ´ ´ ˙ ’ o a ˙ ˙ ’ ’ d a gi´c C nhu.ng d ˆ u.u tiˆn cua n´ thˆ p ho.n d ˆ u.u tiˆn d u.o.c tro bo.i biˆn V isP oly (l` ¯ a ¯o e ¯o e ¯ e a ˙ ˙ ´ ´ ˙ a ’ A) nˆn chı cˆp nhˆt Covers[C] v` N umCovers v` tiˆp tuc Giao d iˆ’m x5 d ´nh dˆ u d iˆ’m e a a a e ¯e ¯a a ¯e ˙ ¯ ’ ˙ ’ cua d a gi´c A Do d o thu.c hiˆn tˆ m`u d oan [x2 , x5 ] v´.i m`u cua A sau d o cˆp nhˆt a ¯´ e o a ¯ o a ¯´ a a ´ ˙ y ’ ˙ dˆn d a gi´c C) Ban d oc xu l´ tu.o.ng tu v´.i ’ ¯e ¯ lai Covers[A], N umCovers v` V isP oly (tro a a o ¯ .ng phˆn c`n lai cua d`ng qu´t ` o ˙ o ’ nh˜ u a e ´ a a a o o a a N´i chung, thuˆt to´n xuˆ t ph´t t` d` u danh s´ch AEL v` thˆng qua mˆt d˜y c´c o a a a a u ¯ˆ ˙ ˙ ´ ˙ ’ giao d iˆ’m dˆ’ cˆp nhˆt mang Covers[] v` biˆn N umCovers Khi d a gi´c c´ d o u.u tiˆn l´.n ¯ e ¯e a a a e ¯ a o ¯ˆ e o ´ ˙ ¯ ’ ˙ ˙ ’ ’ ¯ˆ e a e o a a ¯ˇ e ho.n d o u.u tiˆn cua d a gi´c tro bo.i V isP oly, thu.c hiˆn tˆ m`u v` d at lai biˆn V isP oly ˙ ˙ ¯ ’ ˙ e ’ ´ ˙ ’ Khi d i khoi d a gi´c kha kiˆn hiˆn h`nh, d`ng mang Covers[] dˆ’ x´c d nh d a gi´c c´ d ˆ ¯ a e a u ¯e a ¯i ¯ a o ¯o u tiˆn cao nhˆ t phu pixel hiˆn h`nh; d oan hiˆn h`nh d u.o.c tˆ m`u (v´.i m`u n`o?); v` cˆp ´ ˙ ’ u e a e a ¯ e a ¯ o a o a a a a nhˆt lai N umCovers v` Covers[] a a 4.8 ˜ Tˆ m`u theo mˆu tˆ o a a o ` ’ Trong nh˜.ng phˆn tru.´.c, ch´ng ta tˆ m`u bˆn v`ng d inh ngh˜ bo.i c´c nguyˆn so u e a o u o a e u ¯ ıa ˙ a ` ˙ ’ v´.i c´c m`u d ac (t´.c c´c pixel v`ng c´ c`ng m`u) bˇ ng c´ch goi thu tuc putpixel() o a a ¯ˇ u a u o u a a a i gi´ tri m`u v˜ l` V alue Du.´.i d ay ch´ng ta khao s´t tˆ m`u v´.i mˆ u tˆ cho tru.´.c bˇ ng ˜ ˙ a o a o a o ’ v´ a a e a o o ¯ˆ u o ` a ˙ ˆ c´ch thˆm c´c d`ng lˆnh d iˆu khiˆ’n c´c thuˆt to´n tˆ m`u V´.i c´c hˆ thˆng d` hoa a e a o e ¯` e e a a a o a o a e o ¯o ´ o.c lˆ y mˆt c´ch th´ ˙ ` ´ ´ c´ nhiˆu bit trˆn mˆt pixel, tiˆn tr` d iˆu khiˆ’n d at gi´ tri m`u d u a o e e o e ınh ¯ ` e e ¯ˇ a a ¯ o a ıch ˙ a ˙ ´ ˜ ˙ ’ ˜ ˜ ho.p mˆ u tˆ Tu.o.ng tu nhu kiˆ’u d´ng d oan thˇng, dˆ’ viˆt c´c mˆ u tˆ bitmap dˆ a o e ¯ a ¯e e a a o e i m`u nˆ’i tu.o.ng u.ng pixel c´ gi´ tri mˆt mˆ u ˙ ˜ ˙ ’ d`ng, ch´ng ta goi thu tuc putpixel() v´ a o a u o ´ o a o a ˜ ´ ´ ˙ a e ’ v` khˆng goi thu tuc n`y nˆu pixel c´ gi´ tri Mˇt kh´c, nˆu mˆ u bitmap d u.o.c ´p dung a o o a a a e a ¯ a `.ng khˆng suˆt, ta chon v` tu.o.ng u.ng m`u nˆ’i v` m`u nˆn ˙ a a ` ´ mˆi tru o o o o a ´ a o e ˜ ˜ ´ e ´ ’ Vˆ n d` ch´ tˆ m`u theo mˆ u l` t` mˆi tu.o.ng quan gi˜.a vi tr´ cua mˆ u v` a ¯ˆ ınh o a a a ım o u ı ˙ a a N´i c´ch kh´c, ta cˆn x´c d inh vi tr´ cua mˆ u d u.o.c “neo” dˆ’ biˆt pixel n`o ˙ ´ ˜ ` ’ ¯e e a nguyˆn so e o a a a a ¯ a ¯ ı ˙ o.ng u.ng v´.i pixel hiˆn h`nh nguyˆn so ˜ mˆ u s˜ tu a e ´ o e a e ˜ ´ ˙ ’ Phu.o.ng ph´p th´ nhˆ t l` neo mˆ u tai mˆt d ınh cua mˆt d a gi´c bˇ ng c´ch d at pixel a u a a a o ¯˙ o ¯ a ` a a ¯ˇ ’ 161 ˙ ˜ ˜ ´ ´ e ˙ ’ bˆn tr´i nhˆ t xuˆ t hiˆn h`ng d` u tiˆn cua mˆu Diˆu n`y cho ph´p mˆ u di chuyˆ’n e a a a a ¯ˆ a e a - ` e a e a e tao mˆt hiˆu u.ng tru.c quan v´.i nh˜.ng mˆ u c´ cˆ u tr´c h` hoc ˜ ´ o e ´ u a o a u ınh theo c´c nguyˆn so a e o c´c d u.`.ng khˇc ch´o song song thu.`.ng d u.o.c su dung c´c u.ng dung thiˆt kˆ V` ´ ´ ´ ’ nhu a ¯ o a e o ¯ ˙ a ´ e e ı ˙ ˜ khˆng c´ su phˆn biˆt gi˜.a c´c d iˆ’m trˆn d a gi´c v´.i nh˜.ng mˆ u n`y c˜ng nhu trˆn c´c o o a e u a ¯e e ¯ a o u a a u e a x´c d inh bo.i c´c d u.`.ng biˆn tro.n nhu d u.`.ng tr`n v` ellipse Do d o ngu.`.i lˆp ˙ a ¯ o ’ nguyˆn so a ¯ e e ¯ o o a ¯´ o a ˙ ` ` ` n x´c d inh d iˆ’m neo nˇ m trˆn hoˇc nˇ m nguyˆn so Trong mˆt v`i hˆ thˆng, ´ tr` cˆ a ¯ ¯ e ınh a a e a a e o a e o ˙ ˙ ’ d iˆ’m neo c´ thˆ’ cua mˆt nh´m c´c nguyˆn so ¯e o e ˙ o o a e ˜ Trong phu.o.ng ph´p th´ hai, ta xem to`n bˆ m`n h` d u.o.c l´t v´.i mˆ u tˆ v` coi a u a o a ınh ¯ a o a o a ˜ ` o o ¯ o e a u ¯ o o u ¯ˇ e a nguyˆn so gˆm mˆt d u.`.ng biˆn hoˇc v`ng d u.o.c tˆ v´.i nh˜.ng bit d ac tru.ng cho ph´p mˆ u e ˙ ´ ´ ˙ ’ ˙ ’ tˆ bˇng qua Vi tr´ chuˆ’n cua mˆt neo tuyˆt d oi l` gˆc m`n h` o a a o e ¯ˆ a o a ınh C´c pixel cua nguyˆn a e ı sau d ´ d u.o.c xu l´ bˇ ng c´ch AND gi´ tri v´.i mˆ u tˆ Theo c´ch n`y, mˆ u tˆ khˆng ˜ ˜ ˙ y ` ’ so ¯o ¯ a a a o a o a a a o o ˙ ´ d u.o.c “gˇn d´ ¯ a ınh” v´.i nguyˆn so nguyˆn so ho.i di chuyˆ’n Thay v`o d o, nguyˆn so di o e e e a ¯´ e thˆ’ n´ d u.o.c d at trˆn mˆt nˆn v´.i mˆu cˆ d inh, v` d o h` dang cua n´ c´ ˙ ˙ ˜ ´ ˙ o o ’ chuyˆ’n nhu e o ¯ ¯ˇ e e o ` a ¯´ ınh e o a o ¯ ˙ ˙ ˙ ˜ ´ ’ a ınh ıt o a u ınh o ˙ thˆ’ bi thay d ˆ’i di chuyˆ’n; v´.i c´c mˆ u ch´ quy ´ c´ cˆ u tr´c h` hoc ngu.`.i su dung e ¯o e o a o.ng n`y Dˆ’ t´ to´n hiˆu qua, neo tuyˆt d oi cho ph´p ˙ ´ ’ ’ ˙ ’ thˆm ch´ khˆng nhˆn thˆ y anh hu ˙ a ı o a a ˙ a - e ınh a e e ¯ˆ e ´ ´ ˙ e ’ c´c nguyˆn so phu lˆn v` tiˆp gi´p kh´.p v´.i a e a e a o o -ea ˙ ˜ ˙ o ¯ˆ ’ ´ Dˆ’ ´p dung mˆ u tˆ v´.i nguyˆn so., ch´ng ta d ´nh chı sˆ toa d o pixel hiˆn h`nh (x, y) a o o e u ¯a e a ˜u x´c d nh bo.i c´c ma trˆn nho k´ thu.´.c M × N nˆn ta su dung ph´p to´n ˙ a ’ ˙ ıch ’ ˙ ’ a e a V` c´c mˆ a ¯i ı a a o e tr`ng v´.i gˆc m`n h` , v` ˙ ˜ ˜ ´ modular dˆ’ lˇp lai mˆ u Pixel c´ mˆ u pattern[0, 0] xem nhu u ¯e a a o a o o a ınh a ˙ ´ ˙ ’ ˜ ´ ch´ng ta c´ thˆ’ viˆt, chˇng han, mˆt mˆu bitmap mˆi tru.`.ng suˆt v´.i d`ng u o e e a o a o o o o o lˆnh e if pattern[x % M, y % N] putpixel(x, y, value); ˙ ´ ´ ´ Nˆu tˆ m`u mˆt d oan chˆ d o thay thˆ ch´ng ta c´ thˆ’ ch´p to`n bˆ h`ng e o a o ¯ e ¯ˆ e u o e e a o a i d iˆ’m nˆu thu tuc copypixel() d ˇt d iˆ’m v˜ o m´.c thˆ p cho ph´p ˙ ˙ ˜ ´ ´ ’ ˙ ’ ˙ ’ cua mˆu tˆ tai mˆt th` ¯ e a o o o e ¯a ¯ e e ˙ u a e ˙ ’ ˜ ˜ ´ ` viˆt nhiˆu pixel c`ng mˆt l´c Chˇng han, x´t mˆ u l` ma trˆn × Do d o n´ lˇp mˆi d oan e e u o u a e a a a ¯´ o a o ¯ ˙ ´ ´ ’ ´ ˙ ’ pixel Nˆu d iˆ’m bˆn phai nhˆ t cua mˆt d oan l` byte d u.o.c g´n-t´.c l`, nˆu ho`nh d o cua e ¯e e a ˙ o ¯ a ¯ a u a e a ¯ˆ ˙ ’ o.c v˜ bˇ ng thu tuc ˙ ˜ ´ ˙ ’ ˙ ’ a pixel d` u tiˆn chia hˆt 8-th` to`n bˆ h`ng d` u tiˆn cua mˆu c´ thˆ’ d u e ` ¯a ˆ e e ı a o a ¯a ˆ e a o e ¯ ˙ ´ ` ` ¯e e a o ¯ ´ ˙ a ¯ ’ copypixel() viˆt pixel; thu tuc n`y d u.o.c goi lai nhiˆu lˆn dˆ’ v˜ to`n bˆ d oan Nˆu pixel e e a e o.c g´n th` c´c pixel khˆng thuˆc d oan cˆn d u.o.c ´ ˙ ¯ ’ ˙ a ’ cuˆi c`ng cua d oan khˆng phai l` byte d u a o u o ¯ ı a o o ¯ ` ¯ a c hiˆn hiˆu qua nh˜.ng tru.`.ng ho.p d ac biˆt cua c´c thuˆt to´n ˙ ˙ ’ d ˇt mˇt na Dˆ’ thu ¯a a -e e e u e ˙ a a a o ¯ˇ ’ ´.c dˆ’ khu c´c v`ng lˇp bˆn v` viˆt lai ˙ a ˙ ˙ ˙ a o ˙ ’ ´ ’ raster, ch´ng ta c´ thˆ’, chˇng han kiˆ’m tra tru o ¯e u o e e a e a e c´c v`ng lˇp n`y bˇ ng ngˆn ng˜ Assemble (xem [9]) a o a a ` a o u ˙ ˜ ˙ ´ ’ ˙ o a o ’ o ¯ Trong c´c hˆ thˆng cu.a sˆ’, mˆu tˆ thu.`.ng d u.o.c neo tai gˆc cua hˆ toa d ˆ cu.a sˆ’ a e o o ˙ e ¯o ˙ o ’ ´ 162 Thu viˆn graph2D.h e ˙ ` ’ Trong phˆn n`y, ch´ng tˆi tˆp ho.p nh˜.ng kiˆ’u d˜ liˆu quan v` c´c khai b´o d u.o.c su a a u o a u e u e a a a ¯ ˙ ˙ a a ’ ’ o e ¯ ˙ u ¯ ¯ dung gi´o tr` a ınh Nh˜.ng thu tuc v` h`m thu.`.ng xuyˆn d u.o.c su dung c˜ng d u.o.c d u.a u d ay ˙ ’ o ¯ˆ #if !defined(_graph2D_h) #define _graph2D_h #define PI 3.141592654 #define TWOPI 6.283185308 #define MAXVVERTICES 50 #define MAXCOLUMS 639 #define MAXROWS 479 #define TILE_SIZE 16 #define TRUE #define FALSE #define CLIP_ON #define CLIP_OFF typedef unsigned char Byte; typedef unsigned char Boolean; typedef struct { float x, y; } Point2D; 163 typedef struct { float dx, dy; } Vector2D; typedef struct { int x, y; } Pixel; typedef struct { Point2D First, Second; } Segment2D; typedef struct { Vector2D Normal; float D; } Line2D; typedef struct { float xmin, xmax, ymin, ymax; } Rectangle2D; typedef struct { Point2D Center; float Rad; } Circle2D; typedef struct VertNode2D *VertPtr2D; struct VertNode2D { Point2D Vertex; 164 VertPtr2D Next; }; typedef struct PolyLink *PolyPtr; struct PolyLink { VertPtr2D Start; PolyPtr Next; }; typedef Point2D (*Function) (float); int feoln(FILE *fp) { char c; if ((c = fgetc(fp)) == 10) { fseek(fp, -2, 1); return(True); } else if (c == EOF) return(True); else { fseek(fp, -1, 1); return(False); } } void freadln(FILE *fp) { char c; while (((c = fgetc(fp)) != 10) && (c != EOF)); } 165 float min(float x, float y) { return((x > y) ? y : x); } float max(float x, float y) { return((x > y) ? x : y); } void PointToVector2D(Point2D P, Vector2D *p) { (*p).dx = P.x; (*p).dy = P.y; } float Length2D(Vector2D v) { return(sqrt(v.dx*v.dx + v.dy*v.dy)); } void Scale2D(Vector2D v, float r, Vector2D *Ans) { (*Ans).dx = r*v.dx; (*Ans).dy = r*v.dy; } void Normalize(Vector2D v, Vector2D *Ans) { float Len; Len = Length2D(v); if (Len == 0.0) printf("Zero vector in Normallize()"); else { 166 (*Ans).dx = v.dx/Len; (*Ans).dy = v.dy/Len; } } float Dot2D(Vector2D a, Vector2D b) { return(a.dx*b.dx + a.dy*b.dy); } void Build_nD(Vector2D *n, float *D, Point2D F, Point2D S) { (*n).dx = S.y - F.y; (*n).dy = F.x - S.x; (*D) = F.x*S.y - F.y*S.x; } void CreateVert2D(VertPtr2D *Vertices) { (*Vertices) = NULL; } Boolean EmptyVert2D(VertPtr2D Vertices) { return((Vertices == NULL) ? True : False ); } void PushVert2D(VertPtr2D *Vertices, Point2D Vertex) { VertPtr2D Tempt; Tempt = (VertPtr2D) malloc(sizeof(struct VertNode2D)); Tempt->Vertex = Vertex; Tempt->Next = (*Vertices); (*Vertices) = Tempt; } 167 void PopVert2D(VertPtr2D *Vertices, Point2D *Vertex) { VertPtr2D Tempt; if (EmptyVert2D(*Vertices)) { printf(" Thao tac tro khong hop le "); return; } else { Tempt = (*Vertices); (*Vertex) = Tempt->Vertex; (*Vertices) = Tempt->Next; free(Tempt); } } void ReadVert2D(char *FileName, VertPtr2D *Vertices) { Point2D Vertex; FILE *FileData; if ((FileData = fopen(FileName, "rt")) == NULL) { printf("File khong tim thay"); return; } CreateVert2D(Vertices); while (!feof(FileData)) { fscanf(FileData, "%f %f", &Vertex.x, &Vertex.y); PushVert2D(Vertices, Vertex); } fclose(FileData); 168 } void FreeVertPtr2D(VertPtr2D *Vertices) { Point2D Vertex; while (!EmptyVert2D(*Vertices)) PopVert2D(Vertices, &Vertex); } void DrawPoly(VertPtr2D Vertices) { VertPtr2D Tempt = Vertices; if (Tempt == NULL) return; moveto(Tempt->Vertex.x, Tempt->Vertex.y); while ((Tempt = Tempt->Next) != NULL) { lineto(Tempt->Vertex.x, Tempt->Vertex.y); } } void DrawCurve(float a, float b, int NumPoints, Function Func) { float Delta = (b - a)/ (float)NumPoints; float t = a; int i; moveto(Func(t).x, Func(t).y); for (i = 1; i