Brand Identity System Design
ĐỒ HỌA MÁY TÍNHDương Anh Đức, Lê Đình Duy Các thuật toán tô màu 1/16CCCCCCCCaaaaaaaáùùùùùùùcccccccc tttttttthhhhhhhhuuuuuuuuaaaaaaaậääääääätttttttt ttttttttooooooooaaaaaaaáùùùùùùùnnnnnnnn ttttttttoooooooôâââââââ mmmmmmmmaaaaaaaàøøøøøøøuuuuuuuuDDaẫãnn nnhhaậäpp• Một vùng tô thường được xác đònh bởi một đườngkhép kín nào đó gọi là đường biên. Dạng đường biênđơn giản thường gặp là đa giác.• Có hai dạng vùng tô thường gặp : tô bằng một màuthuần nhất (solid fill) và tô theo một mẫu tô (fill-pattern) nào đó.• Việc tô màu thường được chia làm hai công đoạn :♦ Xác đònh vò trí các điểm cần tô màu.♦ Quyết đònh tô các điểm trên bằng màu nào. Công đoạnnày thực sự phức tạp khi ta cần tô theo một mẫu tô nàó chứ không phải tô thuần một màu.• Có hai cách tiếp cận chính : tô màu theo dòng quétvà tô màu dựa theo đường biên.♦ Phương pháp tô màu dựa theo dòng quét sẽ xác đònhphần giao của các dòng quét kế tiếp nhau với đường biêncủa vùng tô, sau đó sẽ tiến hành tô màu các điểm thuộcphần giao này. Cách này thường được dùng để tô màu đagiác, đường tròn, ellipse và một số đường cong đơn giảnkhác.♦ Phương pháp tô màu dựa theo đường biên sẽ bắt đầu từmột điểm bên trong vùng tô và từ đó loang dần ra chến khi gặp điểm biên. Cách này thường được dùng chocác dạng đường biên phức tạp. ĐỒ HỌA MÁY TÍNHDương Anh Đức, Lê Đình Duy Các thuật toán tô màu 2/16TTTTTTTThhhhhhhhuuuuuuuuaaaaaaaậääääääätttttttt ttttttttooooooooaaaaaaaáùùùùùùùnnnnnnnn ttttttttoooooooôâââââââ tttttttthhhhhhhheeeeeeeeoooooooo ddddddddoooooooòøøøøøøønnnnnnnngggggggg qqqqqqqquuuuuuuueeeeeeeéùùùùùùùttttttttBài toán đặt ra : Cần tô màu một đa giác cho bởi N đỉnh()1, .0,, −= NiyxPiii. Đa giác này có thể là đa giác lồi, đagiác lõm, và cả đa giác tự cắt, …TToóùmm ttaắétt ccaáùcc bbưươớùcc cchhíínnhh ccuủûaa tthhuuaậätt ttooaáùnn• Tìm topy, bottomy lần lượt là giá trò lớn nhất, nhỏnhất của tập các tung độ của các đỉnh của đa giác đãcho: (){}Pyxyyiiitop∈=,,max, (){}Pyxyyiiibottom∈= ,,min.• Ứng với mỗi dòng quét ky=, với k thay đổi từbottomến topy, lặp :♦ Tìm tất cả các hoành độ giao điểm của dòng quét ky =với các cạnh của đa giác.♦ Sắp xếp các hoành độ giao điểm theo thứ tự tăng dần :, .,,,210xxx♦ Tô màu các đoạn thẳng trên đường thẳng ky =lần lượtđược giới hạn bởi các cặp ()()( )1222110,, .,,,,+kkxxxxxx.Oy0123xybottomytop ĐỒ HỌA MÁY TÍNHDương Anh Đức, Lê Đình Duy Các thuật toán tô màu 3/16CCaáùcc vvaấánn đđeềà đđaặëtt rraa• Hạn chế được số cạnh cần tìm giao điểm ứng với mỗidòng quét vì ứng với mỗi dòng quét, không phải lúcnào tất cả các cạnh của đa giác cũng tham gia cắtdòng quét.• Xác đònh nhanh hoành độ giao điểm vì nếu lặp lạithao tác tìm giao điểm của cạnh đa giác với mỗidòng quét bằng cách giải hệ phương trình sẽ tốn rấtnhiều thời gian.• Giải quyết trường hợp số giao điểm ứng với trườnghợp dòng quét đi ngang qua đỉnh : Nếu số giao điểmtìm được giữa các cạnh đa giác và dòng quét là lẻ thìviệc nhóm từng cặp giao điểm kế tiếp nhau để hìnhthành các đoạn tô có thể sẽ không chính xác. Điềunày chỉ xảy ra khi dòng quét đi ngang qua các đỉnhcủa đa giác.• Ngoài ra, việc tìm giao điểm của dòng quét với cáccạnh nằm ngang là một trường hợp đặc biệt cầnphải có cách xử lí thích hợpy=k1y=k20 1,23401,2 3 ĐỒ HỌA MÁY TÍNHDương Anh Đức, Lê Đình Duy Các thuật toán tô màu 4/16TToổå cchhưứùcc ccaấáuu ttrruúùcc ddưữõ lliieệäuu vvaàø tthhuuaậätt ttooaáùnn• Danh sách các cạnh (Edge Table – ET) : chứa toànbộ các cạnh của đa giác (đã loại đi các cạnh nằmngang) được sắp theo thứ tự tăng dần của Miny.• Danh sách các cạnh kích hoạt (Active Edge Table –AET) : chứa các cạnh của đa giác có thể cắt ứng vớidòng quét hiện hành, các cạnh này được sắp theothứ tự tăng dần của hoành độ giao điểm giữa cạnhvà dòng quét.• Khi dòng quét đi từ bottom đến top, các cạnh thỏiều kiện sẽ được di chuyển từ ET sang AET:♦ Khi dòng quét ky = bắt đầu cắt một cạnh, nghóa làMinyk≥, cạnh này sẽ được chuyển từ ET sang AET.♦ Khi dòng quét không còn cắt cạnh này nữa, nghóa làMaxyk >, cạnh này sẽ bò loại ra khỏi AET.♦ Khi không còn cạnh nào trong ET hay AET nữa, quátrình tô màu kết thúc.• Để tìm giao điểm giữa cạnh đa giác và dòng quéthiện hành nhanh, ta có nhận xét :()()mkkmxxkk1111=−+=−+ hay mxxkk11+=+.y=k+1y=kxkxk+1 ĐỒ HỌA MÁY TÍNHDương Anh Đức, Lê Đình Duy Các thuật toán tô màu 5/16ĐĐeềà xxuuaấátt ccaấáuu ttrruúùcc ddưữõ lliieệäuu ccuủûaa mmoộätt ccaạïnnhh ((EEDDGGEE))• Miny: giá trò tung độ nhỏ nhất trong 2 đỉnh củacạnh.• txIntersec : hoành độ giao điểm của cạnh với dòngquét hiện hành.• DxPerScan : giá trò 1/m (m là hệ số góc của cạnh).• deltaY: khoảng cách từ dòng quét hiện hành tới đỉnhMaxy. Lúc này điều kiện Maxyk> trở thành0≤deltaY.• Giá trò txIntersec được khởi gán ban đầu là hoành độcủa đỉnh có tung độ là Miny, và giá trò deltaY đượckhởi gán ban đầu là 1+−MinMaxyy.yMinxIntersecty=kdeltaY ĐỒ HỌA MÁY TÍNHDương Anh Đức, Lê Đình Duy Các thuật toán tô màu 6/16GGiiaảûii qquuyyeếátt ttrrưươờønngg hhơợïpp ddoòønngg qquueéùtt đđii qquuaa đđỉỉnnhh• Tính một giao điểm nếu chiều của hai cạnh kề củỉnh đó có xu hướng tăng hay giảm.• Tính hai giao điểm nếu chiều của hai cạnh kề củỉnh đó có xu hướng thay đổi, nghóa là tăng-giảmhay giảm-tăng.• Khi cài đặt để khỏi phải xét điều kiện này cho phứctạp, khi xây dựng dữ liệu cho mỗi cạnh trước khi đưavào ET, người ta sẽ xử lí các cạnh có đỉnh tính haigiao điểm bằng cách loại đi một pixel trên cùng củamột trong hai cạnh.(a) (b)PiPi-1Pi+1PiPi-1Pi+1Pi-1Pi-1Pi+1Pi+1PiPiy=kPi-1PiPi+1y=k-1Pi+1y=kPi+1PiPi-1y=k-1Pi-1Pi*Pi*Pi-1Pi+1 ĐỒ HỌA MÁY TÍNHDương Anh Đức, Lê Đình Duy Các thuật toán tô màu 7/16MMiinnhh hhoọïaa tthhuuaậätt ttooaáùnn• Ban đầu :♦ ET : AB*, AI, H*G, BC, G*F, DC, EF. (loại IH và DE)♦ AET : NULL.• Khi dòng quét đạt y=yA♦ ET : H*G, BC, G*F, DC, EF. (chuyển AB*, AI sang AET)♦ AET : AB*, AI.• Khi dòng quét đạt y=yH*♦ ET : BC, G*F, DC, EF. (chuyển H*G sang AET)♦ AET : AB*, H*G. (loại AI vì không còn cắt dòng quét)TopFEDCBGHIABottomyByG*=yG+1yB*=yB-1yGyH*=yH+1yH ĐỒ HỌA MÁY TÍNHDương Anh Đức, Lê Đình Duy Các thuật toán tô màu 8/16• Khi dòng quét đạt y=yB♦ ET : G*F, DC, EF. (chuyển BC sang AET)♦ AET : BC, H*G. (loại AB*, sắp xếp lại H*G và BC)• Khi dòng quét đạt y=yG*♦ ET : DC, EF. (chuyển G*F sang AET)♦ AET : BC, G*F. (loại H*G vì không còn cắt dòng quét)• Khi dòng quét đạt y=yD♦ ET : NULL. (chuyển DC, EF sang AET)♦ AET : BC, DC, EF, G*F. (sắp xếp lại BC, GF*, DC, EF)• Khi dòng quét đạt y=yC+1♦ ET : NULL.♦ AET : EF, G*F. (loại BC, DC vì không còn cắt dòng quét)• Khi dòng quét đạt y=yF+1♦ ET : NULL.♦ AET : NULL. (loại EF, G*F vì không còn cắt dòng quét).• Thuật toán dừng tại đây. ĐỒ HỌA MÁY TÍNHDương Anh Đức, Lê Đình Duy Các thuật toán tô màu 9/16Lưu đồ thuật toán tô màu theo dòng quétBeginTạo danh sách tất cả các cạnh ETi<TopScani=BottomScanYesNoCập nhật danh sách các cạnhkích hoạt AETTìm hoành độ giao điểm và sắp xếptheo thứ tự tăng dầnTô màu các đoạn giao được tạo bởitừng cặp hoành độ kế tiếp nhauCập nhật lại thông tin của các cạnhđể sử dụng cho dòng quét kế tiếpi=i+1End ĐỒ HỌA MÁY TÍNHDương Anh Đức, Lê Đình Duy Các thuật toán tô màu 10/16MMoộätt ssoốá hhưươớùnngg ddaẫãnn ccaàøii đđaặëtt#define MAXVERTEX 20#define MAXEDGE 20#define TRUE 1#define FALSE 0typedef 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 dinhfloat xIntersect; // Hoanh do giao diem cua canh & dong quetfloat dxPerScan; // Gia tri 1/mint DeltaY;}EDGE;typedef struct{int NumEdge;EDGE aEdge[MAXEDGE];}EDGELIST; [...]... thực sự phức tạp khi ta cần tô theo một mẫu tô nào đó chứ không phải tô thuần một màu. • Có hai cách tiếp cận chính : tô màu theo dòng quét và tô màu dựa theo đường biên. ♦ Phương pháp tô màu dựa theo dòng quét sẽ xác định phần giao của các dòng quét kế tiếp nhau với đường biên của vùng tô, sau đó sẽ tiến hành tô màu các điểm thuộc phần giao này. Cách này thường được dùng để tô màu đa giác, đường tròn,... đạt y=y F +1 ♦ ET : NULL. ♦ AET : NULL. (loại EF, G*F vì không còn cắt dòng quét). • Thuật toán dừng tại đây. ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán tô màu 14/16 • Có hai quan điểm về cách tô này, đó là dùng 4 điểm lân cận (hình a) hay 8 điểm lân cận (hình b). • Cài đặt minh họa thuật toán tô màu theo đường biên void BoundaryFill(int x, int y, int FillColor, int BoundaryColor) { int... BoundaryColor); BoundaryFill(x, y-1, FillColor, BoundaryColor); } } // Boundary Fill • Một số nhận xét ♦ Thuật toán có thể hoạt động không chính xác khi có một số điểm nằm trong vùng tô có màu là màu cần tô của vùng. ♦ Việc thực hiện đệ qui làm thuật toán không thể dùng cho vùng tô lớn. (a) (b) ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán tô màu 12/16 /* Tim dinh ke tiep sao cho khong nam tren cung duong thang voi... b bb b b bb b i ii i i ii i e ee e e ee e â ââ â â ââ â n nn n n nn n • Bài toán đặt ra : Cần tô màu vùng tô nếu biết được màu của đường biên vùng tô và một điểm nằm bên trong vùng tô. • tưởng : Bắt đầu từ điểm nằm bên trong vùng tô, kiểm tra các điểm lân cận của nó đã được tô hay có phải là điểm có màu trùng màu biên hay không, nếu không phải thì ta sẽ tô điểm đó. Quá trình này được lặp lại cho tới khi không còn tô được nữa thì dừng. ĐỒ HỌA... n n h h a a ä ä p p • Một vùng tô thường được xác định bởi một đường khép kín nào đó gọi là đường biên. Dạng đường biên đơn giản thường gặp là đa giác. • Có hai dạng vùng tô thường gặp : tô bằng một màu thuần nhất (solid fill) và tô theo một mẫu tô (fill- pattern) nào đó. • Việc tô màu thường được chia làm hai công đoạn : ♦ Xác định vị trí các điểm cần tô màu. ♦ Quyết định tô các điểm trên bằng màu nào.... số đường cong đơn giản khác. ♦ Phương pháp tô màu dựa theo đường biên sẽ bắt đầu từ một điểm bên trong vùng tô và từ đó loang dần ra cho đến khi gặp điểm biên. Cách này thường được dùng cho các dạng đường biên phức tạp. ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán tô màu 15/16 • Một cải tiến nhỏ : nhận xét rằng việc gọi thực hiện đệ qui thuật toán cho 4 điểm lân cận của điểm hiện hành... nhỏ nhất của tập các tung độ của các đỉnh của đa giác đã cho: (){} Pyxyy iiitop ∈= ,,max , (){} Pyxyy iiibottom ∈= ,,min . • Ứng với mỗi dòng quét ky = , với k thay đổi từ bottom y đến top y , lặp : ♦ Tìm tất cả các hoành độ giao điểm của dòng quét ky = với các cạnh của đa giác. ♦ Sắp xếp các hoành độ giao điểm theo thứ tự tăng dần : , ,,, 210 xxx ♦ Tô màu các đoạn thẳng trên đường thẳng ky... 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 ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán tô màu 13/16 T TT T T TT T h hh h h hh h u uu u u uu u a aa a a aa a ä ää ä ä ää ä t tt t t tt t t tt t t tt t o oo o o oo o a aa a a aa a ù ùù ù ù ùù ù n nn n n nn n t tt t t tt t o oo o o oo o â ââ â â ââ â ...ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán tô màu 1/16 C CC C C CC C a aa a a aa a ù ùù ù ù ùù ù c cc c c cc c t tt t t tt t h hh h h hh h u uu u u uu u a aa a a aa a ä ää ä ä ää ä t tt t t tt t t tt t t tt t o oo o o oo o a aa a a aa a ù ùù ù ù ùù ù n nn n n nn n ... &&(EdgeList.aEdge[FirstId].DeltaY == 0)) FirstId++; while((LastId<EdgeList.NumEdge-1) &&(EdgeList.aEdge[LastId+1].yMin<=yScan)) LastId++; } // UpdateActiveEdgeList ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán tô màu 2/16 T TT T T TT T h hh h h hh h u uu u u uu u a aa a a aa a ä ää ä ä ää ä t tt t t tt t t tt t t tt t o oo o o oo o a aa a a aa a ù ùù ù ù ùù ù n nn n n nn n t tt t t tt t o oo o o oo o â ââ â â ââ â . còn cắt dòng quét).• Thuật toán dừng tại đây. ĐỒ HỌA MÁY TÍNHDương Anh Đức, Lê Đình Duy Các thuật toán tô màu 9/16Lưu đồ thuật toán tô màu theo dòng quétBeginTạo. trí các điểm cần tô màu.♦ Quyết đònh tô các điểm trên bằng màu nào. Công đoạnnày thực sự phức tạp khi ta cần tô theo một mẫu tô nàó chứ không phải tô thuần