Bài 2 CÁC ĐỐI TƯỢNG ĐỒ HỌA CỞ SỞ Mục tiêu-yêu cầu- kết quả
4. Các thuật toán tô màu
Tô màu một vùng là thay đổi màu sắc của các điểm vẽ nằm trong vùng cần tô. 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.
Việc tô màu thường chia làm 2 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ạn này sẽ trở nên 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.
Một số cách tiếp cận chính để tô màu: tô màu theo từng điểm (có thể gọi là tô đơn
giản), tô màu theo dòng quét và tô màu dựa theo đường biên.
4.1 Tô đơn giản
Thuật toán này bắt đầu từ việc xác định một điểm có thuộc vùng cần tô hay không ? Nếu đúng là điểm thuộc vùng cần tô thì sẽ tô với màu muốn tô
Tô đường tròn
- Để tô đường tròn thì ta tìm hình vuông nhỏ nhất ngoại tiếp đường tròn bằng cách xác định điểm trên bên trái (xc-r, yc-r) và điểm dưới bên phải (xc+r, yc+r) của hình vuông
- Cho i đi từ xc-r đến xc+r
Cho j đi từ yc-r đến yc+r Tính khoảng cách d giữa hai điểm (i,j) và tâm (xc,yc) Nếu d<r thì tô điểm (i,j) với màu muốn tô
Kỹ thuật đồ họa và Thực tại ảo - Bài 2 Trang 23
Hình minh họa: Đường tròn nội tiếp hình vuông
Tô đa giác
- Tìm hình chữ nhật nhỏ nhất có các cạnh song song với hai trục tọa độ chứa đa giác cần tô dưa vào hai tọa độ (xmin, ymin), (xmax, ymax). Trong đó, xmin, ymin là hoành độ
và tung độ nhỏ nhất, xmax, ymax là hoành độ và tung độ lớn nhất của các đỉnh của đa giác.
- Cho x đi từ xmin đến xmax, y đi từ ymin đến ymax (hoặc ngược lại). Xét điểm P(x,y) có thuộc đa giác không ? Nếu có thì tô với màu cần tô (xem hình)
Kỹ thuật đồ họa và Thực tại ảo - Bài 2 Trang 24
Hình minh họa: Đa giác nội tiếp hình chữ nhật
Thông thường một điểm nằm trong đa giác thì số giao điểm từ một tia bất kỳ xuất phát từ điểm đó cắt biên của đa giác phải là một số lẻ lần. Đặc biệt, tại các đỉnh cực trị (cực đại hay cực tiểu ) thì một giao điểm phải được tính 2 lần (xem hình). Tia có thể qua phải hay qua trái. Thông thường ta chọn tia qua phải.
Ví dụ : Xét đa giác gồm 13 đỉnh là P0 , P1 , ..., P12 = P0
Hình minh họa: Đa giác có 13 đỉnh
4.2 Tô màu dựa theo dòng quét (scan - line)
Phương pháp này 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.
Phương pháp này thường được dùng để tô màu đa giác lồi , lõm hay đa giác tự cắt, đường tròn, ellipse, và một số đường cong đơn giản khác.
Các bước chính của thuật toán
Tìm ymin, ymax lần lượt là giá trị nhỏ nhất, lớn nhất của tập các tung độ
của các đỉnh của đa giác đã cho.
Kỹ thuật đồ họa và Thực tại ảo - Bài 2 Trang 25
Ứng với mỗi dòng quét y = k với k thay đổi từ ymin đến ymax, lặp:
Tìm tất cả các hoành độ giao điểm của dòng quét y = k 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 : x0 ,x1 ,..., xn ,...
Tô màu các đoạn thẳng trên đường thẳng y = k lần lượt được giới hạn bởi các cặp (x0, x1), ( x1 ,x2 ), ...
Tô đa giác bằng 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 mỗi dòng quét vì ứng với mỗi dòng quét không phải lúc nào cũng giao điểm với các cạnh của đa giác.
Xác định nhanh hoành độ giao điểm vì nếu lặp lại thao tác tìm giao điểm của cạnh
đa giác với mỗi dòng quét sẽ tốn rất nhiều thời gian.
Giải quyết trường hợp số giao điểm đi qua đỉnh đơn điệu thì tính số giao điểm là 1 hay đi qua đỉnh cực trị.thì tính số giao điểm là 0 (hoặc 2).
Tổ chức cấu trúc dữ liệu và thuật toán - Danh sách các cạnh (Edge Table - ET) : chứa toàn bộ các cạnh của đa giác (loại các cạnh song song với trục Ox) được sắp theo thứ tự tăng dần của trục y. Xem hình dưới ta có thể sắp xếp các cạnh trong ET là : AB,
AI, HG, BC, GF, DC, EF (loại IH và DE) - Danh sách các cạnh đang kích họat (Active Edge Table - AET) : chứa các cạnh của đa giác có thể cắt ứng với dòng quét hiện hành,
Kỹ thuật đồ họa và Thực tại ảo - Bài 2 Trang 26 các cạnh này được sắp theo thứ tự tăng dần của hoành độ giao điểm của hoành độ giao điểmgiữa cạnh và dòng quét. - Khi dòng quét đi từ ymin đến ymax, các cạnh thoả điều kiện sẽ được chuyển từ ET sang AET. Nghĩa là, khi dòng quét y=k bắt đầu cắt một cạnh, khi đó k ≥ ymin, 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, khi đó, k > ymax, cạnh này sẽ bị loại khỏi AET. Khi không còn cạnh nào trong ET hay AET thì quá trình tô màu kết thúc
Tô đa giác bằng giải thuật scan -line
Kỹ thuật đồ họa và Thực tại ảo - Bài 2 Trang 27
4.3 Tô màu dựa theo đường biên (Boundary Fill)
Bài toán đặt ra: Cần tô màu một vùng 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ô màu theo đường biên
Ý tưởng: Bắt đầu từ mộ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ô 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 cả hai trường hợp đều không phải thì ta sẽ tô điểm đó với màu muốn tô. Quá trình này được lặp lại cho đến khi không còn tô được nữa thì dừng.
Có 2 quan điểm về cách tô này. Đó là dùng 4 điểm lân cận (có thể gọi là 4 liên thông) hay 8 điểm lân cận (8 liên thông) (xem hình)
Nhận xét :
- Thuật toán có thể 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 gọi đệ qui làm thuật toán không thể sử dụng cho vùng tô lớn (tràn stack)
(x,y-1) (x-1,y) (x,y)(x+1,y) (x,y+1)
Kỹ thuật đồ họa và Thực tại ảo - Bài 2 Trang 28
- Có thể khắc phục việc tràn stack bằng cách giảm số lần gọi đệ qui. Khởi đầu điểm (x,y) là điểm có vị trí đặc biệt trong vùng tô, sau đó, gọi đệ qui các điểm lân cận của (x,y)
- Một cải tiến khác: không cài đặt đệ qui mà tô theo từng dòng (xem hình)
Tô theo từng dòng
Kỹ thuật đồ họa và Thực tại ảo- Bài 3 Trang 1