Bài giảng Đồ họa máy tính: Thuật giải tô màu cung cấp cho người học những kiến thức như: Giới thiệu; Thuật giải tô màu theo đường quét; Thuật giải dầu loang; Giải đáp thắc mắc. Mời các bạn cùng tham khảo!
BÀI GIẢNG ĐỒ HỌA MÁY TÍNH THUẬT GIẢI TƠ MÀU NGƠ QUỐC VIỆT 2009 Nội dung • • • • • Giới thiệu Thuật giải tô màu theo đường quét Thuật giải dầu loang Giải đáp thắc mắc Bài tập Giới thiệu • Tơ vùng bề mặt thiết bị raster Cụ thể, tô đa giác (vì xấp xỉ bề mặt tập đa giác) • Tơ màu đặc hay mẫu tơ • Tận dụng kết vẽ đoạn thẳng hai điểm • Sử dụng kỹ thuật khác? Tơ màu theo đường qt • Vùng định nghĩa màu pixel, chia làm phần: • Vùng – interior • Vùng ngồi – exterior • Biên (liên tục) - boundary exterior boundary Tô màu theo đường quét • Đị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 Tơ màu theo đường qt Scanline • Đường thẳng nằm ngang • Số giao điểm scanline đa giác số chẵn (tổng quát) • Các pixel nằm cặp giao điểm lẽ-chẵn nằm đa giác out out in 1 in out in out out Scanline tổng quát for each scanline { Tìm giao điểm scanline với cạnh đa giác Sắp xếp giao điểm theo thứ tự tăng dần theo x Tô pixel nằm cặp giao điểm liên tiếp } Tại dịng scanline y = 3: Các hồnh độ giao điểm sau làm tròn 1, 2, 7, Do đó, đoạn [1,2] [7,9] tô 0 Thuật giải scanline tổng quát Scanline-Các trường hợp đặc biệt • Các cạnh nằm ngang khơng xét đến chúng tơ xét cạnh kề với • Khi scanline qua đỉnh đa giác, giao với cạnh Trong trường hợp đỉnh không cực trị, số giao điểm scanline với đa giác số lẻ out giao in điểm in in giao điểm => sai Scanline-Các trường hợp đặc biệt Các định cực trị: minimum maximum Tăng theo y: minimum của1 cạnh maximum cạnh lại Cạnh nằm ngang 10 Sử dụng AEL e5 e4 e3 e2 Tại dòng scanline y = 3: AEL y_upper 6/5 1/5 x_int 1/m 7/3 4/3 -1 15 Tơ màu dịng qt 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