Tài liệu Area Filling - Tô màu đồ thị docx

31 460 1
Tài liệu Area Filling - Tô màu đồ thị docx

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Area Filling Tô màu đồ thị Vùng tô Vùng xác định điểm ảnh – pixel-defined region Vùng xác định đa giác – polygonal region pixel-defined region polygonal region Pixel-defined region Vùng định nghĩa màu pixel, chia làm phần: Vùng – interior Vùng – exterior Biên (liên tục) - boundary exterior interior boundary Liên thông liên thông 4-connected : pixel liên thông với chúng kề theo chiều ngang hay chiều dọc 8-connected : pixel liên thông với chúng kề theo chiều ngang, hay chiều dọc, hay đường chéo Cách thức định nghĩa pixel-defined region Interior defined Tất pixel vùng có màu, gọi inside-color Các pixel biên khơng có màu Có thể có lỗ vùng Boundary defined Các pixel thuộc biên có màu – boundary-color Các pixel vùng khơng có màu Nếu số pixel vùng có màu boundary-color vùng chứa lỗ inside color Interior-defined Boundary-defined Polygonal Region Định nghĩa đa giác: xác định định đỉnh pi = (xi,yi) Các loại đa giác: Convex Concave, simple Nonsimple polygonal region convex concave nonsimple Recursive Flood-Fill Algorithm (interior-defined, 4-connected region) Đổi màu tất interior-pixel thành màu tô – fill color Q trình tơ màu điểm (seed pixel) thuộc phía vùng tơ lan truyền khắp vùng tô => Flood-Fill seed pixel inside color Interior-defined fill color Recursive Flood-Fill Recursive Flood-Fill Algorithm (cont) Thuật toán Nếu pixel (x,y) thuộc vùng – màu pixel inside-color Đổi màu thành fill-color Áp dụng q trình cho điểm lân cận (4-connected) Ngược lại, khơng làm (4,2) (3,2) (2,2) (4,2) (3,3) S 12 56 (1,2) (3,2) (2,3) (2,1) Recursive Flood-Fill Program void FloodFill(int x, int y, int inside_color, int fill_color) { if (getpixel(x,y) == inside_color) { putpixel(x,y,fill_color); FloodFill(x-1,y, inside_color, fill_color); FloodFill(x+1,y, inside_color, fill_color); FloodFill(x,y+1, inside_color, fill_color); FloodFill(x,y-1, inside_color, fill_color); } } Recursive Flood-Fill (cont) (boundary-defined, 4-connected region) Bài tập Mơ tả thuật tốn Cài đặt Boundary-defined 10 Các trường hợp đặc biệt (cont) y-extrema vertices: minimum maximum y-monotonic: minimum với cạnh maximum với cạnh cịn lại Cạnh nằm ngang 17 Xử lí Trước q trình tơ màu, kiểm tra đỉnh Nếu đỉnh khơng phải cực trị, xét cạnh phía Giảm tung độ y_upper xuống đơn vị Danh sách đỉnh đa giác trước cải tiến: (6,8), (9,5), (9,1), (5,5), (1,2), (2,7), (4,8) Sau cải tiến, danh sách cạnh đa giác sau cạnh bị xóa cạnh rút gọn: e1 = (6,8) to (9,5) e2 = (9,4) to (9,1) e3 = (9,1) to (5,5) e4 = (5,5) to 1,2) e5 = (1,2) to (2,6) e6 = (2,7) to (4,8) 12 56 89 18 Hạn chế thuật tốn • Để xác định giao điểm đường scanline cạnh đa giác, phải duyệt tất cạnh đa giác • Khi số cạnh đa giác khác lớn, phải nhiều thời gian để duyệt hết cạnh, số cạnh mà đường scanline cắt Số giao điểm 2, số cạnh 12 19 Cải tiến tốc độ thuật toán Nhận xét: – Khi dịng qt tăng đơn vị theo y hoành độ giao điểm thay đổi theo 1/m -> Cơng thức tính giao điểm đơn giản 1/m – Giả sử cạnh đa giác có tung độ bị chặn [y_lower, y_upper] tung độ dịng qt khơng thuộc đoạn này, chúng khơng cắt cạnh y_upper y_lower -> Giảm số lượng tính tốn, khơng thiết phải tính giao điểm với tất cạnh 20 Active Edge List (AEL) Để gia tăng tốc độ tính tốn, xây dựng trì danh sách xác định tọa độ giao điểm đa giác đường scanline bước (AEL) Danh sách cho phép tính tốn giao điểm cách nhanh chóng cách lưu thơng tin cạnh mà đường scanline cắt Để thuận lợi tính tốn, cạnh có thơng tin sau: – – – Tung độ cao y_upper cạnh (sau rút gọn) Hoành độ giao điểm x_intersection với đường scanline hành Nghịch đảo hệ số góc 1/m : reciprocal_slope Chú ý, 1/m tính trước cạnh rút gọn, bảo đảm tính xác giao điểm y_upper x_int recip_slope 21 Ví dụ AEL e5 e4 e3 e2 12 56 89 Tại dòng scanline y = 3: AEL y_upper 6/5 x_int 1/5 1/m 7/3 4/3 -1 22 Sử dụng AEL để tơ màu dịng scanline Tại dòng scanline hành y, AEL lưu trữ giao điểm scanline cạnh đa giác Để tô màu, xếp cạnh theo chiều tăng dần hoành độ giao điểm x_int Mỗi cặp giá trị x_int xác định run, mà tơ màu dễ dàng tmp = AEL; while (tmp != NULL) { x1 = tmp.x_int; tmp = tmp->next; x2 = tmp.x_int; tmp = tmp->next; for(x = x1; x

Ngày đăng: 15/12/2013, 02:15

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan