- Khi điểm tiếp theo được chọn là D ,M tăng một đơn vị theo hướng x Tọa độ trung điểm mới là (xp+2, yp+1/2) Do đó: d1
dnew =d old +b2 (2xp+ 3) 2( −2 yp+ 2)= dold D
2.5.1. Thuật toán tô màu loang
Bắt đầu từ điểm nằm bên trong vùng tô, ta sẽ kiểm tra các điểm lân cận của nó đã được tô màu hay có phải là điểm biên hay không, nếu không phải là điểm đã tô và không phải là điểm biên ta sẽ tô màu nó. Quá trình này được lặp lại cho tới khi nào không còn tô được điểm nào nữa thì dừng. Bằng cách này, toàn bộ các điểm thuộc vùng tô được kiểm tra và sẽ được tô hết.
Có hai quan điểm về cách tô này, đó là dùng bốn điểm lân cận hay tám điểm lân cận đối với điểm đang xét được tô bằng màu trắng.
Đoạn chương trình sau minh họa cài đặt thuật toán tô màu dựa theo đường biên sử dụng phương pháp tô 4 điểm lân cận.
- Xuất phát từ (x,y) tô mầu cho 4 điểm láng giềng và đồng thời gọi đệ quy thủ tục tô mầu Loang cho 4 điểm láng giềng này.
void Loang(int x, int y, int c){ if(getpixel(x,y)!=c) {
putpixel(x,y,c); Loang(x+1,y,c); Loang(x-1,y,c); Loang(x,y+1,c); Loang(x,y-1,c)
} }
Nhận xét
- Thuật toán này có thể sẽ không hoạt độ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 (FillColor). Để khắc phục điều này, trước khi tô màu cần phải đảm bảo rằng toàn bộ các điểm thuộc về vùng tô có màu khác màu tô.
- Nhận xét rằng trong cài đặt thuật toán ở trên, việc gọi thực hiện đệ quy thuật toán cho bốn điểm lân cận của điểm hiện hành không quan tâm tới một trong bốn điểm đó đã được xét ở bước trước hay chưa. Ví dụ khi ta xét bốn điểm lân cận của điểm hiện hành (x,y), thì khi gọi thực hiện đệ quy với điểm hiện hành là một trong bốn điểm lân cận trên, (x,y) vẫn được xem là điểm lân cận của chúng và lại được gọi thực hiện lại.
Hãy cải tiến thuật toán Loang?