1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Đồ họa máy tính docx

174 984 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

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

Ngày đăng: 25/01/2014, 14:20

TỪ KHÓA LIÊN QUAN

w