Area Filling Bài giảng đồ họa
ĐỒ HỌA MÁY TÍNH Các thuật toán tô màu Dẫn nhập • Một vùng tô thường xác định đường khép kín gọi đường biên Dạng đường biên đơn giản thường gặp đa giác • Có hai dạng vùng tô thường gặp : tô màu (solid fill) tô theo mẫu tô (fillpattern) • Việc tô màu thường chia làm hai công đoạn : ♦ Xác định vị trí điểm cần tô màu ♦ Quyết định tô điểm màu Công đoạn thực phức tạp ta cần tô theo mẫu tô tô màu • Có hai cách tiếp cận : tô màu theo dòng quét tô màu dựa theo đường biên ♦ Phương pháp tô màu dựa theo dòng quét xác định phần giao dòng quét với đường biên vùng tô, sau tiến hành tô màu điểm thuộc phần giao Cách thường dùng để tô màu đa giác, đường tròn, ellipse số đường cong đơn giản khác ♦ Phương pháp tô màu dựa theo đường biên điểm bên vùng tô từ loang dần gặp điểm biên Cách thường dùng cho dạng đường biên phức tạp Dương Anh Đức, Lê Đình Duy Các thuật toán tô màu 1/16 ĐỒ HỌA MÁY TÍNH Thuật toán tô theo dòng quét Bài toán đặt : Cần tô màu đa giác cho N đỉnh Pi (x i , y i ), i = 0, N − Đa giác đa giác lồi, đa giác lõm, đa giác tự cắt, … Tóm tắt bước thuật toán • Tìm y top , ybottom giá trị lớn nhất, nhỏ tập tung độ đỉnh đa giác cho: y top = max {y i , (x i , y i ) ∈ P} , ybottom = min{yi , (x i , yi ) ∈ P} • Ứng với dòng quét y = k , với k thay đổi từ ybottom đến y top , lặp : ♦ Tìm tất hoành độ giao điểm dòng quét y = k với cạnh đa giác ♦ Sắp xếp hoành độ giao điểm theo thứ tự tăng dần : x0 , x1 , x2 , , ♦ Tô màu đoạn thẳng đường thẳng y = k giới hạn cặp (x , x1 ), (x1 , x ), , (x k , x k +1 ) y ytop ybottom O Dương Anh Đức, Lê Đình Duy x Các thuật toán tô màu 2/16 ĐỒ HỌA MÁY TÍNH Các vấn đề đặt • Hạn chế số cạnh cần tìm giao điểm ứng với dòng quét ứng với dòng quét, lúc tất cạnh đa giác tham gia cắt dòng quét • Xác định nhanh hoành độ giao điểm lặp lại thao tác tìm giao điểm cạnh đa giác với dòng quét cách giải hệ phương trình tốn nhiều thời gian • Giải trường hợp số giao điểm ứng với trường hợp dòng quét ngang qua đỉnh : Nếu số giao điểm tìm cạnh đa giác dòng quét lẻ việc nhóm cặp giao điểm để hình thành đoạn tô không xác Điều xảy dòng quét ngang qua đỉnh đa giác • Ngoài ra, việc tìm giao điểm dòng quét với cạnh nằm ngang trường hợp đặc biệt cần phải có cách xử lí thích hợp y=k2 1,2 y=k1 Dương Anh Đức, Lê Đình Duy 1,2 Các thuật toán tô màu 3/16 ĐỒ HỌA MÁY TÍNH Tổ chức cấu trúc liệu thuật toán • Danh sách cạnh (Edge Table – ET) : chứa toàn cạnh đa giác (đã loại cạnh nằm ngang) theo thứ tự tăng dần y Min • Danh sách cạnh kích hoạt (Active Edge Table – AET) : chứa cạnh đa giác cắt ứng với dòng quét hành, cạnh theo thứ tự tăng dần hoành độ giao điểm cạnh dòng quét • Khi dòng quét từ bottom đến top, cạnh thỏa điều kiện di chuyển từ ET sang AET: ♦ Khi dòng quét y = k bắt đầu cắt cạnh, nghóa k ≥ y Min , cạnh chuyển từ ET sang AET ♦ Khi dòng quét không cắt cạnh nữa, nghóa k > yMax , cạnh bị loại khỏi AET ♦ Khi không cạnh ET hay AET nữa, trình tô màu kết thúc • Để tìm giao điểm cạnh đa giác dòng quét hành nhanh, ta có nhận xeùt : x k +1 − x k = ((k + 1) − k) = hay x k+1 = x k + m m m y=k+1 xk+1 y=k xk Dương Anh Đức, Lê Đình Duy Các thuật toán tô màu 4/16 ĐỒ HỌA MÁY TÍNH Đề xuất cấu trúc liệu cạnh (EDGE) deltaY y=k xIntersect yMin • y Min : giá trị tung độ nhỏ đỉnh cạnh • xInter sec t : hoành độ giao điểm cạnh với dòng quét hành • DxPerScan : giá trị 1/m (m hệ số góc cạnh) • deltaY : khoảng cách từ dòng quét hành tới đỉnh y Max Lúc deltaY ≤ điều kiện k > yMax trở thành • Giá trị xInter sec t khởi gán ban đầu hoành độ đỉnh có tung độ y Min , giá trị deltaY khởi gán ban đầu y Max − y Min + Dương Anh Đức, Lê Đình Duy Các thuật toán tô màu 5/16 ĐỒ HỌA MÁY TÍNH Giải trường hợp dòng quét qua đỉnh • Tính giao điểm chiều hai cạnh kề đỉnh có xu hướng tăng hay giảm • Tính hai giao điểm chiều hai cạnh kề đỉnh có xu hướng thay đổi, nghóa tăng-giảm hay giảm-tăng Pi+1 Pi-1 Pi Pi-1 Pi Pi+1 Pi Pi-1 Pi+1 Pi+1 Pi-1 Pi (a) (b) • Khi cài đặt để khỏi phải xét điều kiện cho phức tạp, xây dựng liệu cho cạnh trước đưa vào ET, người ta xử lí cạnh có đỉnh tính hai giao điểm cách loại pixel hai caïnh Pi+1 y=k y=k-1 Pi+1 Pi-1 y=k y=k-1 Pi Pi-1 Pi Pi* Pi-1 Pi-1 Dương Anh Đức, Lê Đình Duy Pi* Pi+1 Pi+1 Các thuật toán tô màu 6/16 ĐỒ HỌA MÁY TÍNH Minh họa thuật toán Top F C D E yG* =yG+1 G yG yB B yB* =yB-1 yH*=yH+1 I A H yH Bottom • Ban đầu : ♦ ET : AB*, AI, H*G, BC, G*F, DC, EF (loại IH DE) ♦ AET : NULL • Khi dòng quét đạt y=yA ♦ ET : H*G, BC, G*F, DC, EF (chuyeån AB*, AI sang AET) ♦ AET : AB*, AI • Khi dòng quét đạt y=yH* ♦ ET : BC, G*F, DC, EF (chuyeån H*G sang AET) ♦ AET : AB*, H*G (loại AI không cắt dòng quét) Dương Anh Đức, Lê Đình Duy Các thuật toán tô màu 7/16 ĐỒ HỌA MÁY TÍNH • Khi dòng quét đạt y=yB ♦ ET : G*F, DC, EF (chuyeån BC sang AET) ♦ AET : BC, H*G (loại AB*, xếp lại H*G BC) • Khi dòng quét đạt y=yG* ♦ ET : DC, EF (chuyển G*F sang AET) ♦ AET : BC, G*F (loaïi H*G không 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 không cắt dòng quét) • Khi dòng quét đạt y=yF+1 ♦ ET : NULL ♦ AET : NULL (loại EF, G*F không cắt dòng quét) • Thuật toán dừng Dương Anh Đức, Lê Đình Duy Các thuật toán tô màu 8/16 ĐỒ HỌA MÁY TÍNH Lưu đồ thuật toán tô màu theo dòng quét Begin Tạo danh sách tất cạnh ET i=BottomScan i 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, Lê Đình Duy Các thuật toán tô màu 11/16 ĐỒ HỌA MÁY TÍNH /* Tim dinh ke tiep 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