1 Khái niệm và lịch sử về đồ họa máy tính1.1 Khái niệm Đồ họa máy tính là một lĩnh vực của khoa học máy tính và kỹ thuật mà nó nghiên cứu và áp dụng các phương pháp để tạo ra và xử lý hì
Trang 1ĐẠI HỌC BÁCH KHOA HÀ NỘI
KHOA TOÁN - TIN
—–o0o—–
BÀI TẬP LỚN GIỮA KÌ
MÔN KĨ THUẬT LẬP TRÌNH
ĐỀ TÀI
ĐỒ HỌA TRONG NGÔN NGỮ LẬP TRÌNH
C/C++
Sinh viên thực hiện: Nguyễn Tất Cường
MSSV:20227090 Giảng viên hướng dẫn: TS Nguyễn Thị Thanh Huyền
Hà Nội , 5/2024
Trang 2Lời nói đầu
Lời đầu tiên, em xin gửi lời cảm ơn đến Khoa Toán -Tin, Đại học Bách khoa Hà Nội đã tạo cơ hội cho em thực hiện báo cáo bài tập lớn trong một môi trường tốt nhất nhằm đáp ứng yêu cầu hoàn thành báo cáo của em
Đặc biệt, em xin bày tỏ lòng biết ơn sâu sắc đến giảng viên TS.Nguyễn Thị Thanh Huyền, người đã giảng dạy, hướng dẫn và hỗ trợ em rất nhiều trong suốt thời gian qua
Cuối cùng, em xin gửi lời cảm ơn tới các anh chị cựu sinh viên Khoa Toán - Tin, sự hỗ trợ, hợp tác của bạn
bè đã giúp đỡ và truyền đạt những kinh nghiệm quý báu cho quá trình học tập của em
Do kiến thức còn hạn chế nên báo cáo của em hoàn toàn không thể tránh khỏi nhứng thiếu sót và sai sót
Vì vậy, em rất mong nhận được một số ý kiến đóng góp của cô giáo
Trân trọng cảm ơn Người báo cáo Nguyễn Tất Cường
Trang 3Mục lục
1 Khái niệm và lịch sử về đồ họa máy
1.1 Khái niệm 3
1.2 Lịch sử 3
2 Đồ họa trong ngôn ngữ lập trình 4 2.1 Khái niệm 4
2.2 Giới thiệu một số các thư viện/API đồ họa 4
3 Khái quát ngôn ngữ lập trình C 5 3.1 Khái niệm 5
3.2 Đặc trưng 5
4 Lập trình đồ họa với OpenGL và Glut trong C/C++ 6 4.1 Tổng quan về OpenGL và Glut 6
4.2 Giới thiệu phần mềm Dev C++ 6
4.3 Hướng dẫn cài đặt Dev C++ và Glut 7
4.4 Hệ màu RGB trong đồ họa máy tính 8
4.5 Tọa độ vẽ 9
4.6 Chương trình C++ sử dụng OpenGL và Glut 10
4.7 Các hàm trong thư viện OpenGL 11
4.8 Thực hành 14
Trang 41 Khái niệm và lịch sử về đồ họa máy tính
1.1 Khái niệm
Đồ họa máy tính là một lĩnh vực của khoa học máy tính và kỹ thuật mà nó nghiên cứu và áp dụng các phương pháp để tạo ra và xử lý hình ảnh và đối tượng
đồ họa trên máy tính
1.2 Lịch sử
Vào thời kì sơ khai của máy tính, con người chỉ có thể giao tiếp với máy tính thông qua các dòng lệnh, được gọi là Command line interface hoặc Text-base interface vì màn hình chỉ hiển thị các kí tự Những năm 1970, một cuộc cách mạng đã diễn ra làm thay đổi cách thức con người sử dụng máy tính từ môi trường dòng lệnh sang môi trường đồ họa Máy tính lúc này có thể hiển thị hình ảnh, màu sắc Nhiều khái niệm đã được sinh ra như Icon, Window, Mouse,
và đó cũng chính là kỷ nguyên của đồ họa máy tính Chương trình đồ họa hiện diện khắp mọi nơi và thúc đấy ngành công nghiệp máy tính cá nhân Ứng dụng phổ biến mà ta có thể thấy đó là đồ họa trong game
Trang 52 Đồ họa trong ngôn ngữ lập trình
2.1 Khái niệm
Đồ họa trong ngôn ngữ lập trình thường được định nghĩa là việc tạo ra và điều khiển hình ảnh, đồ vật,
và hiệu ứng trực quan trên màn hình máy tính hoặc các thiết bị khác Điều này thường bao gồm việc sử dụng các thư viện hoặc frameworks để vẽ hình, thực hiện chuyển động, và tương tác với người dùng Đồ họa trong lập trình có thể bao gồm việc vẽ các hình học cơ bản như đường thẳng, hình tròn, hình chữ nhật, cũng như vẽ hình ảnh phức tạp hơn như các đối tượng 3D, hiệu ứng đặc biệt và giao diện người dùng đồ họa (GUI)
2.2 Giới thiệu một số các thư viện/API đồ họa
•OpenGL
•Vulkan
•Graphics
•Pygame
•Three.js
Trang 63 Khái quát ngôn ngữ lập trình C
3.1 Khái niệm
C là một ngôn ngữ mệnh lệnh được phát triển từ đầu thập niên 1970 bởi Dennis Ritchie để dùng trong hệ điều hành UNIX Từ đó, ngôn ngữ này đã lan rộng
ra nhiều hệ điều hành khác và trở thành một những ngôn ngữ phổ dụng nhất C là ngôn ngữ rất có hiệu quả và được ưa chuộng nhất để viết các phần mềm hệ thống, mặc dù nó cũng được dùng cho việc viết các ứng dụng Ngoài ra, C cũng thường được dùng làm phương tiện giảng dạy trong khoa học máy tính mặc
dù ngôn ngữ này không được thiết kế dành cho người nhập môn
3.2 Đặc trưng
•Đơn giản và có cấu trúc
•Tính linh động trên nhiều nền tảng
•Hiệu suất cao
•Hỗ trợ hàm
•Cộng đồng lớn
Trang 74 Lập trình đồ họa với OpenGL và Glut trong C/C++
4.1 Tổng quan về OpenGL và Glut
-OpenGL là một bộ thư viện đồ họa để xây dựng các đối tượng và thao tác cần thiết trong các ứng dụng đồ họa 2D, 3D
-OpenGL không có chức năng cho các hoạt động cửa
sổ, ví dụ như tạo, thay đổi kích thước, nên OpenGL không hoạt động một mình mà phải liên kết với các thư viện khác như Glut, Glew
4.2 Giới thiệu phần mềm Dev C++
-Dev-C++ là một môi trường phát triển tích hợp (IDE) đầy đủ tính năng miễn phí được phân phối theo Giấy phép Công cộng GNU để lập trình trong C và C++ Dev-C++ được đóng gói và sử dụng MinGW hoặc TDM-GCC 64bit của GCC làm trình biên dịch nên người dùng có thể dễ dàng sử dụng ngay khi tải về -Phần mềm Dev C++ đã được tích hợp thư viện OpenGL nên muốn lập trình đồ họa người dùng cần tải và liên kết các file của thư viện Glut để dễ dễ dàng thao tác
Trang 84.3 Hướng dẫn cài đặt Dev C++ và Glut
-Bước 1 : Tải file Dev C++.exe trên trang chủ Dev C++, sau đó cài đặt trên máy tính
-Bước 2 : Tìm kiếm và tải xuống folder zip của Glut trên trang chủ OpenGL, sau đó giải nén
-Bước 3: Thực hiện copy các tệp tin glut.h, libglut32.a, glut32.dll theo thứ tự và paste lần lượt vào các thư mục GL trong folder Dev C++, thư mục lib trong folder Dev C++, thư mục SysWOW64 trong folder Window
-Bước 4: Tạo 1 project trên Dev C++ và liên kết đến các file cần thiết : libopengl32.a, libglu32.a, libglut32.a (Tất cả các flie này đều nằm trong folder lib của Dev C++)
-Bước 5 : Kiểm thử chương trình và thu kết quả
Hình 1: Kết quả thu được
Trang 94.4 Hệ màu RGB trong đồ họa máy tính
-Màu trong đồ họa máy tính được phối từ 3 màu cơ bản là Đỏ,Xanh lá,Xanh dương được kí hiệu lần lượt
là R,G,B
-Các giá trị R,G,B đều có khoảng giá trị là [0,255] Khi muốn tạo ra 1 màu sắc khác, máy tính sẽ thực hiện việc "pha trộn" bằng cách lấy các giá trị R,G,B khác nhau để phối thành 1 màu
-Ví dụ: (R,G,B)=(255,0,0) là màu đỏ
(R,G,B)=(85,85,85) là màu xám
-Để tạo ra các khung hình/hình ảnh có nhiều màu, máy tính cần ghép rất nhiều các pixel lại với nhau, mỗi pixel là một cách phối màu
Hình 2: Hệ màu RGB
Trang 104.5 Tọa độ vẽ
Khái niệm trong tọa độ vẽ
-Là hệ tọa độ để vẽ lên các hình hoặc vật thể gồm
3 trục x,y,z là các trục theo chiều dài, chiều rộng và chiều cao của vật thể
Sự ảnh hưởng của tọa độ vẽ
Hình 3: Ảnh hưởng của tọa độ vẽ
Trang 114.6 Chương trình C++ sử dụng OpenGL và Glut
Hình 4: Cấu trúc chương trình
Hình 5: Chương trình mẫu
Trang 124.7 Các hàm trong thư viện OpenGL
Một số hàm quản lý cửa sổ của Glut
•glutInit(int *argc, char **argv):Cấu hình môi trường đồ họa cho chương trình
int *argc: Con trỏ tới một biến kiểu số nguyên, đại diện cho số lượng đối số được truyền từ dòng lệnh khi chạy chương trình
char **argv: Một mảng con trỏ tới các chuỗi ký
tự, đại diện cho các đối số được truyền từ dòng lệnh khi chạy chương trình
•gluInitDisplayMode(unsigned int mode):Thiết lập các chế độ hiển thị cửa sổ
unsigned int mode:Một số nguyên không dấu (unsigned int) đại diện cho các chế độ hiển thị muốn được thiết lập
GLUT RGB:Sử dụng không gian màu RGB cho cửa sổ đồ họa
GLUT RGBA:Sử dụng không gian màu RGBA (bao gồm kênh alpha) cho cửa sổ đồ họa
GLUT SINGLE:Sử dụng cửa sổ đồ họa với một
bộ đệm đơn
GLUT DOUBLE:Sử dụng cửa sổ đồ họa với hai
bộ đệm, cho phép vẽ kép (double buffering)
GLUT DEPTH:Sử dụng kích thước đệm sâu để hiển thị không gian 3D
Trang 13•glutInitWindowPosition(int x, int y):Thiết lập vị trí ban đầu của cửa sổ đồ họa
x: Hoành độ của cửa sổ trên màn hình
y: Tung độ của cửa sổ trên màn hình
•glutInitWindowSize(int width, int height):Thiết lập kích thước ban đầu của cửa sổ đồ họa
width: Chiều rộng của cửa sổ đồ họa(pixel)
height: Chiều cao của cửa sổ đồ họa(pixel)
•glutCreateWindow(const char *title):Tạo
1 cử sổ đồ họ và đặt tên của nó
title: Tên của cửa sổ đồ họa
Một số hàm quản lý sự kiện của Glut
•glutKeyboardFunc()(*):Gọi hàm xử lý sự kiện khi nhấn trên bàn phím
•glutMouseFunc()(*):Gọi hàm xử lý sự kiện khi kick chuột
•glutIdleFunc()(*):Gọi hàm xử lý sự kiện khi không có sự kiện xảy ra
•glutDisplayFunc()(*):Gọi hàm xử lý sự kiện khi hiển thị cửa sổ
•glutReshapeFunc()(*):Gọi hàm xử lý sự kiện khi kích thước cửa sổ thay đổi
(*):Hàm có tham số truyền vào là hàm
Trang 14Một số hàm quan trọng trong chương trình
•glClearColor(GLfloat red, GLfloat green,
GLfloat blue, GLfloat alpha):Thiết lập màu nền cho cửa sổ
red, green, blue, alpha: Các giá trị màu trong phạm vi từ 0.0 đến 1.0
•glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top,
GLdou-ble nearVal, GLdouGLdou-ble farVal)): Thiết lập tọa độ vẽ
left, right, bottom, top, nearVal, farVal: Cận trái, cận phải, cận dưới, cận trên, giới hạn trước, giới hạn sau của khối hộp để vẽ vật thể
•glClear(GLbitfield mask): Xóa nội dung vùng đệm
GLbitfield mask: Chỉ định vùng đệm cần xóa
•glViewport(GLint x, GLint y, GLsizei width,
GLsizei height): Thiết lập kích thước,vị trí view-port trên cửa sổ của OpenGL
x, y: Tọa độ góc dưới bên trái của viewport
width, height: Chiều rộng và chiều cao của view-port
•glBegin(GLenum mode): Bắt đầu 1 chuỗi các lệnh vẽ hình
mode: Chỉ định loại hình vẽ
Trang 154.8 Thực hành
Chương trình vẽ đường thẳng
Hình 6: Chương trình vẽ đường thẳng
-Đoạn code trên viết thuật toán vẽ đường thẳng thông qua hàm LineMidPoint với 2 điểm đầu và điểm cuối, hàm glBegin chọn chế độ vẽ là GL POINTS-vẽ đường thẳng Kết hợp với hàm gl.Vertex2i để hiển thị các điểm vẽ, cuối cùng thuật toán vẽ được gọi trong hàmmydisplay để hiển thị đường thẳng
Trang 16Chương trình vẽ hình vuông
Hình 7: Chương trình vẽ hình vuông
-Trong hàmmydisplay chọn màu vẽ thông qua hàm glCorlor3f, sau đó chọn chế độ vẽ đa giác trong hàm glBegin là GL POLYGON và vẽ hình vuông theo tọa
độ 4 điểm
Trang 17Hình 9: Chương trình vẽ hình elip
Trang 185 Kết luận
-Đồ họa trong C/C++ là một lĩnh vực rộng, đã có rất nhiều thư viện được tạo ra để phát triển lĩnh vực này giúp người dùng dễ dàng sử dụng và ứng dụng trong công việc lập trình
-Trong khuôn khổ bài báo cáo này, em đã tìm hiểu và viết báo cáo về thư viện OpenGL và Glut, qua quá trình tìm hiểu bản thân em đã học được nhiều kiến thức bổ ích và tổng hợp trong những phần trên, em mong cô sau khi đọc sẽ có những góp ý để em có thể hoàn thiện để có được bài báo cáo tốt nhất Em xin chân thành cảm ơn!