Giáo trình Các thuật toán tô màu

pdf 16 trang huongle 6570
Bạn đang xem tài liệu "Giáo trình Các thuật toán tô màu", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfgiao_trinh_cac_thuat_toan_to_mau.pdf

Nội dung text: Giáo trình Các thuật toán tô màu

  1. ÑOÀ HOÏA MAÙY TÍNH CCaaùùùcùùùc tthhuuaaääätääät ttooaaùùùnùùùn ttooâââ âââ mmaaøøøuøøøu Daãnã nhaäpä • Moät vuøng toâ thöôøng ñöôïc xaùc ñònh bôûi moät ñöôøng kheùp kín naøo ñoù goïi laø ñöôøng bieân. Daïng ñöôøng bieân ñôn giaûn thöôøng gaëp laø ña giaùc. • Coù hai daïng vuøng toâ thöôøng gaëp : toâ baèng moät maøu thuaàn nhaát (solid fill) vaø toâ theo moät maãu toâ (fill- pattern) naøo ñoù. • Vieäc toâ maøu thöôøng ñöôïc chia laøm hai coâng ñoaïn : ♦ Xaùc ñònh vò trí caùc ñieåm caàn toâ maøu. ♦ Quyeát ñònh toâ caùc ñieåm treân baèng maøu naøo. Coâng ñoaïn naøy thöïc söï phöùc taïp khi ta caàn toâ theo moät maãu toâ naøo ñoù chöù khoâng phaûi toâ thuaàn moät maøu. • Coù hai caùch tieáp caän chính : toâ maøu theo doøng queùt vaø toâ maøu döïa theo ñöôøng bieân. ♦ Phöông phaùp toâ maøu döïa theo doøng queùt seõ xaùc ñònh phaàn giao cuûa caùc doøng queùt keá tieáp nhau vôùi ñöôøng bieân cuûa vuøng toâ, sau ñoù seõ tieán haønh toâ maøu caùc ñieåm thuoäc phaàn giao naøy. Caùch naøy thöôøng ñöôïc duøng ñeå toâ maøu ña giaùc, ñöôøng troøn, ellipse vaø moät soá ñöôøng cong ñôn giaûn khaùc. ♦ Phöông phaùp toâ maøu döïa theo ñöôøng bieân seõ baét ñaàu töø moät ñieåm beân trong vuøng toâ vaø töø ñoù loang daàn ra cho ñeán khi gaëp ñieåm bieân. Caùch naøy thöôøng ñöôïc duøng cho caùc daïng ñöôøng bieân phöùc taïp. Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn toâ maøu 1/16
  2. ÑOÀ HOÏA MAÙY TÍNH TThhuuaaääätääät ttooaaùùùnùùùn ttooâââ âââ tthheeoo ddooøøønøøøngg qquueeùùùtùùùt Baøi toaùn ñaët ra : Caàn toâ maøu moät ña giaùc cho bôûi N ñænh ()= − Pi xi , yi , i 0, N 1 . Ña giaùc naøy coù theå laø ña giaùc loài, ña giaùc loõm, vaø caû ña giaùc töï caét, Toùmù taéét caùcù böôùùc chính cuûaû thuaäät toaùùn • Tìm ytop , ybottom laàn löôït laø giaù trò lôùn nhaát, nhoû nhaát cuûa taäp caùc tung ñoä cuûa caùc ñænh cuûa ña giaùc ñaõ = {}()∈ = {}()∈ cho: ytop max yi , xi , yi P , ybottom min yi , xi , yi P . • ÖÙng vôùi moãi doøng queùt y = k , vôùi k thay ñoåi töø ybottom ñeán ytop , laëp : ♦ Tìm taát caû caùc hoaønh ñoä giao ñieåm cuûa doøng queùt y = k vôùi caùc caïnh cuûa ña giaùc. ♦ Saép xeáp caùc hoaønh ñoä giao ñieåm theo thöù töï taêng daàn : x0 , x1, x2 , , ♦ Toâ maøu caùc ñoaïn thaúng treân ñöôøng thaúng y = k laàn löôït ()()( ) ñöôïc giôùi haïn bôûi caùc caëp x0 , x1 , x1 , x2 , , x2k , x2k+1 . y ytop 0123 ybottom O x Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn toâ maøu 2/16
  3. ÑOÀ HOÏA MAÙY TÍNH Caùcù vaáán ñeàà ñaëët ra • Haïn cheá ñöôïc soá caïnh caàn tìm giao ñieåm öùng vôùi moãi doøng queùt vì öùng vôùi moãi doøng queùt, khoâng phaûi luùc naøo taát caû caùc caïnh cuûa ña giaùc cuõng tham gia caét doøng queùt. • Xaùc ñònh nhanh hoaønh ñoä giao ñieåm vì neáu laëp laïi thao taùc tìm giao ñieåm cuûa caïnh ña giaùc vôùi moãi doøng queùt baèng caùch giaûi heä phöông trình seõ toán raát nhieàu thôøi gian. • Giaûi quyeát tröôøng hôïp soá giao ñieåm öùng vôùi tröôøng hôïp doøng queùt ñi ngang qua ñænh : Neáu soá giao ñieåm tìm ñöôïc giöõa caùc caïnh ña giaùc vaø doøng queùt laø leû thì vieäc nhoùm töøng caëp giao ñieåm keá tieáp nhau ñeå hình thaønh caùc ñoaïn toâ coù theå seõ khoâng chính xaùc. Ñieàu naøy chæ xaûy ra khi doøng queùt ñi ngang qua caùc ñænh cuûa ña giaùc. • Ngoaøi ra, vieäc tìm giao ñieåm cuûa doøng queùt vôùi caùc caïnh naèm ngang laø moät tröôøng hôïp ñaëc bieät caàn phaûi coù caùch xöû lí thích hôïp y=k2 0 1,2 3 y=k1 0 1,2 34 Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn toâ maøu 3/16
  4. ÑOÀ HOÏA MAÙY TÍNH Toå å chöùcù caááu truùùc döõõ lieäuä vaøø thuaäät toaùùn • Danh saùch caùc caïnh (Edge Table – ET) : chöùa toaøn boä caùc caïnh cuûa ña giaùc (ñaõ loaïi ñi caùc caïnh naèm ngang) ñöôïc saép theo thöù töï taêng daàn cuûa yMin . • Danh saùch caùc caïnh kích hoaït (Active Edge Table – AET) : chöùa caùc caïnh cuûa ña giaùc coù theå caét öùng vôùi doøng queùt hieän haønh, caùc caïnh naøy ñöôïc saép theo thöù töï taêng daàn cuûa hoaønh ñoä giao ñieåm giöõa caïnh vaø doøng queùt. • Khi doøng queùt ñi töø bottom ñeán top, caùc caïnh thoûa ñieàu kieän seõ ñöôïc di chuyeån töø ET sang AET: ♦ Khi doøng queùt y = k baét ñaàu caét moät caïnh, nghóa laø ≥ k yMin , caïnh naøy seõ ñöôïc chuyeån töø ET sang AET. ♦ Khi doøng queùt khoâng coøn caét caïnh naøy nöõa, nghóa laø > k yMax , caïnh naøy seõ bò loaïi ra khoûi AET. ♦ Khi khoâng coøn caïnh naøo trong ET hay AET nöõa, quaù trình toâ maøu keát thuùc. • Ñeå tìm giao ñieåm giöõa caïnh ña giaùc vaø doøng queùt hieän haønh nhanh, ta coù nhaän xeùt : 1 1 1 x + − x = ()()k + 1 − k = x + = x + k 1 k m m hay k 1 k m . y=k+1 xk+1 y=k xk Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn toâ maøu 4/16
  5. ÑOÀ HOÏA MAÙY TÍNH Ñeà à xuaáát caááu truùùc döõõ lieäuä cuûûa moäät caïïnh (EDGE) deltaY y=k xIntersect yMin • yMin : giaù trò tung ñoä nhoû nhaát trong 2 ñænh cuûa caïnh. • xInter sect : hoaønh ñoä giao ñieåm cuûa caïnh vôùi doøng queùt hieän haønh. • DxPerScan : giaù trò 1/m (m laø heä soá goùc cuûa caïnh). • deltaY : khoaûng caùch töø doøng queùt hieän haønh tôùi ñænh > yMax . Luùc naøy ñieàu kieän k yMax trôû thaønh deltaY ≤ 0. • Giaù trò xInter sect ñöôïc khôûi gaùn ban ñaàu laø hoaønh ñoä cuûa ñænh coù tung ñoä laø yMin , vaø giaù trò deltaY ñöôïc − + khôûi gaùn ban ñaàu laø yMax yMin 1. Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn toâ maøu 5/16
  6. ÑOÀ HOÏA MAÙY TÍNH Giaûiû quyeáát tröôøøng hôïpï doøøng queùùt ñi qua ñænh • Tính moät giao ñieåm neáu chieàu cuûa hai caïnh keà cuûa ñænh ñoù coù xu höôùng taêng hay giaûm. • Tính hai giao ñieåm neáu chieàu cuûa hai caïnh keà cuûa ñænh ñoù coù xu höôùng thay ñoåi, nghóa laø taêng-giaûm hay giaûm-taêng. Pi+1 Pi-1 Pi Pi-1 Pi Pi+1 Pi Pi+1 Pi-1 Pi+1 Pi-1 Pi (a) (b) • Khi caøi ñaët ñeå khoûi phaûi xeùt ñieàu kieän naøy cho phöùc taïp, khi xaây döïng döõ lieäu cho moãi caïnh tröôùc khi ñöa vaøo ET, ngöôøi ta seõ xöû lí caùc caïnh coù ñænh tính hai giao ñieåm baèng caùch loaïi ñi moät pixel treân cuøng cuûa moät trong hai caïnh. Pi+1 Pi+1 Pi-1 Pi-1 y=k y=k y=k-1 Pi y=k-1 Pi * * Pi Pi Pi-1 Pi-1 Pi+1 Pi+1 Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn toâ maøu 6/16
  7. ÑOÀ HOÏA MAÙY TÍNH Minh hoïïa thuaäät toaùùn Top F C D E yG*=yG+1 G yG y B B yB*=yB-1 yH*=yH+1 I H yH Bottom A • Ban ñaàu : ♦ ET : AB*, AI, H*G, BC, G*F, DC, EF. (loaïi IH vaø DE) ♦ AET : NULL. • Khi doøng queùt ñaït y=yA ♦ ET : H*G, BC, G*F, DC, EF. (chuyeån AB*, AI sang AET) ♦ AET : AB*, AI. • Khi doøng queùt ñaït y=yH* ♦ ET : BC, G*F, DC, EF. (chuyeån H*G sang AET) ♦ AET : AB*, H*G. (loaïi AI vì khoâng coøn caét doøng queùt) Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn toâ maøu 7/16
  8. ÑOÀ HOÏA MAÙY TÍNH • Khi doøng queùt ñaït y=yB ♦ ET : G*F, DC, EF. (chuyeån BC sang AET) ♦ AET : BC, H*G. (loaïi AB*, saép xeáp laïi H*G vaø BC) • Khi doøng queùt ñaït y=yG* ♦ ET : DC, EF. (chuyeån G*F sang AET) ♦ AET : BC, G*F. (loaïi H*G vì khoâng coøn caét doøng queùt) • Khi doøng queùt ñaït y=yD ♦ ET : NULL. (chuyeån DC, EF sang AET) ♦ AET : BC, DC, EF, G*F. (saép xeáp laïi BC, GF*, DC, EF) • Khi doøng queùt ñaït y=yC+1 ♦ ET : NULL. ♦ AET : EF, G*F. (loaïi BC, DC vì khoâng coøn caét doøng queùt) • Khi doøng queùt ñaït y=yF+1 ♦ ET : NULL. ♦ AET : NULL. (loaïi EF, G*F vì khoâng coøn caét doøng queùt). • Thuaät toaùn döøng taïi ñaây. Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn toâ maøu 8/16
  9. ÑOÀ HOÏA MAÙY TÍNH Löu ñoà thuaät toaùn toâ maøu theo doøng queùt Begin Taïo danh saùch taát caû caùc caïnh ET i=BottomScan i<TopScan No Yes Caäp nhaät danh saùch caùc caïnh kích hoaït AET Tìm hoaønh ñoä giao ñieåm vaø saép xeáp theo thöù töï taêng daàn Toâ maøu caùc ñoaïn giao ñöôïc taïo bôûi töøng caëp hoaønh ñoä keá tieáp nhau Caäp nhaät laïi thoâng tin cuûa caùc caïnh ñeå söû duïng cho doøng queùt keá tieáp i=i+1 End Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn toâ maøu 9/16
  10. ÑOÀ HOÏA MAÙY TÍNH Moätä soáá höôùùng daããn caøøi ñaëët #define MAXVERTEX 20 #define MAXEDGE 20 #define TRUE 1 #define FALSE 0 typedef struct { int x; int y; }POINT; typedef struct{ int NumVertex; POINT aVertex[MAXVERTEX]; }POLYGON; typedef struct { int NumPt; float xPt[MAXEDGE]; }XINTERSECT; typedef struct { int yMin; // Gia tri y nho nhat cua 2 dinh float xIntersect; // Hoanh do giao diem cua canh & dong quet float dxPerScan; // Gia tri 1/m int DeltaY; }EDGE; typedef struct { int NumEdge; EDGE aEdge[MAXEDGE]; }EDGELIST; Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn toâ maøu 10/16
  11. ÑOÀ HOÏA MAÙY TÍNH void PutEdgeInList(EDGELIST &EdgeList, POINT p1, POINT p2, int NextY) { EDGE EdgeTmp; EdgeTmp.dxPerScan = float(p2.x-p1.x)/(p2.y-p1.y); // 1/m if(p1.y NextY) { p2.y++; p2.x+= EdgeTmp.dxPerScan; } EdgeTmp.yMin = p2.y; EdgeTmp.xIntersect= p2.x; EdgeTmp.DeltaY = abs(p2.y-p1.y)+1; }//else // xac dinh vi tri chen int j = EdgeList.NumEdge; while((j>0) && (EdgeList.aEdge[j-1].yMin>EdgeTmp.yMin)) { EdgeList.aEdge[j] = EdgeList.aEdge[j-1]; j ; } // tien hanh chen dinh moi vao canh EdgeList.NumEdge++; EdgeList.aEdge[j] = EdgeTmp; } // PutEdgeInList Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn toâ maøu 11/16
  12. ÑOÀ HOÏA MAÙY TÍNH /* Tim dinh ke tiep sao cho khong nam tren cung duong thang voi dinh dang xet */ int FindNextY(POLYGON P, int id) { int j = (id+1)%P.NumVertex; while((j TopScan) TopScan = P.aVertex[i+1].y; } BottomScan = EdgeList.aEdge[0].yMin; } //MakeSortedEdge // Cap nhat lai hai con tro FirstId, LastId cho biet danhsach cac canh active void UpdateActiveEdgeList(EDGELIST EdgeList, int yScan, int &FirstId, int &LastId) { while((FirstId<EdgeList.NumEdge-1) &&(EdgeList.aEdge[FirstId].DeltaY == 0)) FirstId++; while((LastId<EdgeList.NumEdge-1) &&(EdgeList.aEdge[LastId+1].yMin<=yScan)) LastId++; } // UpdateActiveEdgeList Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn toâ maøu 12/16
  13. ÑOÀ HOÏA MAÙY TÍNH TThhuuaaääätääät ttooaaùùùnùùùn ttooâââ âââ mmaaøøøuøøøu tthheeoo ññööôôøøønøøøngg bbiiiiiieeââânââân • Baøi toaùn ñaët ra : Caàn toâ maøu vuøng toâ neáu bieát ñöôïc maøu cuûa ñöôøng bieân vuøng toâ vaø moät ñieåm naèm beân trong vuøng toâ. • Yù töôûng : Baét ñaàu töø ñieåm naèm beân trong vuøng toâ, kieåm tra caùc ñieåm laân caän cuûa noù ñaõ ñöôïc toâ hay coù phaûi laø ñieåm coù maøu truøng maøu bieân hay khoâng, neáu khoâng phaûi thì ta seõ toâ ñieåm ñoù. Quaù trình naøy ñöôïc laëp laïi cho tôùi khi khoâng coøn toâ ñöôïc nöõa thì döøng. Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn toâ maøu 13/16
  14. ÑOÀ HOÏA MAÙY TÍNH • Coù hai quan ñieåm veà caùch toâ naøy, ñoù laø duøng 4 ñieåm laân caän (hình a) hay 8 ñieåm laân caän (hình b). (a) (b) • Caøi ñaët minh hoïa thuaät toaùn toâ maøu theo ñöôøng bieân void BoundaryFill(int x, int y, int FillColor, int BoundaryColor) { int CurrenColor; CurrentColor = getpixel(x,y); if((CurrentColor!=BoundaryColor)&&CurrentColor!= FillColor)) { putpixel(x,y,FillColor); BoundaryFill(x-1, y, FillColor, BoundaryColor); BoundaryFill(x, y+1, FillColor, BoundaryColor); BoundaryFill(x+1, y, FillColor, BoundaryColor); BoundaryFill(x, y-1, FillColor, BoundaryColor); } } // Boundary Fill • Moät soá nhaän xeùt ♦ Thuaät toaùn coù theå hoaït ñoäng khoâng chính xaùc khi coù moät soá ñieåm naèm trong vuøng toâ coù maøu laø maøu caàn toâ cuûa vuøng. ♦ Vieäc thöïc hieän ñeä qui laøm thuaät toaùn khoâng theå duøng cho vuøng toâ lôùn. Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn toâ maøu 14/16
  15. ÑOÀ HOÏA MAÙY TÍNH • Moät caûi tieán nhoû : nhaän xeùt raèng vieäc goïi thöïc hieän ñeä qui thuaät toaùn cho 4 ñieåm laân caän cuûa ñieåm hieän haønh khoâng quan taâm tôùi moät trong 4 ñieåm ñoù ñaõ ñöôïc xeùt ôû böôùc tröôùc hay chöa. Ví duï khi ta xeùt 4 ñieåm laân caän cuûa (x, y), thì khi goïi thöïc hieän ñeä qui vôùi ñieåm hieän haønh laø moät trong 4 ñieåm treân, (x, y) vaãn ñöôïc xem laø ñieåm laân caän cuûa chuùng vaø ñöôïc goïi thöïc hieän laïi. void BoundaryFillEnhanced(int x, int y, int F_Color, int B_Color) { int CurrenColor; CurrentColor = getpixel(x,y); if((CurrentColor!=B_Color)&&CurrentColor!= F_Color)) { putpixel(x,y,F_Color); FillLeft(x-1, y, F_Color, B_Color); FillTop(x, y+1, F_Color, B_Color); FillRight(x+1, y, F_Color, B_Color); FillBottom(x, y-1, F_Color, B_Color); } } // BoundaryFillEnhanced void FillLeft(int x, int y, int F_Color, int B_Color) { int CurrenColor; CurrentColor = getpixel(x,y); if((CurrentColor!=B_Color)&&CurrentColor!= F_Color)) { putpixel(x,y,F_Color); FillLeft(x-1, y, F_Color, B_Color); FillTop(x, y+1, F_Color, B_Color); FillBottom(x, y-1, F_Color, B_Color); } } // FillLeft Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn toâ maøu 15/16
  16. ÑOÀ HOÏA MAÙY TÍNH • Moät caûi tieán khaùc : khoâng caøi ñaët ñeä qui maø toâ theo töøng doøng. Döông Anh Ñöùc, Leâ Ñình Duy Caùc thuaät toaùn toâ maøu 16/16