Bài giảng đồ họa : Các thuật toán tô màu part 4 potx

4 403 0
Bài giảng đồ họa : Các thuật toán tô màu part 4 potx

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

Thông tin tài liệu

ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán tô màu 13/16 T TT T T TT T h hh h h hh h u uu u u uu u a aa a a aa a ä ää ä ä ää ä t tt t t tt t t tt t t tt t o oo o o oo o a aa a a aa a ù ùù ù ù ùù ù n nn n n nn n t tt t t tt t o oo o o oo o â ââ â â ââ â m mm m m mm m a aa a a aa a ø øø ø ø øø ø u uu u u uu u t tt t t tt t h hh h h hh h e ee e e ee e o oo o o oo o đ đđ đ đ đđ đ ư ưư ư ư ưư ư ơ ơơ ơ ơ ơơ ơ ø øø ø ø øø ø n nn n n nn n g gg g g gg g b bb b b bb b i ii i i ii i e ee e e ee e â ââ â â ââ â n nn n n nn n • Bài toán đặt ra : Cần tô màu vùng tô 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ưởng : Bắt đầu 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ô hay có phải là điểm có màu trùng màu biên hay không, nếu không phải thì ta sẽ tô điểm đó. Quá trình này được lặp lại cho tới khi không còn tô được nữa thì dừng. ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán tô màu 14/16 • Có hai quan điểm về cách tô này, đó là dùng 4 điểm lân cận (hình a) hay 8 điểm lân cận (hình b). • Cài đặt minh họa thuật toán tô màu theo đường biên void BoundaryFill(int x, int y, int FillColor, int BoundaryColor) { int CurrenColor; CurrentColor = getpixel(x,y); if((CurrentColor!=BoundaryColor)&&CurrentColor!= FillColor)) { putpixel(x,y,FillColor); BoundaryFill(x-1, y, FillColor, BoundaryColor); BoundaryFill(x, y+1, FillColor, BoundaryColor); BoundaryFill(x+1, y, FillColor, BoundaryColor); BoundaryFill(x, y-1, FillColor, BoundaryColor); } } // Boundary Fill • Một số nhận xét ♦ Thuật toán có thể hoạt động 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 đệ qui làm thuật toán không thể dùng cho vùng tô lớn. (a) (b) ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán tô màu 15/16 • Một cải tiến nhỏ : nhận xét rằng việc gọi thực hiện đệ qui thuật toán cho 4 điểm lân cận của điểm hiện hành không quan tâm tới một trong 4 điểm đó đã được xét ở bước trước hay chưa. Ví dụ khi ta xét 4 điểm lân cận của (x, y), thì khi gọi thực hiện đệ qui với điểm hiện hành là một trong 4 điểm trên, (x, y) vẫn được xem là điểm lân cận của chúng và được gọi thực hiện lại. void BoundaryFillEnhanced(int x, int y, int F_Color, int B_Color) { int CurrenColor; CurrentColor = getpixel(x,y); if((CurrentColor!=B_Color)&&CurrentColor!= F_Color)) { putpixel(x,y,F_Color); FillLeft(x-1, y, F_Color, B_Color); FillTop(x, y+1, F_Color, B_Color); FillRight(x+1, y, F_Color, B_Color); FillBottom(x, y-1, F_Color, B_Color); } } // BoundaryFillEnhanced void FillLeft(int x, int y, int F_Color, int B_Color) { int CurrenColor; CurrentColor = getpixel(x,y); if((CurrentColor!=B_Color)&&CurrentColor!= F_Color)) { putpixel(x,y,F_Color); FillLeft(x-1, y, F_Color, B_Color); FillTop(x, y+1, F_Color, B_Color); FillBottom(x, y-1, F_Color, B_Color); } } // FillLeft ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán tô màu 16/16 • Một cải tiến khác : không cài đặt đệ qui mà tô theo từng dòng. . Đức, Lê Đình Duy Các thuật toán tô màu 14/ 16 • Có hai quan điểm về cách tô này, đó là dùng 4 điểm lân cận (hình a) hay 8 điểm lân cận (hình b). • Cài đặt minh họa thuật toán tô màu theo đường biên void. b bb b b bb b i ii i i ii i e ee e e ee e â ââ â â ââ â n nn n n nn n • Bài toán đặt ra : Cần tô màu vùng tô 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ưởng : Bắt đầu từ điểm nằm bên trong vùng tô, kiểm tra các điểm lân. cho vùng tô lớn. (a) (b) ĐỒ HỌA MÁY TÍNH Dương Anh Đức, Lê Đình Duy Các thuật toán tô màu 15/16 • Một cải tiến nhỏ : nhận xét rằng việc gọi thực hiện đệ qui thuật toán cho 4 điểm lân cận của điểm

Ngày đăng: 23/07/2014, 21:20

Từ khóa liên quan

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

Tài liệu liên quan