Đồ hoạ máy tính - Các thuật toán xén điểm, đoạn thẳng - Dương Anh Đức

Hoạt động 1:Quan sát , nhận xét. Mục tiêu: Giúp HS nểu được đặc điểm

của mẫu. TPP: Trực quan, giảng giải, đàm thoại

- Cho HS quan sát tranh, ảnh về các Con vật, đặt câu hỏi để HS suy nghĩ, tråldi :

+Con vật trong tranh ảnh lả con gì? l+Nó cả những bộ phận nằp ?

+ Hình dựng của nó khi hoạt động thay đổi như thế nào ? + Nhận xét sự giống nhau, khác nhau về hình dung giữa cực con vật . +Ngoằi những con vật trong tranh, ảnh , em còn biết những con vật nào nửa ? - Gợi ý chọn con vật để nắn: + Em thích con vật nạo nhất?Vì sao ?

 

pdf11 trang | Chia sẻ: thiennga98 | Lượt xem: 838 | Lượt tải: 0download
Bạn đang xem nội dung tài liệu Đồ hoạ máy tính - Các thuật toán xén điểm, đoạn thẳng - Dương Anh Đức, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
oâng thuoäc veà cöûa soå. ÑOÀ HOÏA MAÙY TÍNH Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn xeùn hình 3/11 Thuaäät toaùùn Cohen - Sutherland · Keùo daøi caùc bieân cuûa cöûa soå, 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. Ví duï : 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í öông öùng, ngöôïc laïi bit ñoù seõ ñöôïc ñaët baèng 0. ¨ 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 ( )yx, 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 minxx < , caùc bit khaùc ñöôïc tính töông töï. 0100 Window 01100101 0001 1001 0010 10101000 0000 1234 LEFT RIGHT TOP BOTTOM TOP LEFT RIGHT BOTTOM ÑOÀ HOÏA MAÙY TÍNH Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn xeùn hình 4/11 Thuaäät toaùùn · Gaùn maõ vuøng töông öùng cho caùc ñieåm ñaàu cuoái 21 , PP cuûa ñoaïn thaúng caàn xeùn laàn löôït laø 21 , cc . 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ù 000021 == cc , öù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 4,..1Îk , sao cho vôùi bit thöù k cuûa 21 , cc ñ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. Ñ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 21 , cc . 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 21 , cc 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å, 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ø 1P . Baèng caùch xeùt maõ vuøng cuûa 1P laø 1c ta coù theå xaùc ñònh ñöôïc caùc 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 '1P cuûa ñoaïn thaúng vôùi bieân ñoù. Luùc naøy, ñoaïn thaúng ban ñaàu ñöôïc xeùn thaønh '11PP . Sau ñoù chuùng ta laïi laëp laïi thao taùc ñaõ xeùt cho ñoaïn thaúng môùi '11PP cho tôùi khi xaùc ñònh ñöôïc phaàn naèm trong hoaëc loaïi boû toaøn boä ñoaïn thaúng. ¨ 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á. Ví duï : 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 ( )11 xxmyy -+= , trong ñoù x coù theå laø minx hay maxx . ÑOÀ HOÏA MAÙY TÍNH Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn xeùn hình 5/11 Löu ñoà thuaät toaùn Cohen - Sutherland // Ñoaïn CT tính maõ vuøng 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; } Begin EnCode(P1,c1); EnCode(P2,c2) (c1!=0000) || (c2!=0000) Yes (c1&c2 == 0000) Yes 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å No No End ÑOÀ HOÏA MAÙY TÍNH Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn xeùn hình 6/11 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. ( ) ( ) 10 , , , 121121 121121 ££-=+=-+= -=+=-+= tyyDytDyyyytyy xxDxtDxxxxtxx · ÖÙ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 1³t seõ thuoäc veà tia P2x. ¨ Caùc ñieåm öùng vôùi 0£t seõ thuoäc veà tia P2x’. ¨ Caùc ñieåm öùng vôùi 10 ££ t seõ thuoäc veà ñoaïn thaúng 21PP . · 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 : ï î ï í ì ££ £+£ £+£ 10 max1min max1min t ytDyyy xtDxxx P1(x1, y1) P2(x2, y2) t=0 t=1 t>1 x x' t<0 ÑOÀ HOÏA MAÙY TÍNH Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn xeùn hình 7/11 · Ñaët 1max44 min133 1max22 min111 , , , , yyqDyp yyqDyp xxqDxp xxqDxp -== -=-= -== -=-= · Luùc naøy ta vieát heä phöông trình treân döôùi daïng : î í ì ££ =£ 1t0 4,3,2,1 , kqtp kk · 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 [ ] [ ]1,0, 21 ÍÎ ttt . · Ta xeùt caùc tröôøng hôïp : ¨ Neáu { } )0()0( : 4,3,2,1 <Ù=Î$ kk qpk thì roõ raøng baát phöông trình öùng vôùi k treân laø voâ nghieäm, do ñoù heä voâ nghieäm. ¨ Neáu { } )0()0( : 4,3,2,1 ³Ú¹Î" kk qpk thì vôùi caùc baát phöông trình maø öùng 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 kk qtp £ maø 0<kp , ta coù kk pqt /³ . ¨ Vôùi caùc baát phöông trình kk qtp £ maø 0>kp , ta coù kk pqt /£ . ÑOÀ HOÏA MAÙY TÍNH Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn xeùn hình 8/11 · Vaäy nghieäm cuûa heä baát phöông trình laø [ ]21 , tt vôùi : { } { } ï ï ï ï î ï ï ï ï í ì £ þ ý ü î í ì >= þ ý ü î í ì <= 21 2 1 )1 0,min( )0 0,max( tt p p q t p p q t k k k k k k U U · Neáu heä treân coù nghieäm thì ñoaïn giao 21QQ seõ laø ),(),,( 2121211111 DytyDxtxQDytyDxtxQ ++++ . · Neáu xeùt thuaät toaùn naøy ôû khía caïnh hình hoïc ta coù : ¨ Tröôøng hôïp { } )0()0( : 4,3,2,1 <Ù=Î$ kk qpk 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å ( 0=kp ) vaø naèm ngoaøi cöûa soå ( 0<kq ) neân seõ bò loaïi boû sau khi xeùn. ¨ Vôùi 0¹kp , giaù trò kkk pqrt /== 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 0<kp , 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 0>kp , ñöôø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ò 21 , tt ñöôïc tính nhö sau : Giaù trò 1t chính laø giaù trò lôùn nhaát cuûa caùc kkk pqr /= maø 0<kp (ñöôøng thaúng ñi töø ngoaøi vaøo trong cöûa soå) vaø 0; giaù trò 2t chính laø giaù trò nhoû nhaát cuûa caùc kkk pqr /= maø 0>kp (ñöôøng thaúng ñi töø trong cöûa soå ñi ra) vaø 1. ÑOÀ HOÏA MAÙY TÍNH Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn xeùn hình 9/11 Thuaäät toaùùn xeùùn ña giaùùc Sutherland - Hodgemand Daããn nhaääp · 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â. (a) (b) (c) ÑOÀ HOÏA MAÙY TÍNH Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn xeùn hình 10/11 Thuaäät toaùùn Sutherland - Hodgeman · 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 1, +ii VV laø hai ñænh keà caïnh 1+iiVV , 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: ¨ Neáu iV naèm ngoaøi, 1+iV naèm trong, ta löu giao ñieåm I cuûa 1+iiVV vôùi bieân cuûa cöûa soå vaø 1+iV . ¨ Neáu caû iV , 1+iV ñeàu naèm trong, ta seõ löu caû iV , 1+iV . ¨ Neáu iV naèm trong, 1+iV naèm ngoaøi, ta seõ löu iV vaø I. ¨ Neáu caû iV , 1+iV ñeàu naèm ngoaøi, ta khoâng löu gì caû. Vi Vi+1I Vi Vi+1 Vi Vi+1 I (i) Vi Vi+1 (ii) (iii) (iv) ÑOÀ HOÏA MAÙY TÍNH Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn xeùn hình 11/11 Caøi ñaët haøm xeùn ña giaùc theo moät caïnh cuûa cöûa 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]; }// ClipEdge

File đính kèm:

  • pdfClipping.pdf
Giáo án liên quan