Tải bản đầy đủ (.docx) (16 trang)

xây dựng chương trình tìm kiếm trên bề rộng đồ thị hiển thị ở nhiều dạng như 2D, 3D

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 (396.1 KB, 16 trang )

TRƯỜNG ĐẠI HỌC HÀNG HẢI VIỆT NAM
KHOA CÔNG NGHỆ THÔNG TIN
-----***-----

BÁO CÁO BÀI TẬP LỚN
HỌC PHẦN “ĐỒ HỌA MÁY TÍNH”
Đề tài:
XÂY DỰNG CHƯƠNG TRÌNH TÌM KIẾM KIẾM TRÊN BỀ RỘNG ĐỒ
THỊ. ĐỒ THỊ HIỂN THỊ Ở NHIỀU DẠNG NHƯ 2D,3D.
GVHD:

ThS. Nguyễn Hạnh Phúc

Sinh viên thực hiện:

Nguyễn Văn Hoan– Mã sv: 68651
Nguyễn Văn Linh – Mã sv: 34567

Hải Phòng, tháng 04 năm 2019


TRƯỜNG ĐẠI HỌC HÀNG HẢI
KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN KHOA HỌC MÁY TÍNH
-----***-----

BÀI TẬP LỚN
HỌC PHẦN: ĐỒ HỌA MÁY TÍNH
Mã đề tài: 03
1. Tên đề tài
Xây dựng chương trình tìm kiếm theo bề rộng trên đồ thị. Đồ thị hiển thị ở


nhiều dạng như 2D,3D.
2. Mục đích
Xây dựng chương trình tìm kiếm theo bề rộng trên đồ thị. Sử dụng đồ họa máy
tính và thư viện OpenGL.
3. Công việc cần thực hiện
 Tìm hiểu về thuật toán BFS ( Breadth First Search ) và các kĩ thuật đồ họa sử
dụng thư viện openGL.
 Xây dựng hàm thuật toán tìm kiếm theo bề rộng trên đồ thị.
 Xây dụng hàm vẽ hình tròn để mô tả các điểm trên đồ thị.
 Xây dựng hàm vẽ đường thẳng mục đích nối các điểm trên đồ thị.
 Xây dựng hàm truyền giá trị cho các điểm. Mục đích đánh dấu các điểm.
 Xây dựng một chương trình hoàn trỉnh bằng việc sử dụng các hàm trên
 Làm báo cáo bài tập lớn
 Bảo vệ bài tập lớn


4. Yêu cầu
 Kết quả làm bài tập lớn: Báo cáo bài tập lớn
 Báo cáo bài tập lớn phải được trình bày theo mẫu quy định (kèm theo), báo
cáo có thể kết xuất thành tệp định dạng PDF và nộp qua email (không bắt
buộc phải in ấn)
 Hạn nộp báo cáo bài tập lớn: 21/04/2019.
5. Tài liệu tham khảo
- Trịnh Thị Vân Anh, Kỹ Thuật Đồ Họa NXB HVCN BCVT, 2006.
- Bài giảng Đồ Họa Máy Tính Khoa CNTT, ĐH HH VN.
Hải Phòng, tháng 04 năm 2019
NGƯỜI HƯỚNG DẪN


Mục Lục

1.

2.

3.

TÌM HIỂU CHƯƠNG TRÌNH........................................................................................................................6
1.1

Nền tảng của chương trình...............................................................................................................6

1.2

Giới thiệu về chương trình...............................................................................................................6

1.3

Cách thêm thư viện openGL trên Visual Studio...............................................................................6

CẤU TRÚC DỮ LIỆU VÀ HÀM TRONG CHƯƠNG TRÌNH............................................................................9
2.1

Cấu trúc dữ liệu.................................................................................................................................9

2.2

Các hàm trong chương trình.............................................................................................................9

2.2.1


Hàm vẽ hình tròn......................................................................................................................9

2.2.2

Hàm truyền tọa độ để vẽ các hình trong.................................................................................9

2.2.3

Hàm vẽ đường thẳng..............................................................................................................10

2.2.4

Hàm truyền số vào trong hình tròn........................................................................................11

2.2.5

Hàm thuật toán bfs.................................................................................................................12

2.2.6

Hàm Main................................................................................................................................15

KẾT LUẬN.................................................................................................................................................16


LỜI MỞ ĐẦU
Như chúng ta đã thấy trong những năm gần đây sự phát triển vượt bậc về công
nghệ đồ họa đã mang lại cho con người chúng ta vô vàn sự tiện nghi, những trải
nghiệm mới mẻ, chân thực.
Vậy đồ họa máy tính là gì : Đồ họa máy tính là phương pháp và công nghệ

dùng trong việc chuyển đổi qua lại giữa dữ liệu và hình ảnh bằng máy tính. Đồ họa
máy tính là một lĩnh vực của khoa học máy tính nghiên cứu về ở toán học, các
thuật toán cũng như các kĩ thuật để cho phép tạo, hiển thị và điều khiển hình ảnh
trên màn hình máy tính. Đồ họa máy tính có liên quan ít nhiều đến một số lĩnh vực
như đại số, hình học giải tích, hình học họa hình, quang học,... và kĩ thuật máy tính,
đặc biệt là chế tạo phần cứng (các loại màn hình, các thiết bị xuất, nhập, các vỉ
mạch đồ họa...).
Là sinh viên khoa Công nghệ thông tin trường Đại học Hàng Hải Việt Nam.
Chúng em cũng được tiếp xúc với môn học đồ họa máy tính. Với những kiến thức
em đã được học và được sự hướng dẫn của thầy Nguyễn Hạnh Phúc chúng em đã
thực hiện đề tài “ Xây dựng chương trình tìm kiếm theo bề rộng trên đồ thị. Đồ thị
hiện thị ở nhiều dạng 2D, 3D”. Trong quá trình thực hiện nghiên cứu chúng em đã
sử dụng thư viện đồ họa openGL đang được sử dụng rộng rãi hiện nay.
Có lẽ rằng chương trình và báo cáo của chúng em chưa được chuyên nghiệp,
hoàn chỉnh nhất, còn có những thiếu xót. Vì thế em rất mong thầy cô và các bạn có
thể góp ý để nhóm em xây dựng đề đạt kết quả tốt nhất có thể.


1. TÌM HIỂU CHƯƠNG TRÌNH
1.1Nền tảng của chương trình.
 Chương trình được viết bằng ngôn ngữ lập trình C++.
 Chương trình có sử dụng thư viện đồ họa hỗ trợ là OpenGl.
1.2Giới thiệu về chương trình.
Chương trình tìm kiếm theo bề rộng của đồ thị.
Để thục hiện chương trình chúng ta cần nhập vào số cạnh của đồ thị. Các điểm nối
với nhau của đồ thị và một điểm bắt đầu để duyệt đồ thị.
Trong chương trình có sử dụng thư viện openGl vì thế để chạy chương trình mà
không phát sinh lỗi thì chúng ta nên thêm thư viện openGL vào IDE mà bạn đnag
lập trình.
1.3Cách thêm thư viện openGL trên Visual Studio.

I. Cài đặt Visual Studio Nếu chưa cài đặt Visual Studio trên máy tính chúng ta thực
hiện 2 bước sau .
1. Tải tập tin cài đặt Visual Studio C++ từ
/>2. Thực thi tập tin cài đặt và làm theo hướng dẫn để cài đặt Visual Studio C++.
II. Cài đặt thư viện GLUT
1. Tải tập tin "glut-3.7.6-bin-32and64.zip" từ />12ncmty5g6mgr7t
2. Giải nén tập tin glut-3.7.6-bin-32and64.zip ra thư mục glut-3.7.6-bin
3. Trong thư mục glut-3.7.6-bin:
Với phiên bản Windows 32bit (viết ứng dụng 32 bit)


 Sao chép tập tin glut.h và glut.def vào thư mục C:\Program Files\Microsoft
SDKs\Windows\v7.0A\Include\gl
 Sao chép tập tin glut32.lib vào thư mục C:\Program Files\Microsoft
SDKs\Windows\v7.0A\Lib
 Sao chép tập tin glut32.dll vào thư mục C:\windows\system32\
Với phiên bản Windows 64bit (viết ứng dụng 32 bit và 64 bit)
 Sao chép tập tin glut.h và glut.def vào thư mục C:\Program
Files(x86)\Microsoft SDKs\Windows\v7.0A \Include\gl
 Sao chép glut32.lib và glut64.lib vào thư mục C:\Program
Files(x86)\Microsoft SDKs\Windows\v7.0A\Lib
 Sao chép glut32.lib và glut64.lib vào thư mục C:\Program
Files(x86)\Microsoft SDKs\Windows\v7.0A\Lib\x64
 Sao chép tập tin glut32.dll và glut64.dll vào thư mục
C:\windows\SysWOW64
 Sao chép tập tin glut32.dll và glut64.dll vào thư mục C:\windows\system32
III. Cài đặt GLEW (Nên cài đặt)
Tải tập tin "Windows 32-bit and 64-bit Binaries" từ />Giải nén tập tin glew-1.10.0-win32.zip vào thư mục có tên glew
Với phiên bản Windows 32bit
 Sao chép tất cả tập tin trong thư mục include/GL vào thư mục C:\Program

Files\Microsoft SDKs\Windows\v7.0A\Include\gl
 Sao chép tập tin glew32.lib trong thư mục lib/Release/Win32/ vào thư mục
C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib
 Sao chép tập tin glew32.dll trong thư mục bin/Release/Win32/ vào thư mục
C:\windows\system32
Với phiên bản Windows 64bit


 Sao chép tất cả tập tin trong thư mục include/GL vào thư mục C:\Program
Files(x86)\Microsoft SDKs\Windows\v7.0A \Include\gl
 Sao chép tập tin glew32.lib trong thư mục lib/Release/x64/ vào thư mục
C:\Program Files(x86)\Microsoft SDKs\Windows \v7.0A\Lib
Sao chép tập tin glew32.dll trong thư mục bin/Release/x64/ vào thư mục
C:\windows\SysWOW64
IV. Tạo Visual Studio C++ project với OpenGL
- Mở chương trình Visual Studio C++.
- Nhấn vào mục Create new project trong Visual Studio
- Lựa chọn Win32 Console Application, nhập tên của project và nhấn nút OK
- Trong cửa sổ wizard hiện ra sau đó, nhấn vào mục Application Settings và
chọn mục Empty Project, sau đó nhấn nút Finish.
- Lựa chọn Add New Item từ Project menu, sau đó chọn loại tập tin cpp, nhập
tên tập tin và nhấn OK.
- Nội dung trong tập tin mã nguồn vừa thêm như phần V dưới đây
- Nhấn chuột phải vào Project và chọn Properties
- Ở cửa sổ vừa hiện ra, ở trên cùng, đổi Configuration thành All
Configuraitons.
- Ở phía bên cột bên trái, chọn Linker  Input
- Khi đó ở phía bên phải sẽ hiện ra danh mục, trong đó có mục Addititonal
Dependencies, thêm ";glut32.lib" vào sau mục này, nếu có sử dụng glew,
cũng thêm cả ";glew32.lib" vào sau đó.

- Nhấn nút OK và chọn Build Solution từ Build menu.
- Thực thi chương trình bằng cách nhấn tổ hợp phím Ctrl+F5.
- Nếu cài đặt đúng chính xác tất cả các bước, chương trình khi thực thi sẽ có
kết quả như sau


2. CẤU TRÚC DỮ LIỆU VÀ HÀM TRONG CHƯƠNG TRÌNH

2.1Cấu trúc dữ liệu.
 Bước 1: khi chạy chương trình.
 Bước 2: Nhập vào số cạnh của đồ thị.
 Bước 3: Nhập vào một điểm bắt đầu để duyệt đồ thị.
 Bước 4: kết quả sẽ hiển thị cách mà thuật toán bfs duyệt đồ thị của bạn.
2.2Các hàm trong chương trình.
2.2.1

Hàm vẽ hình tròn.

void DrawCircle(float cx, float cy, float r)
{
glBegin(GL_LINE_LOOP);
for (int ii = 0; ii <1000; ii++)
{
float theta = 2.0f * 3.1415926f * float(ii) / float(1000);
float x = r * cosf(theta);//calculate the x component
float y = r * sinf(theta);//calculate the y component
glVertex2f(x + cx, y + cy);//output vertex
}
glEnd();
}

Chức năng của hàm là : vẽ hình tròn tương ứng với các điểm trong đồ thị . Tham số
truyền vào hàm bao gồm tọa độ tâm hình tròn và bán kính.
glBegin(GL_LINE_LOOP); sẽ giúp chúng ta vẽ đường gấp khúc khép kín.
2.2.2

Hàm truyền tọa độ để vẽ các hình trong 


void TruyenDiem() // Truyền tọa độ vào để vẽ hình tròn
{
DrawCircle(400, 400, 20);
DrawCircle(400, 300, 20);
}
Do chúng ta đã xây dựng được một hàm vẽ hình tròn. Để sử dụng hàm này chúng
ta xây dựng một hàm TruyenDiem() để có thể vẽ ra các hình tròn tại vị trí khác
nhau . Thông tin truyền vào hàm bao gồm tọa độ tâm (X,Y) và bán kính của hình
tròn.
Kết quả ta có :

2.2.3

Hàm vẽ đường thẳng.

void VeDuongThang() // truyền điểm vào để vẽ đường thẳng
{
glBegin(GL_LINES);
glVertex2i(400, 400 - 20);
glVertex2i(400, 300 + 20);
glVertex2i(400, 300 - 20);
glVertex2i(400, 200 + 20);

glEnd();
glFlush();


}
Để nối được các hình tròn lại với nhau chúng ta cần một hàm vẽ đường thẳng để
làm việc đó. Xây dựng một hàm vẽ đường thẳng. Trong hàm này sẽ sử dụng
glBegin(GL_LINES); cho phép vẽ các đường. glVertex2i(400, 400 - 20);
glVertex2i(400, 300 + 20); trong đó chúng ta truyền vào vị trí của 2 điểm cần nối .
Như vậy chúng ta sẽ nối được 2 hình tròn lại với nhau.
Kết quả

2.2.4

Hàm truyền số vào trong hình tròn.

void drawString(void * font, const char *s, float x, float y) // truyền giá trị vào
trong hình tròn
{
unsigned int i;
glRasterPos2f(x, y);
for (i = 0; i < strlen(s); i++)
glutBitmapCharacter(font, s[i]);


}
Xây dựng hàm drawString với 4 giá trị truyền vào hàm. Đối với đối số đầu tiên
mặc định sẽ là: GLUT_BITMAP_HELVETICA_10 . Đối với tham số thứ 2 đó chính là chuỗi
mà chúng ta muốn chuyền vào. Đối số thứ 3 , 4 là tọa độ mà chuỗi chuyền vào sẽ
đứng.

Kết quả ta được

2.2.5

Hàm thuật toán bfs.

Thuật toán bfs là gì:
Trong lý thuyết đồ thị, tìm kiếm theo chiều rộng (BFS) là một thuaật toán tìm
kiếm tỏng đồ thị trong đó việc tìm kiếm chỉ bao gồm 2 thao tác: (a) cho trước một
đỉnh của đồ thị; (b) thêm các đỉnh kề với đỉnh vừa cho vào danh sách có thể hướng
tới tiếp theo. Có thể sử dụng thuật toán tìm kiếm theo chiều rộng cho hai mục đích:
tìm kiếm đường đi từ một đỉnh gốc cho trước tới một đỉnh đích, và tìm kiếm đường
đi từ đỉnh gốc tới tất cả các đỉnh khác. Trong đồ thị không có trọng số, thuật toán


tìm kiếm theo chiều rộng luôn tìm ra đường đi ngắn nhất có thể. Thuật toán BFS
bắt đầu từ đỉnh gốc và lần lượt nhìn các đỉnh kề với đỉnh gốc. Sau đó, với mỗi đỉnh
trong số đó, thuật toán lại lần lượt nhìn trước các đỉnh kề với nó mà chưa được
quan sát trước đó và lặp lại.
Mô tả thuật toán
Free[u] = true; //với mọi u=1...n
Queue ban đầu rỗng.
Push(s); // Đẩy đỉnh đầu tiên vào queue
Free[s] = false; // đánh dấu đỉnh s
while (not empty())
{
u = pop(); // lấy từ queue đỉnh u
for (v = 1; v <= n; v++)
if ((tồn tại cạnh u, v) và Free[v] == true)
{

Free[v] = false; // đánh dấu đỉnh v
Push(v); // đẩy đỉnh v vào queue
}
}
Bước 1 : Lấy điểm đầu tiên cần duyệt đẩy vào Queue . đánh dấu đỉnh đó là đã được
đọc.
Bước 2 : Duyệt tất cả các điểm kề với điểm thứ nhất.
Bước 3 : Duyệt các điểm kề với điểm thứ nhất. Tìm các điểm kề với điểm đang
dược duyệt
Chương trình
#include <bits/stdc++.h>
using namespace std;


int a[101][101];
queue <int> q;
int n,m,Free[101], u,v,s;
void BFS(int s)
{
q.push(s);
Free[s]=0;
while (!q.empty())
{
int u = q.front();
q.pop();
cout << u << endl;
for (int v=1; v<=n; v++)
if (Free[v] && a[u][v]==1)
{
Free[v] = 0;

q.push(v);
}
}
}
int main()
{
cin >> n >> m>> s;
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
a[i][j]=0;
for (int i=1; i<=m; i++)
{
cin >> u>> v;
a[u][v]=1;
a[v][u]=1;
}
for (int i=1; i<=n; i++)
Free[i]=1;
BFS(s);
return 0;
}
Kết quả ta thu được.


2.2.6

Hàm Main 

Chức năng của hàm main là gọi các hàm có trong trương trình và đây là nơi mà
chương trình sẽ khỏi chạy đầu tiên.



3. KẾT LUẬN
Qua việc thực hiện nghiên cứu đề tài “xây dựng chương tình thuật toán tìm kiếm
theo bề rộng của đồ thị .Đồ thị hiển thị ở nhiều dạng 2D, 3D”. Nhóm chúng em đã
được biết thêm rất nhiều về môn đồ họa máy tính. Đặc biệt hiểu rõ hơn về thuật
toán bfs . Bên cạnh đó, việc làm nghiên cứu giúp chúng em đoàn kết hơn, rèn luyện
cho chúng e kỹ năng làm viễ nhóm.
Trong quá trình thực hiện đề tài có rất nhiều ý tưởng hay, độc đáo. Nhưng do
kiến thức của chúng em hạn hẹp và thời gian không cho phép nên chúng em chưa
thể thực hiện được những ý tưởng đó. Tuy nhiên chúng em đã cố gắng để xây dựng
một chương trình hoàn trỉnh nhất, đẹp nhất. Trong quá trình xây dựng chương trình
nhóm chúng em khó tránh khỏi những sai sót. Vì vậy em rất mong rằng thầy và các
bạn cùng góp ý với nhóm em để có thể hòa thành sản phẩm một cách hoàn trỉnh
nhất.
Chúng em xin cảm ơn thầy Nguyễn Hạnh Phúc đã tận tình giảng dạy chúng em
trong môn Đồ họa máy tính. Giúp đỡ chúng em trong quá trình nghiên cứu đề tài.
Chia sẻ những tài liệu hay về thư viện OpenGl cũng như các kĩ năng nập trình.
Một lần nữa chúng em xin chân thành cảm ơn !



×