TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘIKHOA CÔNG NGHỆ THÔNG TIN Đề Tài: Cài Đặt Các Thuật Toán Tô Màu Đã Học Và Thuật Toán Tô Màu Dòng Quét Cho Một N Giác Bất Kỳ Giảng viên h ướng dẫn: Ths..
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
Đề Tài:
Cài Đặt Các Thuật Toán Tô Màu Đã Học
Và Thuật Toán Tô Màu Dòng Quét Cho Một N Giác Bất Kỳ
Giảng viên h ướng dẫn: Ths Vũ Minh Yến
Trang 2Hà Nội, tháng 08 năm 2012
Trang 3LỜI NÓI ĐẦU
Đồ Họa Máy Tính là một lĩnh vực của Công Nghệ Thông Tin, ở đó nghiên cứu, xây
dựng và tập hợp các công cụ (mô hình lý thuyết và phần mềm) khác nhau để kiến tạo,
xây dựng, lưu trữ và xử lý các mô hình và hình ảnh của các đối tượng, sự vật, hiện
tượng trong cuộc sống, sản xuất, nghiên cứu
Đồ Họa Máy Tính góp phần quan trọng làm cho giao tiếp giữa con người và máy tính trở nên thân thiện hơn Trong lĩnh vực kỹ thuật máy tính, Đồ Họa Máy Tính càng ngày càng phát triển mạng mẽ Từ đồ họa trên máy tính chúng ta có nhiều lĩnh vực có ứng dụng rất quan trọng của Đồ Họa Máy Tính trong thực tế như: tạo mô hình, hoạt cảnh (game, giải trí,…), hỗ trợ thiết kế đồ họa, mô phỏng hình ảnh, chuẩn đoán hình ảnh (trong Y tế), huấn luyện đào tạo ảnh (quân sự, hàng không,…), …
Trong Đồ Họa Máy Tính có nhiều thuật toán tô màu (tô theo đường biên, tô theo dòng quét,…) cho 1 vùng kín 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à để phục vụ
cho việc tìm hiểu thêm về các thuật toán tô màu trong Đồ Họa Máy Tính, Nhóm 7 chúng em với sự hướng dẫn của Giảng viên – Th.s Vũ Minh Yến – Khoa CNTT –
Trường ĐH Công Nghiệp Hà Nội đã thực hiện đề tài: “Cài đặt các thuật toán tô màu đã học và thuật toán tô màu dòng quét cho một n giác bất kỳ”.
Chắc chắn báo cáo đề tài và chương trình cài đặt của nhóm chúng em sẽ có những thiếu xót Mong thầy cô và các bạn góp ý để đề tài của nhóm chúng em được hoàn thiện hơn nữa
Nhóm 7 lớp KHMT1 – K5 chúng em xin chân thành cảm ơn!
Trang 4MỤC LỤC Tiêu Đề Trang
LỜI NÓI ĐẦU 3
MỤC LỤC 4
PHẦN 1: GIỚI THIỆU CHUNG VỀ ĐỀ TÀI 6
I Giới Thiệu Đề Tài 6
II Giới Thiệu Ngôn Ngữ Lập Trình Được Sử Dụng Trong Đề Tài (C# - C Sharp) 6
III Giới Thiệu Thư Viện GDI+ Trong C# 7
PHẦN 2: Ý TƯỞNG XÂY DỰNG CHƯƠNG TRÌNH VÀ CÀI ĐẶT CÁC THUẬT TOÁN 8
I Ý Tưởng Xây Dựng Chương Trình 8
II Cài Đặt Các Thuật Toán 9
1 Thuật toán Tô Màu Vết Dầu Loang 11
2 Thuật toán Tô Màu Theo Đường Biên 12
3 Thuật toán Tô Màu Theo Dòng Quét 15
III Ưu Điểm, Nhược Điểm Và Một Số Hạn Chế Trong Ba Thuật Toán Tô Màu 17
1 Ưu điểm 17
2 Nhược điểm và hạn chế 17
IV Một Số Hàm Hỗ Trợ Việc Sử Dụng Chương Trình 19
1 Hàm chuyển đổi dữ liệu .19
2 Hàm kiểm tra dữ liệu nhập 19
3 Hàm kiểm tra tạo đỉnh .19
4 Hàm kiểm tra vị trí 20
PHẦN 3: GIAO DIỆN CHƯƠNG TRÌNH VÀ HƯỚNG DẪN SỬ DỤNG 21
Trang 5II Hướng Dẫn Tạo Đa Giác Bằng Cách Nhập Tọa Độ Cụ Thể 23
III Một Số Chức Năng Khác Trong Chương Trình 25
IV Một Số Vấn Đề Khi Người Dùng Thao Tác Sai 27
KẾT LUẬN 30
TÀI LIỆU THAM KHẢO 31
Trang 6PHẦN 1: GIỚI THIỆU CHUNG VỀ ĐỀ TÀI
I Giới Thiệu Đề Tài.
Cùng với sự phát triển của nền kinh tế hiện nay là sự phát triển mạnh mẽ của ngành công nghệ thông tin Các ứng dụng của công nghệ thông tin ngày càng nhiều và có mặt trong hầu hết các lĩnh vực của cuộc sống
Với đề tài: “Cài đặt các thuật toán tô màu đã học và thuật toán tô màu dòng
quét cho một n giác bất kỳ”, nhóm 7 – lớp KHMT1K5 sẽ trình bày về ba thuật toán
tô màu là: tô màu vết dầu loang, tô màu theo đường biên và tô màu theo dòng quét Ý nghĩa của thuật toán tô màu dòng quét trong công nghệ thông tin là không hề nhỏ, đặc biệt là đối với màn hình máy tính thì nó có ý nghĩa vô cùng quan trọng
Qua đề tài này nhóm 7 mong sẽ giúp ích được cho mọi người hiểu thêm phần nào
về ba thuật toán tô màu thường dùng, đặc biệt là thuật toán tô màu dòng quét
II Giới Thiệu Ngôn Ngữ Lập Trình Được Sử Dụng Trong Đề Tài (C# -
C Sharp).
.NET Framework của Microsoft là một nền tảng lập trình tập hợp các thư viện lập trình có thể được cài thêm hoặc đã có sẵn trong các hệ điều hành Windows Nó cung cấp những giải pháp thiết yếu cho những yêu cầu thông thường của các chương trình điện toán như lập trình giao diện người dùng, truy cập dữ liệu, kết nối cơ sở dữ liệu, ứng dụng web, các giải thuật số học và giao tiếp mạng Ngoài ra, NET Framework quản lý việc thực thi các chương trình được viết dựa trên NET Framework do đó người dùng cần phải cài NET Framework để có thể chạy các chương trình được viết trên nền NET
Hiện nay với sự phát triển mạnh mẽ của nền tảng NET với khả năng tương thích cao trên nhiều máy tính chạy hệ điều hành Windows do dựa trên cùng một nền tảng NET Mang lại khả năng ứng dụng thực tế cao cho chương trình
Nhóm 7 lựa chọn ngôn ngữ lập trình C# (cụ thể là lập trình Windows Forms) để
thực hiện đề tài này nhằm tận dụng thế mạnh của nền tảng NET
Trang 7III Giới Thiệu Thư Viện GDI+ Trong C#.
GDI+ (Graphics Device Interface – Giao diện thiết bị đồ họa) là thư viện cung cấp các hàm và các cấu trúc dữ liệu cần thiết để ứng dụng tạo ra những kết xuất dưới dạng
đồ họa (hiển thị lên màn hình, in ấn,…)
.NET cung cấp một Framework mới với các lớp cho phép vẽ 2 chiều và tô vẽ Các lớp này có thể tìm thấy trong không gian tên System.Drawing (được chứa trong assembly System.Drawing.dll), tượng trưng cho GDI+ Đối với đề tài này nhóm 7 sử
dụng thư viện là System.Drawing Các hàm trong GDI+ cho phép vẽ đường thẳng,
đường cong, hình chữ nhật, hình đa giác, xuất kí tự , hiển thị ảnh bitmap…
Visual C# sử dụng thư viện GDI+ để thực hiện các thao tác liên quan đến đồ họa
như thực hiện việc khởi tạo chế độ vẽ trên picturebox,…
Trình biên dịch được nhóm 7 sử dụng là Microsoft Visual C# trong chương trình Microsoft Visual Studio 2010, nền tảng NET được sử dụng là NET FrameWork 4.0.
Trang 8PHẦN 2: Ý TƯỞNG XÂY DỰNG CHƯƠNG TRÌNH VÀ
CÀI ĐẶT CÁC THUẬT TOÁN
I Ý Tưởng Xây Dựng Chương Trình.
frm_TaiLieu Danh sách các tài liệu nhóm đã tham khảo
frm_ThongTin Thông tin về đề tài, Giảng viên hướng dẫn, nhóm thực hiện,
…
Trang 9using System;
using System.Drawing;
using System.Windows.Forms;
int [] DinhX = new int [800]; //M ng l u tr Hoành đ c a đ nh đa giác ả ư ữ ộ ủ ỉ
int [] DinhY = new int [800]; //M ng l u tr Tung đ c a đ nh đa giác ả ư ữ ộ ủ ỉ
int SoPt = 0, ktmt = 0;
//SoPt: s ph n t - ktmt: ki m tra màu tô ố ầ ử ể
Bitmap bmp = new Bitmap (570, 500);
//Khai báo 1 bitmap có size là size c a picturebox ủ
Color mv = Color Black,mt = Color Yellow, mn = Color PaleTurquoise;
// mv: màu v - mt: màu tô - mn: màu n n ẽ ề
//Hàm so sánh màu tr v true n u 2 màu truy n vào gi ng nhau ả ề ế ề ố
private bool SsMau( Color mau1, Color mau2)
Bitmap bm = new Bitmap (pictureBox1.Image);
for ( int i = x0 + 1; i < x1; i++) {
bm.SetPixel(i, ys, mt);
} pictureBox1.Image = bm;
}
II Cài Đặt Các Thuật Toán.
Khai báo các thư viện, các biến, hàm liên quan đến các hàm tô màu:
o Khai báo thư viện sử dụng:
o Khai báo các biến toàn cục:
o Khai báo các hàm liên quan đến các hàm tô màu:
Trang 10//Hàm Tìm giá tr l n nh t trong m ng a có n ph n t ị ớ ấ ả ầ ử
private int Max( int [] a, int n)
{
int max = a[0];
for ( int i = 1; i < n; i++)
{
if (a[i] > max) {
int min = a[0];
for ( int i = 1; i < n; i++)
Trang 111 Thuật toán Tô Màu Vết Dầu Loang.
a Bài toán đặt ra
o Dữ liệu đầu vào:
• Miền khép kín được xác định bởi màu vẽ: mv
• Một điểm M(x, y) thuộc miền cần tô
• Cho màu tô: mt
o Dữ liệu đầu ra: Tô miền khép kín trên bằng màu tô
b Mô tả ý tưởng thuật toán bằng lời và hình vẽ
Từ một điểm M(x, y) thuộc miền cần tô, ta so sánh màu của tại điểm đó có giống màu tô và màu vẽ hay không, nếu khác 2 màu trên thì tô màu tại điểm M(x, y) bằng màu tô và tiếp tục xét các điểm lân cận M(x, y) bằng cách lần lượt tăng x, y lên 1 đơn
vị và giảm x, y xuống 1 đơn vị và khi gặp màu vẽ mv tại đâu thì sẽ dừng ở điểm đó còn các điểm khác sẽ tiếp tục phát triển cho đến khi tô kín miền cần tô
Hình 2: Mô tả thuật toán Tô Màu Vết Dầu Loang
Trang 12c Cài đặt cụ thể thuật toán bằng ngôn ngữ C#.
2 Thuật toán Tô Màu Theo Đường Biên.
a Bài toán đặt ra
o Dữ liệu đầu vào:
• Miền khép kín được xác định bởi màu vẽ: mv
• Một điểm M(x, y) thuộc miền cần tô
• Cho màu tô: mt
o Dữ liệu đầu ra: Tô miền khép kín trên bằng màu tô
b Mô tả ý tưởng thuật toán bằng lời và hình vẽ
(Áp dụng với i = ± 1)
• i = 1 thì sẽ tô theo chiều từ vị trí có tung độ y xuống dưới
• i = -1 thì sẽ tô theo chiều từ vị trí có tung độ y lên trên
private void ToMauLoang( int x, int y)
Trang 13o Bước 1: Tìm biên trái nhất và biên phải nhất.
Đặt x1 = x, x2 = x
Trong khi màu tại điểm (x1 – 1, y) khác với màu biên thì giảm x1 đi 1 đơn vị.Trong khi màu tại điểm (x2 + 1, y) khác với màu biên thì tăng x2 lên 1 đơn vị
o Bước 2: Vẽ đoạn (x1, y) và (x2, y) bằng màu tô
o Bước 3: Tính điểm phát triển tiếp theo
Trong khi màu tại điểm (x1, y + i) giống màu biên thì tăng x1 lên 1 đơn vị
o Bước 4: Nếu x1 ≤ x2
Đặt x = x1, tăng y lên i đơn vị và quay trở lại bước 1
o Bước 5: Kết thúc
Trang 14c Cài đặt cụ thể thuật toán bằng ngôn ngữ C#.
private void ToMauBien( int x, int y, int i)
Graphics g = Graphics FromImage(bm);
Pen pen = new Pen (mt);
Trang 153 Thuật toán Tô Màu Theo Dòng Quét.
a Bài toán đặt ra
o Dữ liệu đầu vào:
• Cho các đỉnh của n giác: A1, A2, …, An
• Cho màu tô: mt
o Dữ liệu đầu ra: Tô màu n giác trên bằng màu tô
b Mô tả ý tưởng thuật toán bằng lời và hình vẽ
o Bước 1: Tìm giá trị lớn nhất ymax và giá trị nhỏ nhất ymin của tất cả các tung độ của các đỉnh đã cho
o Bước 2: Đặt ys = ymin + 1
o Bước 3: Ứng với mỗi dòng quét y = ys (ys thay đổi từ ymin đến ymax -1), ta xác định các giao điểm của dòng quét ys với các cạnh của n giác Sau đó sắp xếp hoành độ các giao điểm theo thứ tự tăng dần: x0, x1, x2,…, x2k
o Bước 4: Nối các giao điểm x2i + 1 và x2i+1 - 1 bằng màu tô mt
Với i = {0, 1, 2, …, k-1} Tăng ys lên 1 đơn vị
o Bước 5: Nếu ys ≤ ymax - 1 thì quay lại bước 3
o Bước 6: Kết Thúc
Trang 16c Cài đặt cụ thể thuật toán bằng ngôn ngữ C#.
private void ToMauDongQuet()
GiaoDiem[sogd] = DinhX[i] + ( int )((ys - DinhY[i]) * (( float )
(DinhX[i + 1] - DinhX[i]) / ( float )(DinhY[i + 1] - DinhY[i])));
//Tô màu dòng quét v i các giao đi m đã có ớ ể
for ( int i = 0; i < sogd; i += 2)
Trang 17III Ưu Điểm, Nhược Điểm Và Một Số Hạn Chế Trong Ba Thuật Toán
Tô Màu.
1 Ưu điểm.
a Thuật toán Tô Màu Vết Dầu Loang
o Đơn giản, dễ hiểu, dễ cài đặt
o Tô được tất cả các đa giác, ngoại trừ đa giác lõm phức (Trong đa giác
có đa giác lõm đơn và đa giác lõm phức)
b Thuật toán Tô Màu Theo Đường Biên
o Đơn giản, dễ hiểu, dễ cài đặt
o Tô được tất cả các loại đa giác lồi.
o Vì thuật toán đơn giản, không phải gọi đệ quy nhiều lần như thuật toán
tô màu Vết Dầu Loang nên thời gian tô màu nhanh, sử dụng ít tài nguyên của hệ thống (cụ thể là tài nguyên CPU và bộ nhớ RAM trong máy tính)
c Thuật toán Tô Màu Theo Dòng Quét
o Không phải tìm trước 1 điểm nằm trong vùng cần tô như 2 thuật toán trên
o Tô được tất cả các loại đa giác.
o Thuật toán không phải gọi đệ quy, tính toán đơn giản nên thời gian tô màu nhanh, sử dụng ít tài nguyên của hệ thống
2 Nhược điểm và hạn chế.
a Thuật toán Tô Màu Vết Dầu Loang
o Không tô được đa giác lõm phức
o Phải xác định trước được một điểm nằm trong vùng cần tô Nếu không
Trang 18định được điểm nằm trong vùng cần tô bằng mắt thường là rất khó Cần có biện pháp hỗ trợ người dùng tìm điểm nằm trong vùng cần tô 1 cách chính xác nhất.
o Thuật toán phải gọi đệ quy nhiều lần nên thời gian tô chậm, sử dụng hết nhiều tài nguyên hệ thống
* Chú ý: Trước khi tô màu Vết Dầu Loang thì nên vẽ hình vẽ với kích thước nhỏ để
tránh việc thuật toán chiếm quá nhiều tài nguyên hệ thống dẫn đến tình trạng đơ máy
b Thuật toán Tô Màu Theo Đường Biên
o Không tô được các loại đa giác lõm
o Phải xác định trước được một điểm nằm trong vùng cần tô Nếu không xác định đúng điểm nằm trong vùng cần tô thì sẽ không tô được Và việc xác định được điểm nằm trong vùng cần tô bằng mắt thường là rất khó Cần có biện pháp hỗ trợ người dùng tìm điểm nằm trong vùng cần tô 1 cách chính xác nhất
c Thuật toán Tô Màu Theo Dòng Quét
o Nếu số giao điểm tìm được giữa các cạnh đa giác và dòng quét là lẻ (xảy
ra khi dòng quét đi qua các đỉnh của đa giác VD: dòng quét ys1, ys3 trong Hình 4.) thì khi đó dòng quét có thể tô không chính xác
o Việc tìm giao điểm của dòng quét với các cạnh nằm ngang của đa giác (VD: dòng quét ys2 trong Hình 4.) là một trường hợp đặc biệt Và với mỗi dòng quét thì không phải cạnh nào của đa giác cũng cắt dòng quét nên để cải thiện tốc
độ thuật toán cần có 1 cách nào đó để hạn chế số cạnh tìm giao điểm ứng với mỗi dòng quét
o Vì khi tính toán tìm giao điểm của dòng quét với các cạnh của đa giác
sử dụng phép tính chia nên việc làm tròn giá trị thu được có phần nào chưa được chính xác tuyệt đối và hình ảnh được biểu diễn bằng tập hợp của các điểm ảnh (pixel) nên khi tô màu thì một phần cạnh của đa giác bị màu tô tô đè lên phía trên
Trang 19IV Một Số Hàm Hỗ Trợ Việc Sử Dụng Chương Trình
1 Hàm chuyển đổi dữ liệu
Chuyển đổi dữ liệu kiểu TEXT nhập từ textbox sang kiểu INT
2 Hàm kiểm tra dữ liệu nhập.
Hàm có chức năng kiểm tra dữ liệu nhập từ textbox có phải là số hay không Nếu là số trả về giá trị 1, nếu không phải trả về giá trị 0
3 Hàm kiểm tra tạo đỉnh
Hàm dùng để kiểm tra đỉnh vừa tạo Nếu trùng với đỉnh trước đó đã tạo thì return False
private int Doi( String s) {
int x = int Parse(s);
int x1 = int Parse(s1);
for ( int i = 0; i < SoPt; i++)
if ((DinhX[i] == x) && (DinhY[i] == y))
{ return true ; }
return false ;
}
Trang 204 Hàm kiểm tra vị trí.
Hàm dùng để kiểm tra giá trị tọa độ điểm M(x, y) truyền vào dùng để tô màu Vết Dầu Loang hoặc Tô Màu Biên có nằm trong hình vẽ hay không Nếu nằm trong hình trả về giá trị 1, nếu nằm bên ngoài trả về giá trị 0
private int KTraViTri( int xs, int ys)
{
//Ki m tra nhanh v trí c a đi m so v i các đ nh c a hình v ể ị ủ ể ớ ỉ ủ ẽ
if ((xs < Min(DinhX, SoPt)) || (xs > Max(DinhX, SoPt)) || (ys < Min(DinhY, SoPt)) || (ys > Max(DinhY, SoPt)))
return 0;
//ki m tra các tr ể ườ ng h p còn l i ợ ạ
int sogd = 0, kt = 0;
int [] GiaoDiem = new int [SoPt];
//duy t dòng quét y = ys n u có giao đi m v i đa giác và v trí đó l n ệ ế ể ớ ị ớ
h n xs thì t ng s giao đi m lên 1 đ n v ơ ă ố ể ơ ị
for ( int i = 0; i < SoPt - 1; i++)
{
if (((DinhY[i] <= ys) && (ys < DinhY[i + 1])) || ((DinhY[i] > ys) && (ys
>= DinhY[i + 1])))
{
GiaoDiem[i] = DinhX[i] + ( int )((ys - DinhY[i]) * (( float )(DinhX[i + 1]
- DinhX[i]) / ( float )(DinhY[i + 1] - DinhY[i])));
GiaoDiem[SoPt - 1] = DinhX[SoPt - 1] + ( int )((ys - DinhY[SoPt - 1]) *
(( float )(DinhX[0] - DinhX[SoPt - 1]) / ( float )(DinhY[0] - DinhY[SoPt - 1])));
Trang 21PHẦN 3: GIAO DIỆN CHƯƠNG TRÌNH VÀ HƯỚNG DẪN
SỬ DỤNG.
I Hướng Dẫn Tạo Đa Giác Bằng Click Chuột Trái (Left Click).
Hình 5: Cửa sổ chính của chương trình khi mở.
Click chuột trái vào “Vùng Tạo Hình Vẽ” ở chính giữa để vẽ hình