xây dựng chương trình, tìmkiếm trên bề rộng đồ thị, hiển thị ở nhiều dạng, như 2D, 3D, học phần đồ họa máy tính, báo cáo bài tập lớn
Trang 1TRƯỜ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.
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
Trang 2TRƯỜ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
dụng thư viện openGL
Trang 34 Yêu cầu
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)
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
Trang 4M c L c ụ ụ
1 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
2 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
3 KẾT LUẬN 16
Trang 5LỜ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
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ể
Trang 61 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ừ
http://www.microsoft.com/express/Downloads/
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
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)
Trang 7 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
SDKs\Windows\v7.0A\Lib
Với phiên bản Windows 64bit (viết ứng dụng 32 bit và 64 bit)
Files(x86)\Microsoft SDKs\Windows\v7.0A \Include\gl
Files(x86)\Microsoft SDKs\Windows\v7.0A\Lib
Files(x86)\Microsoft SDKs\Windows\v7.0A\Lib\x64
C:\windows\SysWOW64
III Cài đặt GLEW (Nên cài đặ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
Files\Microsoft SDKs\Windows\v7.0A\Include\gl
C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib
C:\windows\system32
Với phiên bản Windows 64bit
Trang 8 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
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
- 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
Trang 92 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
{
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
2.2.2 Hàm truy n t a đ đ v các hình trong ề ọ ộ ể ẽ
Trang 10void 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.ẽ ườ ẳ
{
glVertex2i(400, 400 - 20);
glVertex2i(400, 300 + 20);
glVertex2i(400, 300 - 20);
glVertex2i(400, 200 + 20);
glEnd();
glFlush();
Trang 11Để 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
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, floatx, float y) // truyền giá trị vào trong hình tròn
{
unsignedint i;
glRasterPos2f(x, y);
for (i = 0; i < strlen(s); i++)
Trang 12Xâ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à 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
đỉ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
Trang 13tì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
Queue ban đầu rỗng
while (not empty())
{
for (v = 1; v <= n; v++)
{
} }
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;
Trang 14int 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.
Trang 152.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
Trang 163 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 !