Các thuật toán tô màu Bởi Lâm Thị Ngọc Châu Tổng quan • Mục tiêu Học xong chương này, sinh viên phải nắm bắt được các vấn đề sau ◦ Hiểu được khái niệm về không gian màu RGB,CMY, HSV ◦ Thiết kế và cài.
Các thuật tốn tơ màu Các thuật tốn tơ màu Bởi: Lâm Thị Ngọc Châu Tổng quan • Mục tiêu Học xong chương này, sinh viên phải nắm bắt vấn đề sau: ◦ Hiểu khái niệm không gian màu RGB,CMY, HSV ◦ Thiết kế cài đặt giải thuật tơ màu • Kiến thức cần thiết ◦ Kiến thức tin học : lập trình cấu trúc liệu, cách lưu trữ xây dựng mãng liệu chứa giao điểm đường thẳng đa giác ◦ Kỹ lập trình đệ qui, tạo stack khử đệ qui • Tài liệu tham khảo Computer Graphics Donald Hearn, M Pauline Baker Prentice-Hall, Inc., Englewood Cliffs, New Jersey , 1986 ( chapters 4, 78-103) • Nội dung cốt lõi ◦ Trình bày không gian màu RGB, CMY, HSV ◦ Giới thiệu thuật tốn tơ màu bao gồm : tơ đơn giản, tô theo đường biên tô scan-line Các không gian màu Không gian màu RGB (Red - Green - Blue) Không gian màu RGB mô tả màu sắc thành phần Red - Green-và Blue Khơng gian xem khối lập phương chiều với màu red trục x, màu Green truc y, màu Blue trục z Mỗi màu không gian xác định thành phần R, G, B Ứng với tổ hợp khác màu cho ta màu (xem hình 1) 1/14 Các thuật tốn tơ màu Khơng gian màu RGB Trong hình lập phương (xem hình 1), màu gốc (R,G,B) có gốc đối diện màu bù với Hai màu gọi bù kết hợp hai màu lại với màu trắng Ví dụ : Green - Magenta, Red - Cyan, Blue - Yellow Không gian màu CMY (Cyan - Magenta - Yellow) Tương tự khơng gian màu RGB thành phần Cyan - Magenta Yellow Do đó, tọa độ màu không gian CMY trái ngược với không gian RGB Ví dụ : màu White có thành phần (0,0,0), màu Black (1,1,1), màu Cyan (1,0,0), Không gian màu HSV ( Hue - Saturation - Value ) Thực chất không gian biến đổi không gian RGB Không gian HSV mô tả lệnh lập phương RGB quay đỉnh Black H (Hue) góc quay trục V (value) qua đỉnh Black White ( xem hình 2) Các gía trị biến thiên H, S, V sau : • H (Hue) sắc thái có giá trị từ 00 - 3600 • S (Saturation) độ bảo hồ • V (Value) có giá trị từ - Các màu đạt giá trị bảo hòa s = v = 2/14 Các thuật tốn tơ màu Khơng gian màu HSV Các thuật tốn tơ màu Tơ màu vùng thay đổi màu sắc điểm vẽ nằm vùng cần tô Một vùng tô thường đựơc 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 Việc tô màu thường chia làm 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 trở nên phức tạp ta cần tô theo mẫu tô khơng phải tơ màu Có cách tiếp cận để tơ màu Đó : tơ màu theo điểm (có thể gọi tơ đơn giản), tơ màu theo dịng qt tơ màu dựa theo đường biên 3/14 Các thuật tốn tơ màu Tơ đơn giản Thuật tốn việc xác định điểm có thuộc vùng cần tơ hay không ?Nếu điểm thuộc vùng cần tô tơ với màu muốn tơ • Tơ đường trịn Để tơ đường trịn ta tìm hình vng nhỏ ngoại tiếp đường tròn cách xác định điểm bên trái (xc-r, yc-r) điểm bên phải (xc+r, yc+r) hình vng (xem hình 3) Cho i từ xc-r đến xc+r Cho j từ yc-r đến yc+r Tính khoảng cách d hai điểm (i,j) tâm (xc,yc) Nếu d Max ( Pi+1.y, Pi-1.y) Pi đỉnh cực trị ( cực tiểu hay cực đại ) ◦ Pi-1.y < Pi.y < Pi+1.y hay Pi-1 > Pi.y > Pi+1.y Pi đỉnh đơn điệu ◦ Pi = Pi+1 Pi.y < Min ( Pi+2.y, Pi-1.y) hay Pi > Max ( Pi+2.y, Pi-1.y) đoạn [Pi,Pi+1] đoạn cực trị ( cực tiểu hay cực đại ) ◦ Pi = Pi+1 Pi-1.y < Pi.y < Pi+2.y hay Pi-1 > Pi.y > Pi+2.y đoạn [Pi,Pi+1] đoạn đơn điệu • Thuật tốn kiểm tra điểm có nằm đa giác ◦ Với đỉnh đa giác ta đánh dấu hay theo qui ước sau: đỉnh cực trị hay đoạn cực trị đánh số Nếu đỉnh đơn điệu hay đoạn đơn điệu đánh dấu ◦ Xét số giao điểm tia đường thẳng từ P điểm cần xét với biên đa giác Nếu số giao điểm chẳn kết luận điểm không thụôc đa giác Ngược lại, số giao điểm lẻ điểm thuộc đa giác • Minh họa thuật toán xét điểm thuộc đa giác function PointInpoly(d: dinh; P: d_dinh; n: integer): boolean; var count, i: integer; x_cut: longint; function next(i: integer): integer; begin end; next := (i + n + 1) mod n function prev(i: integer): integer; begin 6/14 Các thuật tốn tơ màu end; begin prev := (i + n - 1) mod n count := 0; for i := to n-1 if d[i].y = P.y then begin if d[i].x > P.x then begin end; if ((d[prev(i)].y < P.y) and (P.y < d[next(i)].y)) or ((d[prev(i)].y > P.y) and (P.y > d[next(i)].y)) then count := count + 1; if d[next(i)].y = P.y then if ((d[prev(i)].y < P.y) and (P.y < d[next(next(i))].y)) or ((d[prev(i)].y < P.y and (P.y > d[next(next(i))].y)) then count := count + 1; end else {d[i].y = P.y} if ((d[i].y < P.y) and (P.y < d[next(i)].y)) or ((d[i].y < P.y) and (P.y > d[next(i)].y)) then begin end; x_cut := d[i].x + Round((d[next(i)].x - d[i].x) / (d[next(i)].y d[i].y) * (P.y - d[i].y)); if x_cut >= P.x then count := count + 1; end; if (count mod = 0) then PointInPoly := false else PointInpoly := true; • Minh họa thuật tốn tơ đa giác (xmin, ymin, xmax, ymax: khai báo chương trình chính.) Procedure Todg ( d:dinh; n,maubien : integer ; d: dinh; n:integer ) ; var x, y:integer; P: d_dinh; begin for x:=xmin to xmax for y:= ymin to ymax begin P.x:= x; P.y := y; if pointInpoly (d, P, n) then if getpixel(x,y) maubien then putpixel(x,y,color); end; end; • Nhận xét ◦ Thuật tốn tơ đơn giản có ưu điểm tơ mịn sử dụng cho đa giác lồi hay đa giác lõm, đa giác tự cắt, đường tròn, ellipse ◦ Tuy nhiên, giải thuật trở nên chậm ta phải gọi hàm PointInpoly nhiều lần Để khắc phục nhược điểm người ta đưa thuật tốn tơ màu theo dịng qt Tơ màu theo dịng quét (scan - line) Phương pháp 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 Phương pháp thường dùng để tô màu đa giác lồi , lõm hay đa giác tự cắt, đường tròn, ellipse, số đường cong đơn giản khác • Các bước thuật tốn 7/14 Các thuật tốn tơ màu Tìm ymin, ymax giá trị nhỏ nhất, lớn tập tung độ đỉnh đa giác cho Ứng với dòng quét y = k với k thay đổi từ ymin đến ymax, lặp : ◦ Tìm tất hồ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 , , xn , ◦ Tô màu đoạn thẳng đường thẳng y = k giới hạn cặp (x0, x1), ( x1 ,x2 ), (xem hình 6) Tơ đa giác giải thuật scan -line • Các vấn đề cần lưu ý ◦ Hạn chế đụơc số cạnh cần tìm giao điểm ứng với dịng qt ứng với dịng quét lúc giao điểm với cạnh đa giác ◦ Xác định nhanh hoàn độ 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 tốn nhiều thời gian ◦ Giải trường hợp số giao điểm qua đỉnh đơn điệu tính số giao điểm hay qua đỉnh cực trị.thì tính số giao điểm (hoặc 2) • Tổ chức cấu trúc liệu thuật toán 8/14 Các thuật tốn tơ màu Danh sách cạnh (Edge Table - ET) : chứa toàn cạnh đa giác (loại cạnh song song với trục Ox) theo thứ tự tăng dần trục y Xem hình 2.5 ta xếp cạnh ET : AB, AI, HG, BC, GF, DC, EF (loại IH DE) - Danh sách cạnh kích họat (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 hồnh độ giao điểm cạnh dịng qt Khi dòng quét từ ymin đến ymax, cạnh thoả điều kiện chuyển từ ET sang AET Nghĩa là, dòng quét y=k bắt đầu cắt cạnh, k ≥ ymin, cạnh chuyển từ ET sang AET Khi dịng qt khơng cịn cắt cạnh nữa, đó, k > ymax, cạnh bị loại khỏi AET Khi khơng cịn cạnh ET hay AET q trình tơ màu kết thúc ( xem hình 7) Tơ đa giác giải thuật scan -line Để tìm giao điểm cạnh đa giác dịng qt, ta có nhận xét sau : 9/14 Các thuật tốn tơ màu x k+1 - x k =(1/m) ( (k+1) - k ) =(1/m) hay x k+1 = xk + (1/m) Trong m hệ số góc cạnh Lưu đồ thuật tốn scan - line 10/14 Các thuật tốn tơ màu Phương pháp tơ màu dựa theo đường biên Bài toán đặt ra: Cần tô màu vùng biết màu đường biên vùng tô điểm nằm bên vùng tô Ý tưởng: Bắt đầu từ điểm nằm bên vùng tô, kiểm tra điểm lân cận tơ với màu muốn tơ, hay điểm lân cận có màu trùng với màu biên khơng ? Nếu hai trường hợp khơng phải ta tơ điểm với màu muốn tơ Q trình lặp lại khơng cịn tơ dừng (xem hình 9) Tơ màu theo đường biên Có quan điểm cách tơ Đó dùng điểm lân cận (có thể gọi liên thông) hay điểm lân cận (8 liên thơng) (xem hình 10) liên thơng liên thơng Cài đặt minh họa thuật tốn liên thông Procedure Boundary_fill ( x,y, mauto, maubien :integer); var mau_ht : integer; begin mau_ht:= getpixel(x, y); if (mau_ht mauto) and (mau_ht maubien) then begin putpixel(x,y,color); Boundary_fill ( x+1,y, mauto, maubien ); Boundary_fill ( x-1,y, mauto, maubien ); Boundary_fill 11/14 Các thuật tốn tơ màu ( x,y+1, mauto, maubien ); Boundary_fill ( x,y-1, mauto, maubien ); end; end; Nhận xét Thuật tốn khơng xác có số điểm nằm vùng tơ có màu màu cần tô vùng Việc thực gọi đệ qui làm thuật tốn khơng thể sử dụng cho vùng tơ lớn ( tràn stack) Có thể khắc phục việc tràn stack cách giảm số lần gọi đệ qui Khởi đầu điểm (x,y) điểm có vị trí đặc biệt vùng tơ, sau đó, gọi đệ qui điểm lân cận (x,y) (xem hình 11) Tam giác với tọa độ đỉnh Trong hình 11, ta xét điểm (x,y) có tọa độ (498, 200) Với điểm khởi đầu cần xét điểm lân cận (x-1,y), (x,y-1), (x,y+1) Khi thủ tục tô màu theo đường biên viết lại sau : Procedure Boundary_fill ( x,y,mauto, maubien :integer); var mau_ht : integer; begin mau_ht:= getpixel(x, y); if (mau_ht mauto) and (mau_ht maubien) then begin putpixel(x,y,color); Boundary_fill ( x+1,y, mauto, maubien ); Boundary_fill ( x-1,y, mauto, maubien ); Boundary_fill ( x,y+1, mauto, maubien ); Boundary_fill ( x,y-1, mauto, maubien ); end; end; Trong hình đây, ta xét điểm (x,y) có tọa độ (102, 102) Với điểm khởi đầu cần xét điểm lân cận (x+1,y), (x,y+1) Khi thủ tục tơ màu theo đường biên viết lại sau : 12/14 Các thuật tốn tơ màu Procedure Boundary_fill ( x,y,mauto, maubien :integer); var mau_ht : integer; begin mau_ht:= getpixel(x,y); if (mau_ht mauto) and (mau_ht maubien) then begin putpixel(x,y,color); Boundary_fill ( x+1,y, mauto, maubien ); Boundary_fill ( x,y+1, mauto, maubien ); end; end; Một cải tiến khác : không cài đặt đệ qui mà tơ theo dịng (xem hình 12 ) Tơ theo dịng Tổng kết - Sinh viên cần hiểu khái niệm không gian màu Lưu ý nhiều giải thuật tô biên scan-line - Trong scan-line phải đánh dấu đỉnh đơn điệu đỉnh cực trị 13/14 Các thuật toán tô màu - Trong giải thuật tô biên, việc thực gọi đệ qui nhiều lần làm thuật tốn khơng thể sử dụng cho vùng tơ lớn (tràn stack) Có thể khắc phục việc tràn stack cách giảm số lần gọi đệ qui Thực gọi đệ qui đỉnh đặc biệt đa giác Bài tập Viết chương trình vẽ đa giác n đỉnh, xét xem điểm P có thuộc đa giác khơng ? Viết chương trình vẽ đa giác n đỉnh Tô đa giác giải thuật tô đơn giản ( Tìm xmin, ymin, xmax, ymax) Viết chương trình vẽ đường trịn Tơ đường trịn giải thuật tơ đơn giản Viết chương trình vẽ đa giác n đỉnh Tô đa giác giải thuật tô biên Lưu ý cho trường hợp đa giác : hình chữ nhật, đa giác lồi, đa giác lõm Viết chương trình vẽ đường trịn Tơ đường trịn giải thuật tơ biên Viết chương trình vẽ đa giác n đỉnh Tô đa giác giải thuật scan-line Viết chương trình vẽ đường trịn Tơ đường trịn giải thuật tơ scanline Viết chương trình vẽ hai đường trịn C1 C2 cắt Tơ phần giao hai đường trịn Tô phần bù C2 Tô phần bù C1 Lưu ý màu tô phải khác 14/14 ... cạnh Lưu đồ thuật toán scan - line 10/14 Các thuật toán tô màu Phương pháp tô màu dựa theo đường biên Bài tốn đặt ra: Cần tơ màu vùng biết màu đường biên vùng tô điểm nằm bên vùng tô Ý tưởng:... trị bảo hòa s = v = 2/14 Các thuật tốn tơ màu Khơng gian màu HSV Các thuật tốn tơ màu Tơ màu vùng thay đổi màu sắc điểm vẽ nằm vùng cần tô Một vùng tô thường đựơc xác định đường khép kín gọi.. .Các thuật tốn tơ màu Khơng gian màu RGB Trong hình lập phương (xem hình 1), màu gốc (R,G,B) có gốc đối diện màu bù với Hai màu gọi bù kết hợp hai màu lại với màu trắng Ví dụ :