TRƯƠNG ĐAI HOC CÔNG NGHIÊP HA NÔI
KHOA CÔNG NGHÊ THÔNG TIN
------------
BAO CAO BAI TÂP LƠN
MƠN: ĐỒ HOA MAY TÍNH
ĐỀ TÀI: Mơ phỏng hoạt động của một số đồ dùng
trong phịng làm việc.
Giảng viên: Vũ Minh Yến
Lớp: 20213IT6010001
-Hà Nội, 2022-
1
Mục lục
Contents
Lời nói đầu..................................................................................................................................................3
CHƯƠNG I, MƠ TẢ BÀI TỐN.....................................................................................................................4
1.1 Giới thiệu đề tài................................................................................................................................4
1.2 Mơ tả mơ hình và kịch bản..............................................................................................................4
❖
Mơ tả mơ hình............................................................................................................................4
❖
Mơ tả kịch bản............................................................................................................................5
CHƯƠNG II, MỘT SỐ KỸ THUẬT ĐIỂN HÌNH PHÁT TRIỂN CHƯƠNG TRÌNH..............................................7
2.1, Tạo hàm cube dùng chung..............................................................................................................7
2.2, Thiết kế và cài đặt căn phòng cắt lát..............................................................................................7
2.2.1, Mơ hình phân cấp....................................................................................................................7
2.2.2, Kỹ thuật cài đặt........................................................................................................................8
2.3, Thiết kế và cài đặt cửa chính...........................................................................................................8
2.3.1, Mơ hình phân cấp....................................................................................................................8
2.3.2, Kỹ thuật cài đặt........................................................................................................................9
2.4, Thiết kế và cài đặt cửa sổ..............................................................................................................10
2.4.1, Mơ hình phân cấp..................................................................................................................10
2.4.2, Kỹ thuật cài đặt......................................................................................................................10
2.5, Thiết kế và cài đặt ghế..................................................................................................................11
2.5.1, Mơ hình phân cấp..................................................................................................................11
2.5.2, Kỹ thuật cài đặt......................................................................................................................11
2.6, Thiết kế và cài đặt bàn..................................................................................................................13
2.6.1, Mô hình phân cấp..................................................................................................................13
2.6.2, Kỹ thuật cài đặt......................................................................................................................13
2.7, Thiết kế và cài đặt tủ.....................................................................................................................15
2.7.1, Mơ hình phân cấp..................................................................................................................15
2.7.2, Kỹ thuật cài đặt......................................................................................................................15
2.8, Thiết kế và điều khiển phép chiếu, camera..................................................................................16
CHƯƠNG III, KẾT QUẢ CHƯƠNG TRÌNH..................................................................................................19
Kết quả đạt được..................................................................................................................................19
Kết luận.................................................................................................................................................20
2
Lời nói đầu
Đồ 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ề cơ
sở tố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...).
Theo nghĩa rộng hơn, đồ 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 trên màn hình bằng máy
tính. Đồ họa máy tính hay kĩ thuật đồ họa máy tính cịn được hiểu dưới dạng
phương pháp và kĩ thuật tạo hình ảnh từ các mơ hình tốn học mơ tả các đối
tượng hay dữ liệu lấy được từ các đối tượng trong thực tế. Thuật ngữ "đồ họa
máy tính" (computer graphics) được đề xuất bởi một chuyên gia người Mĩ tên
là William Fetter vào năm 1960. Khi đó ơng đang nghiên cứu xây dựng mơ hình
buồng lái máy bay cho hãng Boeing. William Fetter đã dựa trên các hình ảnh 3
chiều của mơ hình người phi công trong buồng lái để xây dựng nên mô hình
buồng lái tối ưu cho máy bay Boeing. Đây là phương pháp nghiên cứu rất mới
vào thời kì đó. Phương pháp này cho phép các nhà thiết kế quan sát một cách
trực quan vị trí của người lái trong khoang buồng lái. William Fetter đã đặt tên
cho phương pháp của mình là computer graphics...
3
CHƯƠNG I, MƠ TẢ BAI TOAN
1.1 Giới thiệu đề tài
Hình 1. Ảnh minh họa mơ hình văn phịng
●
Thiết kế văn phòng làm việc: Phòng làm việc là 1 nơi hết sức
quan trọng, là yếu tố quyết định đến tinh thần và ý chí làm
việc. Nên phịng làm việc cần được thiết kế 1 cách gọn gàng,
ngăn nắp. và kèm theo những đồ vật mang tính chất văn
phịng như: bàn, ghế, tủ,... là vơ cùng cần thiết. Mỗi 1 căn
phịng thường toát lên được thái độ và ý thức làm việc của
từng người thơng qua cách sắp xếp và bài trí căn phịng
1.2 Mơ tả mơ hình và kịch bản
❖ Mơ tả mơ hình
-Tổng quan về văn phịng bao gồm:
●
●
Một căn phòng cắt lát: 2 bức tường 1 mặt sàn
1 bàn làm việc
4
●
●
●
●
1 ghế
1 tủ
1 cửa chính
1 cửa sổ
❖
Mơ tả kịch bản
-Mơ phỏng hoạt động của các vật thể trong văn phòng.
-Thay đổi view volume khi bấm ‘b’,’B’.
a. Căn phòng cắt lát
-Khi bấm ‘x’, ’y’, ‘z’ xoay căn phòng xoay quanh trục tương ứng
theo chiều kim đồng hồ.
-Khi bấm ‘X’, ’Y’, ‘Z’ xoay căn phòng xoay quanh trục tương ứng
theo chiều ngược kim đồng hồ.
phải.
-'a','s','d','w' di chuyển văn phòng theo chiều lên, xuống, trái,
b. Bàn làm việc
-Bấm đóng mở ngăn kéo bằng phím ‘k’, ‘K’
c. Ghế
-'n' ngả lưng ghế xuống
-'N' dựng lưng ghế lên
-'u' nâng ghế cao lên
-'U' hạ thấp ghế
-'g' xoay ghế theo chiều kim đồng hồ
-'G' xoay ghế theo chiều ngược kim đồng hồ
-'A','S','D','W' di chuyển ghế
d. Tủ
-'l' mở cửa tủ trái
-'L' đóng cửa tủ trái
5
-'r' mở cửa tủ phải
-'R' đóng cửa tủ phải
-'t' kéo ngăn kéo tủ ra
-'T' đóng ngăn kéo tủ vào
e. Cửa chính
-'c' mở cửa chính
-'C' đóng cửa chính
f. Cửa sổ
-'v' kéo rèm cửa sổ xuống
-'V' đẩy rèm cửa sổ lên
Môi trường lập trình
- Chương trình được chạy trên Visual Studio và ngôn ngữ C++ sử
dụng OpenGL
6
CHƯƠNG II, MỘT SỐ KỸ THUẬT ĐIỂN HÌNH PHAT
TRIỂN CHƯƠNG TRÌNH
2.1, Tạo hàm cube dùng chung
- Hàm cube() được tạo ra để tạo các thành phần của vật thể. Nó có khả năng ‘Re-use’ nên sẽ rất tiện
lợi và giúp code ngắn gọn hơn
void cube(GLfloat x, GLfloat y, GLfloat z, GLfloat scaleX, GLfloat scaleY, GLfloat scaleZ, mat4 mv) {
instance = Translate(x, y, z)* Scale(scaleX, scaleY, scaleZ);
glUniformMatrix4fv(model_view_loc, 1, GL_TRUE, mv * instance);
glDrawArrays(GL_TRIANGLES, 0, NumPoints);
}
2.2, Thiết kế và cài đặt căn phòng cắt lát
2.2.1, Mơ hình phân cấp
2.2.2, Kỹ thuật cài đặt
7
void office() {
//Tạo phòng cắt lát với 1 sàn và 2 tường
model_view_san = Translate(position_office_x, position_office_y,
position_office_z)
*RotateX(thetas[0])*RotateY(thetas[1])*RotateZ(thetas[2]);
cube(0.0, 0.0, 0.0, 6,0.1,4,model_view_san);
model_view_san = model_view_san*Translate(0.0, 1.0, -2.0);
cube(0.0, 0.0, 0.0, 6, 2, 0.1, model_view_san);
model_view_san = model_view_san * Translate(-3.0, 0.0, 2.0);
cube(0.0, 0.0, 0.0, 0.1, 2, 4, model_view_san);
//Gọi các hàm tạo vật thể
ban();
tu();
ghe();
cuachinh();
cuaso();
}
2.3, Thiết kế và cài đặt cửa chính
2.3.1, Mơ hình phân cấp
2.3.2, Kỹ thuật cài đặt
void cuachinh() {
//tao khung cua
8
model_view_cua_chinh = model_view_san * Translate(0.0, -0.1, 0.56);
cube(0.0, 0.0, 0.0, 0.12, 1.8, 0.12, model_view_cua_chinh);
model_view_cua_chinh = model_view_cua_chinh * Translate(0.0, 0.0, -1.12);
cube(0.0, 0.0, 0.0, 0.12, 1.8, 0.12, model_view_cua_chinh);
model_view_cua_chinh = model_view_cua_chinh * Translate(0.0, 0.96, 0.56);
cube(0.0, 0.0, 0.0, 0.12, 0.12, 1.24, model_view_cua_chinh);
//tao cua
model_view_cua_chinh = model_view_cua_chinh * Translate(0.0,-0.96,0.5)*RotateY(deg_cua_chinh);
cube(0.0, 0.0, 0.5, 0.1, 1.8, 1, model_view_cua_chinh);
//nam dam cua
model_view_cua_chinh = model_view_cua_chinh * Translate(0.0, 0.0, 0.85);
cube(0.0, 0.0, 0.0, 0.16, 0.14, 0.14, model_view_cua_chinh);
}
9
2.4, Thiết kế và cài đặt cửa sổ
2.4.1, Mơ hình phân cấp
2.4.2, Kỹ thuật cài đặt
void cuaso(){
//tao de
model_view_cua_so = model_view_ban * Translate(-1.2, 0.2, -2.0);
cube(0.0, 0.0, 0.0, 0.6, 0.12, 0.4, model_view_cua_so);
//tao khung
model_view_cua_so = model_view_cua_so * Translate(-0.275, 0.46, 0.0);
cube(0.0, 0.0, 0.0, 0.05, 0.8, 0.12, model_view_cua_so);
model_view_cua_so = model_view_cua_so * Translate(0.55,0.0, 0.0);
cube(0.0, 0.0, 0.0, 0.05, 0.8, 0.12, model_view_cua_so);
model_view_cua_so = model_view_cua_so * Translate(-0.275, 0.425, 0.0);
cube(0.0, 0.0, 0.0, 0.6, 0.05, 0.12, model_view_cua_so);
//tao rem cua
model_view_cua_so = model_view_cua_so * Translate(0.0, -0.025, 0.0);
10
cube(0.0, -0.5*height_rem, 0.0, 0.5, height_rem, 0.1, model_view_cua_so);
model_view_cua_so = model_view_cua_so * Translate(0.0, -(height_rem + 0.06), 0.0);
cube(0.0, 0.0, 0.0, 0.01, 0.14, 0.01, model_view_cua_so);
model_view_cua_so = model_view_cua_so * Translate(0.0, -0.08, 0.0);
cube(0.0, 0.0, 0.0, 0.02, 0.02, 0.02, model_view_cua_so);
}
2.5, Thiết kế và cài đặt ghế
2.5.1, Mô hình phân cấp
2.5.2, Kỹ thuật cài đặt
void ghe() {
model_view_truc_ghe = model_view_san * Translate(position_chair[0], -(2 ghe_heigt) / 2, position_chair[2]);
cube(0.0, 0.0, 0.0, 0.1, ghe_heigt, 0.1, model_view_truc_ghe);
//Chan ghe
model_view_chan_ghe = model_view_truc_ghe * Translate(0.0, -(ghe_heigt - 0.1)/2,
0.0);
cube(0.0, 0.0, 0.0, 0.5, 0.1, 0.1, model_view_chan_ghe);
model_view_chan_ghe = model_view_chan_ghe * Translate(0.0, 0.0, 0.0);
11
cube(0.0, 0.0, 0.0, 0.1, 0.1, 0.5, model_view_chan_ghe);
//Mat Ghe
model_view_mat_ghe = model_view_truc_ghe * Translate(0.0, (ghe_heigt - 0.08)/2,
0.0) * RotateY(deg_ghe);
cube(0.0, 0.0, 0.0, 0.55, 0.08, 0.55, model_view_mat_ghe);
//Lung ghe
model_view_lung_ghe = model_view_mat_ghe * Translate(-0.235, 0.09,
0.0)*RotateZ(deg_lung_ghe);
cube(0.0, 0.0, 0.0, 0.08, 0.1, 0.08, model_view_lung_ghe);
model_view_lung_ghe = model_view_lung_ghe * Translate(0.0, 0.3, 0.0);
cube(0.0, 0.0, 0.0, 0.08, 0.6, 0.55, model_view_lung_ghe);
//tay vin
model_view_mat_ghe = model_view_mat_ghe * Translate(-0.12, 0.1, 0.25);
cube(0.0, 0.0, 0.0, 0.05, 0.12, 0.05, model_view_mat_ghe);
model_view_mat_ghe = model_view_mat_ghe * Translate(0.28, 0.0, 0.0);
cube(0.0, 0.0, 0.0, 0.05, 0.12, 0.05, model_view_mat_ghe);
model_view_mat_ghe = model_view_mat_ghe * Translate(0.0, 0.0, -0.5);
cube(0.0, 0.0, 0.0, 0.05, 0.12, 0.05, model_view_mat_ghe);
model_view_mat_ghe = model_view_mat_ghe * Translate(-0.28, 0.0, 0.0);
cube(0.0, 0.0, 0.0, 0.05, 0.12, 0.05, model_view_mat_ghe);
model_view_mat_ghe = model_view_mat_ghe * Translate(0.175, 0.035, 0.0);
cube(0.0, 0.0, 0.0, 0.5, 0.05, 0.09, model_view_mat_ghe);
model_view_mat_ghe = model_view_mat_ghe * Translate(0.0, 0.0, 0.5);
cube(0.0, 0.0, 0.0, 0.5, 0.05, 0.09, model_view_mat_ghe);
}
12
2.6, Thiết kế và cài đặt bàn
2.6.1, Mơ hình phân cấp
2.6.2, Kỹ thuật cài đặt
void ban() {
//Tạo đáy bàn
model_view_ban = model_view_san * Translate(2.6, -0.34, 0.0);
cube(0.0, 0.0, 0.0, 1.2,0.02,2.2,model_view_ban);
//Tạo các chân bàn
model_view_chan_ban = model_view_ban * Translate(0.5, -0.335, 1.0);
cube(0.0, 0.0, 0.0, 0.2, 0.65, 0.2, model_view_chan_ban);
model_view_chan_ban = model_view_chan_ban * Translate(-1.0, 0.0, 0.0);
cube(0.0, 0.0, 0.0, 0.2, 0.65, 0.2, model_view_chan_ban);
model_view_chan_ban = model_view_chan_ban * Translate(0.0, 0.0, -2.0);
cube(0.0, 0.0, 0.0, 0.2, 0.65, 0.2, model_view_chan_ban);
model_view_chan_ban = model_view_chan_ban * Translate(1.0, 0.0, 0.0);
cube(0.0, 0.0, 0.0, 0.2, 0.65, 0.2, model_view_chan_ban);
//Tạo ngăn kéo
model_view_ngankeo = model_view_ban * Translate(-position_ngankeo-0.02, 0.0, 0.0);
cube(0.0, 0.0, 0.0, 0.6, 0.02, 0.3, model_view_ngankeo);
model_view_ngankeo = model_view_ngankeo * Translate(0.0, 0.1, -0.13);
cube(0.0, 0.0, 0.0, 0.6, 0.2, 0.02, model_view_ngankeo);
model_view_ngankeo = model_view_ngankeo * Translate(0.0, 0.0, 0.26);
cube(0.0, 0.0, 0.0, 0.6, 0.2, 0.02, model_view_ngankeo);
model_view_ngankeo = model_view_ngankeo * Translate(0.28, 0.0, -0.13);
cube(0.0, 0.0, 0.0, 0.02, 0.2, 0.3, model_view_ngankeo);
model_view_ngankeo = model_view_ngankeo * Translate(-0.56, 0.0, 0.0);
13
cube(0.0, 0.0, 0.0, 0.02, 0.2, 0.3, model_view_ngankeo);
model_view_ngankeo = model_view_ngankeo * Translate(0.0, 0.0, 0.0);
cube(0.0, 0.0, 0.0, 0.005, 0.05, 0.1, model_view_ngankeo);
//Tạo mặt bàn
model_view_vach = model_view_ban * Translate(0.0, 0.3, 0.0);
cube(0.0, 0.0, 0.0, 1.2, 0.02, 2.2, model_view_vach);
//Tạo vách sau
model_view_vach = model_view_ban * Translate(0.61, 0.14, 0.0);
cube(0.0, 0.0, 0.0, 0.02, 0.3, 2.2, model_view_vach);
//Tạo 2 vách bên
model_view_vach = model_view_ban * Translate(0.0, 0.14, 1.09);
cube(0.0, 0.0, 0.0, 1.24, 0.3, 0.02, model_view_vach);
model_view_vach = model_view_ban * Translate(0.0, 0.14, -1.09);
cube(0.0, 0.0, 0.0, 1.24, 0.3, 0.02, model_view_vach);
//Tạo vách trước
model_view_vach = model_view_ban * Translate(-0.61, 0.14, 0.625);
cube(0.0, 0.0, 0.0, 0.02, 0.3, 0.95, model_view_vach);
model_view_vach = model_view_ban * Translate(-0.61, 0.14, -0.625);
cube(0.0, 0.0, 0.0, 0.02, 0.3, 0.95, model_view_vach);
model_view_vach = model_view_ban * Translate(-0.61, 0.25, 0.0);
cube(0.0, 0.0, 0.0, 0.02, 0.08, 0.3, model_view_vach);
}
14
2.7, Thiết kế và cài đặt tủ
2.7.1, Mơ hình phân cấp
2.7.2, Kỹ thuật cài đặt
void tu() {
model_view_tu = model_view_san * Translate(4.6, -0.8, -1.4);
cube(0.0, 0.0, 0.0, 2.2, 0.05, 1.2, model_view_tu);
//Tạo các chân tủ
model_view_chan_tu = model_view_tu * Translate(1.05, -0.112, -0.55);
cube(0.0, 0.0, 0.0, 0.1, 0.175, 0.1, model_view_chan_tu);
model_view_chan_tu = model_view_chan_tu * Translate(-2.1, 0.0, 0.0);
cube(0.0, 0.0, 0.0, 0.1, 0.175, 0.1, model_view_chan_tu);
model_view_chan_tu = model_view_chan_tu * Translate(0.0, 0.0, 1.1);
cube(0.0, 0.0, 0.0, 0.1, 0.175, 0.1, model_view_chan_tu);
model_view_chan_tu = model_view_chan_tu * Translate(2.1, 0.0, 0.0);
cube(0.0, 0.0, 0.0, 0.1, 0.175, 0.1, model_view_chan_tu);
//mat sau tu
model_view_vach_tu = model_view_tu * Translate(0.0, 0.8, -0.575);
cube(0.0, 0.0, 0.0, 2.2, 1.6, 0.05, model_view_vach_tu);
//Tạo khung
model_view_khung_tu = model_view_tu * Translate(-0.55, 0.6, 0.0);
cube(0.0, 0.0, 0.0, 1.1, 0.05, 1.2, model_view_khung_tu);
15
model_view_khung_tu = model_view_khung_tu * Translate(0.0, 0.6, 0.0);
cube(0.0, 0.0, 0.0, 1.1, 0.05, 1.2, model_view_khung_tu);
model_view_khung_tu = model_view_khung_tu * Translate(1.1, -0.5, 0.0);
cube(0.0, 0.0, 0.0, 1.1, 0.05, 1.2, model_view_khung_tu);
model_view_khung_tu = model_view_khung_tu * Translate(-0.55, 0.125, 0.0);
cube(0.0, 0.0, 0.0, 0.05, 1.6, 1.2, model_view_khung_tu);
//tạo vách tủ
model_view_vach_tu = model_view_vach_tu * Translate(-1.075, 0.0, 0.575);
cube(0.0, 0.0, 0.0, 0.05, 1.6, 1.2, model_view_vach_tu);
model_view_vach_tu = model_view_vach_tu * Translate(1.075*2, 0.0, 0.0);
cube(0.0, 0.0, 0.0, 0.05, 1.6, 1.2, model_view_vach_tu);
model_view_vach_tu = model_view_vach_tu * Translate(-1.075, 0.795, 0.0);
cube(0.0, 0.0, 0.0, 2.2, 0.05, 1.2, model_view_vach_tu);
//left
model_view_cua_tu_left = model_view_tu * Translate(-1.1, 0.785,
0.575)*RotateY(deg_left_door);
cube(0.55, 0.0, 0.0, 1.1, 1.575, 0.05, model_view_cua_tu_left);
model_view_cua_tu_left = model_view_cua_tu_left * Translate(1.0, 0.0, 0.0);
cube(0.0, 0.0, 0.0, 0.05, 0.3, 0.005, model_view_cua_tu_left);
//Tạo ngăn kéo tủ
model_ngankeo_tu = model_view_tu * Translate(0.5375, 0.025, positon_ngankeo_tu);
cube(0.0, 0.0, 0.0, 1.025, 0.05, 1.15, model_ngankeo_tu);
model_ngankeo_tu = model_ngankeo_tu * Translate(0.0, 0.275, -0.55);
cube(0.0, 0.0, 0.0, 1.025, 0.5, 0.05, model_ngankeo_tu);
model_ngankeo_tu = model_ngankeo_tu * Translate(-0.49, 0.0, 0.575);
cube(0.0, 0.0, 0.0, 0.05, 0.5, 1.15, model_ngankeo_tu);
model_ngankeo_tu = model_ngankeo_tu * Translate(0.96, 0.0,0.0);
cube(0.0, 0.0, 0.0, 0.05, 0.5, 1.15, model_ngankeo_tu);
model_ngankeo_tu = model_ngankeo_tu * Translate(-0.46, 0.05, 0.55);
cube(0.0, 0.0, 0.0, 1.1, 0.705, 0.05, model_ngankeo_tu);
model_ngankeo_tu = model_ngankeo_tu * Translate(0.0, 0.0, 0.0);
cube(0.0, 0.0, 0.0, 0.4, 0.05, 0.05, model_ngankeo_tu);
//right
model_view_cua_tu_right = model_view_tu * Translate(1.1, 1.1475, 0.575) *
RotateY(deg_right_door);
cube(-0.55, 0.0, 0.0, 1.1, 0.875, 0.05, model_view_cua_tu_right);
model_view_cua_tu_right = model_view_cua_tu_right * Translate(-1.0, 0.0, 0.0);
cube(0.0, 0.0, 0.0, 0.05, 0.3, 0.005, model_view_cua_tu_right);
}
2.8, Thiết kế và điều khiển phép chiếu,
camera
● B1, Chỉnh sửa vshader1
16
● B2, Tạo biến và gán giá trị ban đầu để khởi tạo phép
chiếu và camera
● B3, Sửa hàm shaderSetup để lấy giá trị cần thiết để
thiết lập
● B4, Thiết lập phép chiếu và camera từ những biến đã
vừa tạo trong hàm display
● B5, Tạo phím điều khiển phối cảnh trong hàm keyboard
17
18
CHƯƠNG III, KẾT QUẢ CHƯƠNG TRÌNH
Kết quả đạt được
-Xây dựng được một số mơ hình trong phịng làm việc
+Cửa chính có thể đóng mở
+Cửa sổ có thể kéo và hạ rèm xuống
+Ghế có thể thay đổi chiều cao, ngả lưng ghế, xoay, di chuyển
+Bàn có thể kéo ngăn kéo ra, đóng ngăn kéo vào
+Tủ có thể mở 2 cánh cửa độc lập và ngăn kéo tủ có khả năng kéo ra kéo vào
19
Kết luận
Sau khi làm bài tập nhóm, các thành viên đã có cơ hội học hỏi, rèn luyện kiến thức trên lớp; qua đó
các thành viên hiểu được bài học và có khả năng giải quyết được những bài tốn căn bản. Trong
tương lai, nhóm sẽ tìm hiều thêm về các vấn đề và công nghệ liên quan cũng như rèn luyện học hỏi
thêm.
20