Tải bản đầy đủ (.pdf) (31 trang)

ĐỀ 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 1 N giác bất kì

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.92 MB, 31 trang )


TRƯỜ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
Lớp: Khoa Học Máy Tính 1 – K5
Nhóm thực hiện : Nhóm 7
Thành viên trong nhóm :
1. Đặng Đình Hoàng
2. Vũ Hồng Phúc
3. Đỗ Lương Thiện
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
Hà Nội, tháng 08 năm 2012
Nhóm 7 – Lớp KHMT1K5 Trang 2
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
LỜ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!
Trường ĐH Công Nghiệp Hà Nội, tháng 8 năm 2012.
Nhóm 7 – Lớp KHMT1K5 Trang 3
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
MỤ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
I. Hướng Dẫn Tạo Đa Giác Bằng Click Chuột Trái (Left Click). 21
Nhóm 7 – Lớp KHMT1K5 Trang 4
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
II. 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
Nhóm 7 – Lớp KHMT1K5 Trang 5
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
PHẦ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.
Nhóm 7 – Lớp KHMT1K5 Trang 6
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
III. 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.
Nhóm 7 – Lớp KHMT1K5 Trang 7
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
PHẦ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.
Hình 1: Danh sách các Form
Chương trình sẽ bao gồm 1 Form Chính và 2 Form phụ (form tài liệu tham khảo và
form thông tin chương trình).
FORM CHỨC NĂNG
frm_Chinh
Vẽ hình bằng cách click chuột lên form hoặc nhập tọa độ
đỉnh cụ thể, tô màu bằng 1 trong 3 thuật toán và các thao
tác về tạo hình, đổi màu,…
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,

Nhóm 7 – Lớp KHMT1K5 Trang 8
using 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)
{
if ((mau1.A == mau2.A) && (mau1.B == mau2.B) && (mau1.G ==

mau2.G) && (mau1.R == mau2.R))
{ return true; }
else
{ return false; }
}
//Hàm tô 1 dòng. Tô t x0 + 1 đ n x1 – 1.ừ ế
private void To1Dong(int x0, int x1, int ys)
{
Bitmap bm = new Bitmap(pictureBox1.Image);
for (int i = x0 + 1; i < x1; i++)
{
bm.SetPixel(i, ys, mt);
}
pictureBox1.Image = bm;
}
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
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:
Nhóm 7 – Lớp KHMT1K5 Trang 9
//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)
{

max = a[i];
}
}
return max;
}
//Hàm Tìm giá tr nh nh t trong m ng a có n ph n tị ỏ ấ ả ầ ử
private int Min(int[] a, int n)
{
int min = a[0];
for (int i = 1; i < n; i++)
{
if (a[i] < min)
{
min = a[i];
}
}
return min;
}
//Hàm s p x p t ng d n các giá tr trong m ng a có n ph n tắ ế ă ầ ị ả ầ ử
//S p x p n i b tắ ế ổ ọ
void SapXep(int[] a, int n)
{
int tg;
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
if (a[i] > a[j])
{
tg = a[i];
a[i] = a[j];
a[j] = tg;

}
}
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
Nhóm 7 – Lớp KHMT1K5 Trang 10
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
1. 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
Nhóm 7 – Lớp KHMT1K5 Trang 11
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
c. 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.
Nhóm 7 – Lớp KHMT1K5 Trang 12
private void ToMauLoang(int x, int y)
{
try
{
Bitmap bm = new Bitmap(pictureBox1.Image);
pictureBox1.Image = bm;
if (!SsMau(bm.GetPixel(x, y), mt) && (!SsMau(bm.GetPixel(x, y),
mv)))
{
bm.SetPixel(x, y, mt);
ToMauLoang(x, y - 1);
ToMauLoang(x + 1, y);
ToMauLoang(x, y + 1);
ToMauLoang(x - 1, y);
}
}
catch (Exception e)
{
MessageBox.Show("X y ra l i trong quá trình tô màu V t D uả ỗ ế ầ
loang!\n" + e);
}
}
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
o 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.
Hình 3: Mô tả thuật toán Tô Màu Theo Đường Biên
Nhóm 7 – Lớp KHMT1K5 Trang 13
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
c. Cài đặt cụ thể thuật toán bằng ngôn ngữ C#.
Nhóm 7 – Lớp KHMT1K5 Trang 14
private void ToMauBien(int x, int y, int i)
{
try
{
Bitmap bm = new Bitmap(pictureBox1.Image);
pictureBox1.Image = bm;
Graphics g = Graphics.FromImage(bm);
Pen pen = new Pen(mt);
//B c 1ướ
int x1 = x, x2 = x;
while (!SsMau(bm.GetPixel(x1 - 1, y), mv))
{
x1 ;
}
while (!SsMau(bm.GetPixel(x2 + 1, y), mv))
{
x2++;
}

//B c 2ướ
g.DrawLine(pen, x1, y, x2, y);
//B c 3ướ
while (SsMau(bm.GetPixel(x1, y + i), mv))
{
x1++;
}
//B c 4ướ
if (x1 <= x2)
{
x = x1;
y += i;
ToMauBien(x, y, i);
}
}
catch (Exception e)
{
MessageBox.Show("X y ra l i trong quá trình tô màu Theo ngả ỗ Đườ
Biên!\n" + e);
}
}
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
3. 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: A
1
, A
2
, …, A

n
• 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: x
0
, x
1
, x
2
,…, x
2k
.
o Bước 4: Nối các giao điểm x
2i
+ 1 và x
2i+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
Hình 4: Mô tả thuật toán Tô Màu Theo Dòng Quét.
Nhóm 7 – Lớp KHMT1K5 Trang 15
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
c. Cài đặt cụ thể thuật toán bằng ngôn ngữ C#.

Nhóm 7 – Lớp KHMT1K5 Trang 16
private void ToMauDongQuet()
{
try
{
for (int ys = Min(DinhY, SoPt) + 1; ys < Max(DinhY, SoPt); ys++)
{
int[] GiaoDiem = new int[SoPt];
int sogd = 0;
for (int i = 0; i < SoPt - 1; i++)
{
//tr ng h p xét ys n u n m trong đo n DinhY[i] -> DinhY[i+1] thì có giaoườ ợ ế ằ ạ
đi mể
if ((DinhY[i] <= ys && ys < DinhY[i + 1]) || (DinhY[i] > ys && ys
>= DinhY[i + 1]))
{
GiaoDiem[sogd] = DinhX[i] + (int)((ys - DinhY[i]) * ((float)
(DinhX[i + 1] - DinhX[i]) / (float)(DinhY[i + 1] - DinhY[i])));
sogd++;
}
}
//tr ng h p xét c nh có 2 đ u mút là đ nh đ u tiên và đ nh cu i cùngườ ợ ạ ầ ỉ ầ ỉ ố
if ((DinhY[0] <= ys && ys < DinhY[SoPt - 1]) || (DinhY[0] > ys &&
ys >= DinhY[SoPt - 1]))
{
GiaoDiem[sogd] = DinhX[SoPt - 1] + (int)((ys - DinhY[SoPt - 1]) *
((float)(DinhX[0] - DinhX[SoPt - 1]) / (float)(DinhY[0] - DinhY[SoPt - 1])));
sogd++;
}
//S p x p các giao đi m c a dòng quét ys v i c nh n giác t ng d n theoắ ế ể ủ ớ ạ ă ầ

hoành độ
SapXep(GiaoDiem, sogd);
//Tô màu dòng quét v i các giao đi m đã cóớ ể
for (int i = 0; i < sogd; i += 2)
{
To1Dong(GiaoDiem[i], GiaoDiem[i + 1], ys);
}
}
}
catch (Exception e)
{
MessageBox.Show("X y ra l i trong quá trình tô màu Theo Dòngả ỗ
Quét!\n" + e);
}
}
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
III. Ư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
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óm 7 – Lớp KHMT1K5 Trang 17
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
đị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.
Nhóm 7 – Lớp KHMT1K5 Trang 18
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
IV. 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
Nhóm 7 – Lớp KHMT1K5 Trang 19
private int Doi(String s)
{
int x;
x = int.Parse(s);
return x;
}
private int KTraDuLieu(String s, String s1)
{
int kt = 1;
try
{

int x = int.Parse(s);
int x1 = int.Parse(s1);
}
catch (Exception)
{
kt = 0;
}
return kt;
}
private bool KTraTaoDinh(int x, int y)
{
if (SoPt > 0)
{
for (int i = 0; i < SoPt; i++)
if ((DinhX[i] == x) && (DinhY[i] == y))
{ return true; }
return false;
}
else
return false;
}
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
4. 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.
Nhóm 7 – Lớp KHMT1K5 Trang 20
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])));
if (GiaoDiem[i] > xs)
sogd++;
}
}
//Ki m tra c nh cu i cùngể ạ ố
if ((DinhY[0] <= ys && ys < DinhY[SoPt - 1]) || (DinhY[0] > ys && ys >=
DinhY[SoPt - 1]))
{
GiaoDiem[SoPt - 1] = DinhX[SoPt - 1] + (int)((ys - DinhY[SoPt - 1]) *
((float)(DinhX[0] - DinhX[SoPt - 1]) / (float)(DinhY[0] - DinhY[SoPt - 1])));
if (GiaoDiem[SoPt - 1] > xs)
sogd++;
}
if (sogd % 2 == 0) //N u s giao đi m ch n t c là đi m n m ngoài.ế ố ể ẵ ứ ể ằ
{ kt = 0; }

//Ki m tra đi m có n m trên c nh ho c đ nh c a đa giác hay khôngể ể ằ ạ ặ ỉ ủ
else
{
Bitmap bm = new Bitmap(pictureBox1.Image);
if(SsMau(bm.GetPixel(xs, ys), mv))
{ kt = 0; }
else
{ kt = 1; }
}
return kt;
}
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
PHẦ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ở.
Hình 6: Click chuột trái vào Vùng Tạo Hình Vẽ để vẽ hình.
Nhóm 7 – Lớp KHMT1K5 Trang 21
Click chuột trái
vào “Vùng Tạo
Hình Vẽ” ở chính
giữa để vẽ hình.
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
Hình 7: Nếu chọn Tô Màu Loang hoặc Tô Màu Biên thì click chuột phải vào bên trong
hình vẽ và nhấn nút tô màu.
Hình 8: Nếu sử dụng phép tô màu Vết Dầu Loang nên vẽ hình nhỏ để tránh bị
treo máy.
Nhóm 7 – Lớp KHMT1K5 Trang 22
Click chuột phải
vào hình vẽ để

lấy chính xác
tọa độ 1 điểm
nằm trong hình.
Sau khi đã có
tọa độ điểm nằm
trong hình vẽ thì
nhấn nút tô
màu.
Sau khi click chuột phải, tọa độ
tại điểm Click sẽ ở trong này.
Riêng tô màu Loang
người dùng nên vẽ
hình nhỏ để tránh bị
treo máy vì thiếu bộ
nhớ.
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
Hình 9: Nếu sử dụng phép Tô Màu Dòng Quét thì không phải chọn trước điểm nằm
trong hình vẽ mà nhấn nút tô màu luôn.
II. Hướng Dẫn Tạo Đa Giác Bằng Cách Nhập Tọa Độ Cụ Thể.
Hình 10: Nhấn vào nút Nhập Tọa Độ để sang chế độ tạo đa giác bằng nhập số.
Nhóm 7 – Lớp KHMT1K5 Trang 23
Với tô màu Dòng Quét
thì không cần chọn điểm
nằm trong hình vẽ mà
có thể nhấn nút tô luôn.
Nhấn vào nút Nhập
Tọa Độ để chuyển chế
độ tạo đa giác từ Click
sang nhập tay từng
đỉnh.

Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
Hình 11: Nhập vào Hoành Độ và Tung Độ để tạo đỉnh đa giác.
Hình 12: Sau khi nhập đủ các đỉnh đa giác theo ý muốn thì tô màu đa giác
bình thường.
Nhóm 7 – Lớp KHMT1K5 Trang 24
Nhập lần lượt Hoành
Độ và Tung Độ của
đỉnh đa giác rồi nhấn
nút “Nhập Tọa Độ”.
Nhập lần lượt Hoành
Độ và Tung Độ của
đỉnh đa giác rồi nhấn
nút “Nhập Tọa Độ”.
Sau khi vẽ hình thì tô màu
như bình thường (riêng
với tô Biên và tô Loang
phải tọa độ điểm nằm
trong hình vẽ trước khi tô
màu).
Báo cáo Bài Tập Lớn môn học Đồ Họa Máy Tính
III. Một Số Chức Năng Khác Trong Chương Trình.
Hình 13: Chức năng đổi màu vẽ, màu tô, màu nền giúp người dùng có thêm sự
lựa chọn.
Hình 14: Chức năng Vẽ Lại.
Nhóm 7 – Lớp KHMT1K5 Trang 25
Nhập lần lượt Hoành
Độ và Tung Độ của
đỉnh đa giác rồi nhấn
nút “Nhập Tọa Độ”.
Nếu người dùng muốn thay đổi

màu vẽ, màu tô, màu nền có thể
nhấn vào nút đổi màu tương ứng.
Nút chức năng “Vẽ Lại”
dùng khi người dùng
muốn hủy bỏ đa giác
đang vẽ và vẽ lại từ đầu.

×