1. Trang chủ
  2. » Luận Văn - Báo Cáo

Báo cáo đề tài thuật toán tô màu theo đường biên - dòng quét

49 3K 8

Đ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

Thông tin cơ bản

Định dạng
Số trang 49
Dung lượng 1,04 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Báo cáo đề tài thuật toán tô màu theo đường biên dòng quét

Trang 1

BÁO CÁO ĐỀ TÀI

ĐẠI HỌC SƯ PHẠM KỸ THUẬT VINH KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÔ MÀU THEO

ĐƯỜNG BIÊN & DÒNG QUÉT

Trang 2

Nội dung trình bày

Lời nói đầu

Trang 3

Lời nói đầu

Trong đồ họa máy tính có khá nhiều thuật toán tô màu (Scanline, tô loang ) cho 1 vùng kín (đặc) như các đa giác, các đường tròn Xong mỗi thuật toán lại tỏ ra có những ưu việt và hạn chế riêng đối với từng bài toán cụ thể Với thuật toán tô màu theo dòng quét (Scanline), khi tô màu cho một vùng kín đôi khi cần phải xác định cho được các trường hợp đặc biệt của bài toán để sao cho kết quả trả về sẽ tô được những vùng cần thiết như mong muốn

Trang 4

Song, trong thực tiễn để làm được điều này nhiều lúc cũng gặp phải khá nhiều khó khăn trong việc xử lý các trường hợp đặc biệt đó.Đề tài này nhằm mục đích tìm hiểu hai thuật toán :

Tô màu theo đường biên và tô màu theo dòng quét xác định các trường hợp đặc biệt của bài toán tô màu đa giác cũng như cách xử lý chúng

để cho kết quả tô chính xác bằng thuật toán Scanline.

Lời nói đầu

Trang 5

Với đề tài này và được sự hướng dẫn của thầy giáo Ths.Trần Thanh Phong nhóm đã cố gắng tìm hiểu nhưng vẫn chưa được hoàn thiện.

Nhóm mong được sự đóng góp ý kiến nhiệt tình của các bạn

Nhóm xin chân thành cảm ơn!

Lời nói đầu

Trang 6

Giới Thiệu Chung

1.Giới thiệu đề tài

Nội dung :

Thuật toán cải tiến của tô màu loang

(Tô màu theo đường biên).

Thuật toán tô màu theo dòng quét

(Tổ chức dữ liệu).

Demo :

+Tô màu theo biên.

+ Tô màu theo dòng quét.

Trang 7

Giới Thiệu Chung

2.Tô màu là gì?

-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.

-Có 3 cách tiếp cận chính để tô màu Đó là : 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.

Trang 8

Giới Thiệu Chung

Bài toán tô màu đa giác mô tả như sau:

- Dữ liệu vào: Một mảng P chứa các các đỉnh của đa giác

và một hằng số màu color, mỗi phần tử trong mảng P là một bản ghi gồm 2 thành phần x và y.

-Dữ liệu ra: Đa giác P đã được tô bởi màu color.

Trang 9

1.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ô.

2 Ý tưởng :

- Một hình đa giác được xác định bằng các đường biên, chúng

ta phân biệt đường biên với vùng cần tô (bên trong đường biên) bằng thuộc tính màu sắc.

- Bắt đầu từ một điểm (x,y) bất kỳ trong vùng tô, ta tô ra 4 đỉnh, rồi lại gọi đệ quy từ các đỉnh đó tô cho đến khi gặp màu

tô của đường biên.

- Hoặc 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 (xem hình 1).

Thuật toán tô màu theo đường biên

Trang 10

Thuật toán tô màu theo đường biên

Trang 11

Thuật toán tô màu theo đường biên

Trang 12

Thuật toán tô màu theo đường biên

3.1 Nhận xét:

- Thuật toán trên có dùng đệ quy và do đó có thể gây ra tràn stack nếu vùng tô quá lớn, mặt khác với bất kỳ điểm (x,y) nào nó cũng đều phải gọi thủ tục tô 4 điểm xung quanh mặc dù có thể các điểm đó đã được 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).

- 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) (xem hình 1)

Trang 13

Thuật toán tô màu theo đường biên

4.Cài đặt minh họa:

4.1 Cài đặt minh họa thuật toán 4 liên thông:

Procedure Boundary_fill ( x,y, mauto, maubien :integer); var mau_ht : integer;

begin

mau_ht:= getpixel(x, y);

if (mau_ht <> mauto) and (mau_ht <> maubien) then

begin

putpixel(x,y,color);

Boundary_fill ( x+1,y, mauto, maubien );

Boundary_fill ( x-1,y, mauto, maubien );

Boundary_fill ( x,y+1, mauto, maubien );

Boundary_fill ( x,y-1, mauto, maubien );

end;

end;

Trang 14

Thuật toán tô màu theo đường biên

4.2 Minh họa thuật toán:

Cho hình vẽ được mô tả như sau:

Trang 15

Thuật toán tô màu theo đường biên

Ví dụ 1: Trong hình 3 ta có thể xét điểm (x,y) có tọa độ là (498,

200) Với điểm khởi đầu này thì chỉ cần xét 3 điểm lân cận là (x-1,y), (x,y-1), (x,y+1) Khi đó thủ tục tô màu theo đường biên được viết lại như sau :

Procedure Boundary_fill ( x,y,mauto, maubien :integer);

var mau_ht : integer;

Boundary_fill ( x-1,y, mauto, maubien );

Boundary_fill ( x,y+1, mauto, maubien );

Boundary_fill ( x,y-1, mauto, maubien );

end;

end;

Trang 16

Thuật toán tô màu theo đường biên

Ví dụ 2: Trong hình 3, ta có thể xét điểm (x,y) có tọa độ là (102, 102) Với điểm khởi đầu này thì chỉ cần xét 2 điểm lân cận là (x+1,y), (x,y+1).Khi đó thủ tục tô màu theo đường biên được viết lại như sau:

Procedure Boundary_fill ( x,y,mauto, maubien :integer);

var mau_ht : integer;

Boundary_fill ( x+1,y, mauto, maubien );

Boundary_fill ( x,y+1, mauto, maubien );

end;

end;

Trang 17

Thuật toán tô màu theo đường biên

Một cải tiến khác : không cài đặt đệ qui mà tô theo từng dòng (xem hình 4).

Trang 18

Thuật toán tô màu theo đường biên

4.3 Đề xuất:

Chúng ta sẽ lần lượt tô từng đoạn giao theo dòng quét ngang thay vì tô theo 4 điểm lân cận Như vậy chúng ta chỉ cần lưu lại các thông tin của điểm bắt đầu mỗi đoạn giao của dòng quét ngang thay vì lưu hết tất cả các điểm lân cận chưa được tô bởi điểm hiện hành.

Chúng ta sẽ tô các dòng quét ngang lên trên, sau khi tô xong, các dòng quét còn lại theo hướng xuống sẽ được tô.

Như vậy, với mỗi điểm (x,y) ta chỉ cần lưu lại tối đa 2 điểm trên và dưới (trường hợp vùng tô bị " lủng" ở giữa), còn không ta cứ vậy tô lên trên cho đến khi gặp màu đường biên, rồi lại cứ vậy tô xuống dưới.

Trang 19

Thuật toán tô màu theo đường biên

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 2).

Trang 20

Tô Màu Theo Dòng Quét(Scan-line)

1.Tìm hiểu về thuật toán:

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.

Trang 21

Tô Màu Theo Dòng Quét(Scan-line)2.Ý tưởng:

với tất cả các cạnh của đa

giác ( đường viền đa

giác ) trong phạm vi

YMAX, YMIN đó.

Bật sáng các Pixel bên

trong đa giác bằng cách di

chuyển con trỏ giữa các

giao điểm cho thích hợp.

Trang 22

Tô Màu Theo Dòng Quét(Scan-line)

3.Các trường hợp đặc biệt:

Ta cần xây dựng các thủ tục (TT) mà mỗi TT đó phải xử lý được

một trường hợp đặc biệt của bài toán.

TH1: Dòng quét L1cắt đa giác một lần ,tạiđỉnhthấpnhấtcủa đa giác Taphải xây dựng mộtTT bỏ qua dòng L1 ( còn đỉnh của đa giácnày tất nhiên sẽ được sáng cùng với đường viền của nó).

TH2: DòngL2cắtđa giáctại 2điểm ( trong đó có1 đỉnh) Mọi Pixel nằm giữa B1, B2 sẽ được sáng lên ; giao điểm với đỉnh nàykhông được bỏ qua Do đó phải xây dựng mộtTT có khả năng xác định được khi nào 1 giao điểm với đỉnh có thể hoặc không thể bỏ qua.

TH3: Dòng L3 cắt đa giáctại 3 điểm ; mọi Pixelgiữa C1 và C2 sẽ sáng lên nênTT sẽ bỏ qua điểm C’.

TH4: Dòng L4 trùngvớicạnhnằm ngang S Mọi pixel giữa D1,D2

sẽ sáng lên Phải xây dựng mộtTTcoi cạnh S là không tồn tại ( không bật sáng các Pixel nằm trên S) Đồng thời các pixel giữa D2 và D3 sẽ không sáng lên và các Pixel giữa D3, D4 lại được sáng lên.

Trang 23

Tô Màu Theo Dòng Quét(Scan-line)

3.1 Kiểm tra tính chất các giao điểm

Để kiểm tra tính chất của một đường quét có cắt 1 cạnh không? Ta thực hiện việc so sánh tung độ của dòng quét (yscan) với tung độ y của các điểm mút của mỗi cạnh.

1.Nếu tung độ của 2 điểm mút đều lớn hơn hay nhỏ hơn

Y SCAN thì không có giao điểm nào

Trang 24

Tô Màu Theo Dòng Quét(Scan-line)

3.Nếu tung độ của cả 2 điểm mút đều bằng Y SCAN thì đó là cạnh nằm ngang.

2.Nếu tung độ y của mỗi điểm mút bằng Y SCAN thì giao điểm tại đỉnh đó.

Trang 25

Tô Màu Theo Dòng Quét(Scan-line)

4.Cuối cùng , nếu 1 tung độ bé hơn Y SCAN còn tung độ kia lớn hơn Y SCAN thì dòng quét cắt cạnh đó.

Để tìm giao điểm giữa cạnh đa giác và dòng quét, ta có nhận xét sau :

Trang 26

Tô Màu Theo Dòng Quét(Scan-line)

Lưu đồ thuật toán scan – line

Trong đó m là hệ số góc của cạnh.

Trang 27

Tô Màu Theo Dòng Quét(Scan-line)

3.3 Xử lý các trường hợp đặc biệt.

1 Nếu cạnh bị cắt là nằm ngang thì chỉ việc bỏ qua cạnh đó

và chuyển sang duyệt cạnh tiếp theo.

2.Nếu giao điểm trùng với 1 đỉnh thì kiểm tra các tung độ ngay trước và ngay sau đỉnh đó Nếu cả 2 tung độ đều lớn hơn/nhỏ hơn Y SCAN thì cả 2 cạnh đang xét đều nằm về 1 phía

so với dòng quét ( giống đỉnh C’) nên bỏ qua.

Trang 28

Tô Màu Theo Dòng Quét(Scan-line)

còn lại thì không được bỏ qua

3.Nếu trường hợp dòng quét cắt 1 cạnh thì ta phải xác định tọa độ giao điểm( x =?, yscan)

Trang 29

Tô Màu Theo Dòng Quét(Scan-line)

Trang 30

Tô Màu Theo Dòng Quét(Scan-line)

4.2.Thủ tục xác định giao điểm tại một đỉnh

Procedure Giao1dinh(Var ys:Integer;y0,y1:Integer;Var i:Integer);

Xgd[j]:=X[k mod N];{ Gan hoanh do cho giao diem}

End;

End;

End;

Trang 31

Tô Màu Theo Dòng Quét(Scan-line)

4.3.Thủ tục xác định khi dòng quét cắt một cạnh của đa giác.

Procedure Toadogiao(Var ys:Integer;y0,y1,x0,x1:Integer);

Trang 32

Tô Màu Theo Dòng Quét(Scan-line)5.Vẽ hình

sao cho tổng số giao điểm

trên một dòng quét bao

Trang 33

Tô Màu Theo Dòng Quét(Scan-line)5.2 Thuật truy xuất tới 1 dỉnh hay cạnh liền sau (một đỉnh hay mộtcạnh) hiện thời.

Ở đây ta xây dựng cho được một TT phải có khả năng tìm đến 1 cạnh hay đỉnh theo nghĩa là “trước” và “sau”.

Theo cách đánh số thông thường , tức là dùng chỉ số i để đánh số cạnh đang xét , cạnh tiếp theo là i+1 và cạnh trước đó là i-1 sẽ không thể áp dụng được mà gây ra lỗi đối với cạnh cuối cùng hoặc cạnh đầu tiên.

VD: Cạnh số 5 của 1 ngũ giác chẳng hạn , đứng trước bởi cạnh 1=4 nhưng không thể đứng sau cạnh có chỉ số 5+1=6 (vì cạnh này không tồn tại) Vì lẽ đó , ta dùng cách đánh dấu sau:

5-Nếu đa giác có n cạnh thì cạnh thứ i có các đỉnh có ký hiệu ((i-1) mod n) và (i mod n).

Đỉnh thứ k được ký hiệu bởi (k mod n).Nó đứng sau bởi 1 đỉnh có

ký hiệu là ((k-1+n) mod n)vàđứng trước bởi 1 đỉnh có ký hiệu là ((k+1) mod n).

Trang 34

Tô Màu Theo Dòng Quét(Scan-line)5.3 Kết quả tô màu.

Trang 35

Tô Màu Theo Dòng Quét(Scan-line)

6 Chương trình cài đặt

Một số thủ tục và hàm được viết trong mục 5 không được viết lại trong chương trình cài đặt này và sẽ được gọi trong thủ tục Procedure Tomau.

X,Y: array[0 100] of integer;

n:integer;{ So dinh cua Da giac }

i,j:Word;

Trang 36

Tô Màu Theo Dòng Quét(Scan-line)

Trang 37

Tô Màu Theo Dòng Quét(Scan-line)

Trang 38

Tô Màu Theo Dòng Quét(Scan-line)

Procedure Nhap;

Var i:integer;

Begin

Write('So dinhN='); Readln(n);

Writeln(' - Nhap toa Do: :');

Trang 39

Tô Màu Theo Dòng Quét(Scan-line)

Function ymax:integer;{ <==> y top }

Trang 40

Tô Màu Theo Dòng Quét(Scan-line)

Function ymin:integer;{ <==> y bottom }

Trang 41

Tô Màu Theo Dòng Quét(Scan-line)

Trang 42

Tô Màu Theo Dòng Quét(Scan-line)

Procedure Loaibo(Var j:integer);

k:=k+1;

End;

End;

End;

Trang 43

Tô Màu Theo Dòng Quét(Scan-line)

Trang 44

Tô Màu Theo Dòng Quét(Scan-line)

For i:=1 to n Do { Chay CT cho tung canh } Begin

y0:=Y[(i-1) mod n]; y1:=Y[i mod n];

If not(canhngang(ys,y1,y0)) Then

Trang 45

Tô Màu Theo Dòng Quét(Scan-line)

Begin x0:=X[(i-1) mod n];

x1:=X[i mod n];

If (ys=y0) or (ys=y1) Then

giao1dinh(ys,y0,y1,i) elseToadogiao(ys,y0,y1,x0,x1);

Trang 46

Tô Màu Theo Dòng Quét(Scan-line)

Trang 47

Tô Màu Theo Dòng Quét(Scan-line)

Outtextxy(300,20,' ScanLine Program');

Nhap; Write('Ve da giac!'#7);

Ve; Writeln(#7'Please Wait!');

Wait; Write('To mau!');

Tomau; Readln;

END.

Trang 48

Tổng Kết

Để hoàn thành đề tài này là nhờ sự cố gắng của các thành viên trong nhóm Nhóm mong được sự đóng góp của thầy giáo và các bạn.

Danh sách các thành viên nhóm 2

TT Họ và tên Ghi chú

1 Nguyễn Thanh Bình

2 Nguyễn Văn Danh

Trang 49

Nhóm xin chân thành cảm ơn sự theo dõi của Thầy giáo cùng toàn

thể các bạn !

Ngày đăng: 26/10/2014, 13:29

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w