Thiết kế phần mềm mô phỏng chuyển động của khung xương

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 54

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

VIỆN ĐIỆN TỬ - VIỄN THÔNG

ĐỒ ÁN II
Đề tài: Thiết kế phần mềm mô phỏng
chuyển động của khung xương

Giảng viên hướng dẫn : TS. Đào Việt Hùng


Sinh viên thực hiện : Trần Đức Chính
MSSV : 20150387
Lớp : Điện tử 04- K60

HÀ NỘI - 2019
MỤC LỤC

MỤC LỤC ...................................................................................................................1

DANH MỤC HÌNH ẢNH ..........................................................................................2

A. ĐẶT VẤN ĐỀ .....................................................................................................3


1. Tính cấp thiết hiện nay ............................................................................................................. 3
2. Mục tiêu đề tài .............................................................................................................................. 3

B. NỘI DUNG ..........................................................................................................4


1. Cơ sở lí thuyết............................................................................................................................... 4
2.1. Giới thiệu về nhận dạng và xử lý hình ảnh ...............................................4
2. Các ngôn ngữ lập trình, khả năng đồ họa và xuất nhập dữ liệu ............................ 6
2.2. Ngôn ngữ Java ..........................................................................................6
2.3. Ngôn ngữ C# .............................................................................................7
2.4. Ngôn ngữ Python ......................................................................................7
2.5. Ngôn ngữ C++ ..........................................................................................8
2.6. Lựa chọn các ngôn ngữ trong các khâu tiếp theo .....................................9
3. Khâu xử lý hình ảnh ................................................................................................................... 9
3.1. Tìm hiểu các khái niệm cơ bản trong xử lí ảnh số....................................9
3.2. Cài đặt thư viện OpenCV vào project Visual studio ..............................11
3.3. Lập trình xử lí ảnh số để phát hiện ra các vật hình tròn màu trắng và xác
định tọa độ tâm ..................................................................................................11
4. Khâu thiết kế không gian hiển thị, mô phỏng vật thể trong không gian ........... 15
4.1. Truy xuất dữ liệu với Apache POI .........................................................15
4.2. Hiển thị đồ họa 3D trên Java sử dụng thư viện JOGL ...........................23
4.3. Xuất bản ứng dụng trong Java ................................................................27
5. Kết quả ........................................................................................................................................... 34
5.1. Kết quả hiển thị .......................................................................................34
5.2. Kết quả so mới mục tiêu đề ra ................................................................36

C. KẾT LUẬN........................................................................................................37

D. TÀI LIỆU THAM KHẢO .................................................................................38

PHỤ LỤC ..................................................................................................................39

1
DANH MỤC HÌNH ẢNH

Hình 1Các bước cơ bản trong xử lí ảnh ...................................................................10


Hình 2 Thư viện OpenCV 3.0 sau khi giải nén ........................................................12
Hình 3 Khởi tạo Project mới với Visual Studio .......................................................12
Hình 4 Tích hợp OpenCV vào Project (1) ...............................................................13
Hình 5 Tích hợp OpenCV vào Project (2) ...............................................................13
Hình 6 Tích hợp OpenCV vào Project (3) ...............................................................14
Hình 7 Các tiếp đầu ngữ trong Apache POI ............................................................16
Hình 8 Các đối tượng trong Apache POI Excel .......................................................17
Hình 9 Chọn main class trong project ......................................................................28
Hình 10 Clean and build file .jar ..............................................................................29
Hình 11 Hoàn thành tạo file jar ................................................................................29
Hình 12 Kiểm tra việc chạy file jar ..........................................................................30
Hình 13 Mở giao diện phần mềm lauch4j ................................................................31
Hình 14 Đặt tên cho file exe ....................................................................................31
Hình 15 Thêm file jar ...............................................................................................32
Hình 16 Thêm icon cho file exe ...............................................................................32
Hình 17 Tạo file exe .................................................................................................33
Hình 18 Chạy thử file exe ........................................................................................34
Hình 19 Chọn vị trí lưu file ......................................................................................34
Hình 20 Kết quả thực hiện chương trình ..................................................................35
Hình 21 Kết quả truy xuất dữ liệu từ file Excel ....... Error! Bookmark not defined.
Hình 22 Kết quả hiển thị đồ họa 3D ........................................................................36
Hình 23 Giao diện của ứng dụng .............................................................................36

2
A. ĐẶT VẤN ĐỀ
1. Tính cấp thiết hiện nay
Xương là một bộ phận rắn bên trong tạo thành một bộ khung vững chắc nâng đỡ
toàn bộ cơ thể, và làm hỗ trợ cho các thành phần khác trong cơ thể. Xương có 3 nhiệm
vụ chủ yếu: nâng đỡ, bảo vệ và vận động. Ngoài ra, xương cũng là kho dự trữ chất
khoáng (Canxi và Photpho); tủy xương là nơi tạo huyết và sản sinh ra huyết cầu.
Ngày nay, việc hoạt động thể thao mạnh, thường xuyên tập thể hình hay làm
những việc nặng gây áp lực lên khớp xương…tạo nên nguy cơ gây thương tổn cho
cơ thể.
Thương tổn ảnh hưởng trực tiếp lên xương, cơ bắp, sụn khớp và mô liên kết cũng
như day chằng. Hầu hết thương tổn đều có hình thành từ trước và có thể dự phòng tái
phát, nên không cần thiết phải ngưng hẳn các hoạt động thể thao hay cơ bắp trong
thời gian dài. Tuy nhiên, nếu không nhận thức được đúng đắn về mức độ thương tổn
và xem nhẹ tình hình lâu ngày có thể dẫn đến mãn tính và trở nên khó chữa trị.
Những chấn thương về xương khớp luôn là vấn đề mà ngành Y thường xuyên phải
đối mặt. Ngày nay, phương pháp hữu hiệu nhất để phát hiện những tổn thương của
hệ cơ xương đó là sử dụng máy chụp X- Quang. Tuy nhiên, phương pháp này sử dụng
tia X có thể gây hại cho bệnh nhân, khi mà tia X cũng là một loại tia có hại cho cơ
thể. Dù rằng ngày nay đã có nhiều phương pháp để giảm tác động của tia X, những
tác động của tia X tới cơ thể là điều không thể tránh khỏi khi sử dụng nó trong chẩn
đoán.
Chính vì thế, chúng em đã nghiên cứu để có thể đưa ra hệ thống mô phỏng xương
người sử dụng Camera.

2. Mục tiêu đề tài


Đề tài chúng em thực hiện lần này mục đích tìm hiểu và thiết kế được một phần
mềm mô phỏng chuyển động của một mẫu vật 3D đơn giản lấy dữ liệu từ file excel.
Dữ liệu file Excel là kết qảu của khâu xử lí hình ảnh từ việc nhận dạng và vẽ tọa
độ của vật thể trong không gian từ việc đặt các camera quay vật thể
Thiết kế phần mềm bằng các ngôn ngữ lấp trình thông dụng dễ tìm hiểu, dễ xử lí
nhất.

3
B. NỘI DUNG

Sau khi đã xác định đề tài chúng em tiến hành theo thự tự các bước
Khâu 1: Tìm hiểu cơ sở lí thuyết về nhận dạnh và xử lí hình ảnh
Trong khâu này chúng em rút ra về các cách nhận giạng hình ảnh qua đó áp dúng
vào đề tài.
Khâu 2: Tìm hiểu các ngôn ngữ lập trình
Trong khâu này chúng em tìm hiểu về các ngôn ngữ lập trình liên quan có thể dễ
áp dụng cho đề tài nhất trong các khâu
Khâu 3: Khâu xử lí hình ảnh
Áp dụng ngôn ngữ lập trình, các thuật toán và các hàm để có thể nhận diên hình
ảnh qua đó tạo được toạn độ điểm cả vật thể trong không gian bọn em tạo sẵn
Khâu 4: Khẩu thiết kế không gian, hiện thỉ vật thể lên không gian và mô phòng
chuyển độngc ảu vật trong không gian
Dùng ngôn ngữ lập trinh tạo hàm tạo trường không gian truy xuất dữ liệu từ file
Excel data (kết quả toạn độ từ khâu 3). Đưa dữ liệu đó lên không gian 3D hiển thị
và mô phỏng chuyển động của vật).

1. Cơ sở lí thuyết
2.1. Giới thiệu về nhận dạng và xử lý hình ảnh

2.1.1. Tìm hiểu về công nghệ và xử lý hình ảnh


Công nghệ nhận dạng hình ảnh có tiềm năng lớn trong việc áp dụng rộng rãi trong
các ngành công nghiệp khác nhau. Các công ty lớn như Tesla, Google, Uber, Adobe
Systems vv cũng sử dụng công nghệ nhận dạng hình ảnh. Để chứng minh rằng công
nghệ này đang tồn tại khắp thế giới, chúng ta hãy xem xét các số liệu thống kê gần
đây. Các nhà nghiên cứu dự đoán rằng thị trường toàn cầu của công nhận dạng hình
ảnh sẽ đạt 38,92 tỷ USD vào năm 2021. Đó là một con số rất lớn! Vì vậy, không có
thắc mắc rằng ngày càng nhiều cái gọi là ứng dụng imagetech tận dụng nhận dạng
hình ảnh cho các mục đích khác nhau và cả trong kinh doanh.
Điều gì giúp mở rộng công nghệ nhận dạng hình ảnh ngày nay? Đó là các công
cụ mã nguồn mở giúp lập trình dễ dàng hơn, trong khi tính toán giá cả phải chăng
hơn. Các khung công tác và thư viện nguồn mở ngày nay làm cho các công ty có thể
hưởng lợi từ công nghệ nhận dạng hình ảnh theo cấp số nhân. Ví dụ, các cơ sở dữ
liệu mở lớn như Pascal VOC và ImageNet cung cấp quyền truy cập vào hàng triệu
hình ảnh được gắn thẻ. Trên thực tế, họ giúp các công ty công nghệ hình ảnh phát
triển và cải tiến các ứng dụng và thuật toán học máy (Machine learning) của riêng họ.
Đối với một nhà phát triển chuyên nghiệp nhận dạng hình ảnh thời gian thực cũng sử
dụng một thư viện đa nền tảng nguồn mở được gọi là OpenCV. Đây được xem là
điểm giải quyết đầu tiên và là nguồn tài nguyên có thẩm quyền nhất cho các chuyên
gia nhận dạng hình ảnh. Một bộ thư viện tuyệt vời khác cho tầm nhìn máy tính bao
gồm OpenNN, VXL và nhiều loại khác.

4
Nhưng trước khi đi sâu vào chi tiết hơn về nhận dạng hình ảnh và cách xử lý nó,
chúng ta nên hiểu rằng hình ảnh có thể được sử dụng theo những cách khác nhau.
Trong các hình ảnh phát triển phần mềm di động, web và phần mềm phục vụ cho vô
số lý do, bao gồm:

 Nhận dạng đối tượng


 Nhận dạng mẫu
 Định vị các bản sao (chính xác hoặc một phần)
 Tìm kiếm hình ảnh theo phân đoạn
 Xử lý hình ảnh (Retouch ,...)
 Cải thiện ứng dụng di động UX
 …v…v

Tính ứng dụng của nó không giới hạn. Với những tiến bộ trong công nghệ mở ra
nhiều cơ hội mới cho các doanh nghiệp. Do đó, phân tích hình ảnh được đưa đến một
cấp độ hoàn toàn mới nhờ vào các giải pháp nguồn mở và các công cụ học sâu (deep
learning).

2.1.2. Nhận dạng hình ảnh


Nhận dạng hình ảnh hoặc tầm nhìn máy tính là một kỹ thuật đề cập đến việc tìm
kiếm các cách để tự động hóa tất cả công việc mà một hệ thống thị giác của con người
có thể làm. TensorFlow của Google, DeepFace của Facebook, Dự án Oxford của
Microsoft là những ví dụ tuyệt vời về hệ thống nhận dạng hình ảnh học sâu. Mặt khác,
các API được lưu trữ như Google Cloud Vision, Clarifai, Imagga cho phép các doanh
nghiệp tiết kiệm một số tiền lớn cho các nhóm phát triển.
Ưu điểm của các dịch vụ mã nguồn mở được đề cập rất nhiều. Họ tiến hành tính
toán nhận dạng hình ảnh trong đám mây khiến cho hoạt động kinh doanh của bạn trở
nên hiệu quả hơn và rẻ hơn rất nhiều. Ngoài ra, các nhà phát triển nội bộ tại công ty
của bạn có thể tích hợp API của họ vào ứng dụng của bạn mà không gặp sự cố. Hơn
nữa, các nhà phát triển API mở này có thể sử dụng để phát triển một doanh nghiệp
mới trong lĩnh vực nhận dạng hình ảnh. Có nhiều cách để có thể nhận diện hình ảnh
như sử dụng X-quang, sử dụng sóng siêu âm, sử dụng tia hồng ngoại, sử dụng camera,
Ở đề án lần này, chúng em sử dụng Camera trong việc nhận diện hình ảnh.

2.1.3. Kỹ thuật xử lý hình ảnh


Nói chung, xử lý ảnh bao gồm nhiều giai đoạn: nhập ảnh, phân tích, thao tác
và tạo ảnh. Có hai phương pháp xử lý hình ảnh: kỹ thuật số (Digital) và analog. Đặc
biệt, xử lý hình ảnh kỹ thuật số và các kỹ thuật của nó là những gì bài viết này đề cập
đến.
Thuật toán máy tính đóng một vai trò quan trọng trong xử lý hình ảnh kỹ thuật
số. Nhà phát triển sử dụng nhiều thuật toán để giải quyết các tác vụ khác nhau, bao
gồm phát hiện hình ảnh kỹ thuật số, phân tích, xây dựng lại, khôi phục, nén dữ liệu
hình ảnh, tăng cường hình ảnh, ước tính hình ảnh và ước tính quang phổ hình ảnh.

5
2. Các ngôn ngữ lập trình, khả năng đồ họa và xuất nhập dữ liệu
2.2. Ngôn ngữ Java

2.2.1. Khả năng của ngôn ngữ Java

 Là một ngôn ngữ bậc cao như C, C++, Perl, SmallTalk,.. cho nên có thể
được dùng để tạo ra các ứng dụng để giải quyết các vấn đề về số, xử lý văn
bản, tạo ra trò chơi, và nhiều thứ khác.

 Có các môi trường lập trình đồ họa như Visual Java, Symantec Cafe,
Jbuilder, Jcreator,…
 Ngôn ngữ an toàn, tất cả các thao tác truy xuất vào các thiết bị vào ra đều
thực hiện trên máy ảo nhờ đó hạn chế các thao tác nguy hiểm cho máy tính
thật.

2.2.2. Điểm mạnh của Java


 Con đường học tập: Con đường học tập đối với ngôn ngữ lập trình Java là
cực kỳ ngắn. Java dễ viết, dễ biên dịch và gỡ lỗi hơn các ngôn ngữ lập trình
chính khác như C ++, Objective-C, C.
 Lập trình hướng đối tượng: Ở đây có một lợi thế thú vị khác khi sử dụng
Java. Đó là Java cho phép bạn tạo các chương trình mô-đun và mã có thể
tái sử dụng để giữ cho hệ thống có thể mở rộng cũng như linh hoạt.
 API phong phú: Java cung cấp các API cho các hoạt động khác nhau như
kết nối cơ sở dữ liệu, kết nối mạng, I / O, phân tích cú pháp XML, các tiện
ích và hơn thế nữa
 Công cụ mã nguồn mở mạnh mẽ phát triển nhanh chóng
 Thư viện mã nguồn mở
 Hỗ trợ cộng đồng: Cuối cùng, có một cộng đồng hỗ trợ Java lớn mà ngôn
ngữ này tập hợp được. Cọng đồng này sẽ giúp đồng nhành cùng các Java
developer để học về nghệ thuật lập trình cũng như để làm việc hiệu quả
hơn.

2.2.3. Nhược điểm


 Trình biên dịch Java chưa được tối ưu hóa tốt so với C ++.

 Không có sự tách biệt đặc điểm kỹ thuật khi triển khai.


 Quản lý bộ nhớ, với Java, là khá tốn kém. Thư viện mã nguồn mở
 Việc thiếu các template có thể hạn chế khả năng của Java để tạo ra các cấu
trúc dữ liệu chất lượng cao.

6
 Người ta có thể tìm thấy một số lỗi trong trình duyệt và các chương trình
ví dụ

2.3. Ngôn ngữ C#

2.3.1. Những đặc trưng của ngôn ngữ C#


 Là một ngôn ngữ thuần hướng đối tượng Là ngôn ngữ khá đơn giản, chỉ có
khoảng 80 từ khóa và hơn mười mấy kiểu dữ liệu được dựng sẵn. Thư viện
mã nguồn mở
 Cung cấp những đặc tính hướng thành phần (component-oriented) như là
Property, Event
 C# không khuyến khích sử dụng con trỏ như trong C++ nhưng nếu bạn
thực sự muốn sử dụng thì phải đánh dấu đây là mã không an toàn
(unsafe).
 C# có bộ Garbage Collector sẽ tự động thu gom vùng nhớ khi không còn
sử dụng nữa.
 C# đã loại bỏ đa kế thừa trong C++ mà thay vào đó C# sẽ hỗ trợ thực thi
giao diện interface

2.3.2. Ưu điểm

 Gần gũi với các ngôn ngữ lập trình thông dụng (C++, Java, Pascal).
 Xây dựng dựa trên nền tảng của các ngôn ngữ lập trình mạnh nên thừa
hưởng những ưu điểm của những ngôn ngữ đó.
 Cải tiến các khuyết điểm của C/C++ như con trỏ, các hiệu ứng phụ, . . .
 Dễ tiếp cận, dễ phát triển.
 Được sự chống lưng của .NET Framework.

2.3.3. Nhược điểm

 Nhược điểm lớn nhất của C# là chỉ chạy trên nền Windows và có cài
.NET Framework.
 Thao tác đối với phần cứng yếu hơn so với ngôn ngữ khác. Hầu hết phải
dựa vào windows.

2.4. Ngôn ngữ Python


Là một ngôn ngữ lập trình mã nguồn mở đa mục đích, một loại ngôn ngữ bậc
cao, thông dịch và hướng đối.
Cú pháp của python khá dễ, dễ hiểu, dễ học và trong việc phát triển ứng dụng
thì ngôn ngữ này cũng rất linh hoạt. Python hỗ trợ mẫu đa lập trình, bao gồm lập
trình hướng đối tượng, lập trình hàm và mệnh lệnh hoặc là các phong cách lập trình
theo thủ tục.

7
2.4.1. Ưu điểm:
 Là một ngôn ngữ có hình thức sáng sủa, cấu trúc roc ràng, cú pháp ngắn
gọn
 Có trên tất cả các nền tảng hệ điều hành từ UNIX, MS – DOS, Mac OS,
Windows và Linix và các OS khác thuộc họ Unix.
 Tương thích mạnh mẽ với Unix, hardware, thirt-party software với số
lượng thư viện khổng lồ (400 triệu người sử dụng)
 Python với tốc độ xử lý cực nhanh, python có thể tạo ra những chương
trình từ những script siêu nhỏ tới những phần mềm cực lớn như Biender
3D.

2.4.2. Nhược điểm:


 Python không có các thuộc tính như: protected, private hay public, không
có vòng lặp do…while và switch….case.
 Mặc dù tốc độ xử lý của Python nhanh hơn PHP nhưng không
bằng JAVA và C++.

2.5. Ngôn ngữ C++

2.5.1. Một số đặc trưng của ngôn ngữ C++:


 C++ là một ngôn ngữ lập trinh bậc trung. Nó có nghĩa là bạn có thể sử
dụng C++ để phát triển những ứng dụng bậc cao, và cả những chương
trình bậc thấp hoạt động tốt trên phần cứng.
 C++ là một ngôn ngữ lập trình hướng đối tượng.
 C++ là một ngôn ngữ lập trình hướng cấu trúc giống ngôn ngữ C, nó có
nghĩa là chúng ta có thể tổ chức chương trình trên khái niệm functions.
 C++ có thể chạy trên nhiều nền tảng khác nhau như Windows, Mac OS,
một số biến thể của UNIX…

2.5.2. Ưu điểm

 C++ được thiết kế để viết những hệ thống lớn, thậm chí C++ được dùng
để tạo nên hệ điều hành máy tính (Linux, Mac OS X, Windows…).
 C++ được dùng để tạo nên các game lớn của hãng Blizzard (World of
Warcraft, Diablo series, StarCraft series…). Gần như toàn bộ các game
bom tấn trên thị trường hiện nay cũng dùng C++ để phát triển. Một số
công cụ sử dụng trong việc lập trình game có sử dụng C++ như Unreal
engine, Cocos2d-x framework, Các ông lớn trong ngành công nghiệp
game như Valve, CryTek cũng sử dụng C++.
 C++ có thể được sử dụng ở phía Web server vì C++ có thể đáp ứng được
yêu cầu về tốc độ xử lý, khả năng phản hồi nhanh.
 Tuy rằng bên cạnh C++ còn có những ngôn ngữ lập trình khác như C#,
Java, … có thể làm được những ứng dụng lớn cho máy tính, nhưng đối

8
với các ứng dụng có yêu cầu về mặt tốc độ xử lý, hoặc có tính thương
mại cao, người ta vẫn ưu tiên C++.

2.5.3. Nhược điểm:


Kích thước của mảng phải là cố định: Trong cấp phát mảng tĩnh, mảng cần được
khai báo với kích thước xác định trước khi chạy chương trình. Các byte vùng nhớ cấp
phát mảng được sắp xếp liên tục: trong trường hợp vùng nhớ cho chương trình đang
bị phân mảnh, chương trình sẽ báo lỗi khi chúng ta khai báo hoặc cấp phát cho mảng
với kích thước lớn vì không đủ vùng nhớ liên tục cho mảng…
 Kết luận: Dựa trên các đặc điểm của các ngôn ngữ lập trình, ưu nhược điểm
khả năng đồ họa và truy xuất dữ liệu, nhóm chúng em quyết định sử dụng
ngôn ngữ Java để lập trình.

2.6. Lựa chọn các ngôn ngữ trong các khâu tiếp theo
Dự vào kết quả so sánh trên chúng em đưa ra sự lựa chọn các ngôn ngữ lập trình
phù hợp với các khâu như sau:
- Khâu xử lí hình ảnh: Chúng em lựa chọn ngôn ngữ lập trình C++.
- Khâu Thiết kế không gian hiện thị và mô phòng vật thể: Chúng em lựa
chọn ngôn ngư lập trình Java.

3. Khâu xử lý hình ảnh


3.1. Tìm hiểu các khái niệm cơ bản trong xử lí ảnh số

3.1.1. Xử lí ảnh là gì
Con người thu nhận thông tin qua các giác quan, trong đó thị giác đóng vai trò
quan trọng nhất. Những năm trở lại đây với sự phát triển của phần cứng máy tính, xử
lý ảnh và đồ hoạ đó phát triển một cách mạnh mẽ và có nhiều ứng dụng trong cuộc
sống. Xử lý ảnh và đồ hoạ đóng một vai trò quan trọng trong tương tác người máy.
Quá trình xử lý ảnh được xem như là quá trình thao tác ảnh đầu vào nhằm cho ra kết
quả mong muốn. Kết quả đầu ra của một quá trình xử lý ảnh có thể là một ảnh “tốt
hơn” hoặc một kết luận.
Ảnh có thể xem là tập hợp các điểm ảnh và mỗi điểm ảnh được xem như là đặc
trưng cường độ sáng hay một dấu hiệu nào đó tại một vị trí nào đó của đối tượng
trong không gian và nó có thể xem như một hàm n biến P(c1, c2,..., cn). Do đó, ảnh
trong xử lý ảnh có thể xem như ảnh n chiều [3].
Sơ đồ tổng quát của một hệ thống xử lý ảnh:

9
Hình 1Các bước cơ bản trong xử lí ảnh

3.1.2. Các khái niệm cơ bản trong xử lí ảnh:


Ảnh số:
Ảnh số là tập hợp hữu hạn các điểm ảnh với mức xám phù hợp dùng để mô tả
ảnh gần với ảnh thật. Số điểm ảnh xác định độ phân giải của ảnh. Ảnh có độ phân
giải càng cao thì càng thể hiện rõ nét các đặt điểm của tấm hình càng làm cho tấm
ảnh trở nên thực và sắc nét hơn. Thông tin về sách được sắp xếp theo thứ tự sau: tên
tác giả, tên sách (chữ nghiêng), tên nhà xuất bản và năm xuất bản.
Điểm ảnh: Điểm ảnh (Pixel) là một phần tử của ảnh số tại toạ độ (x, y) với độ
xám hoặc màu nhất định. Kích thước và khoảng cách giữa các điểm ảnh đó được chọn
thích hợp sao cho mắt người cảm nhận sự liên tục về không gian và mức xám (hoặc
màu) của ảnh số gần như ảnh thật. Mỗi phần tử trong ma trận được gọi là một phần
tử ảnh.
Độ phân giải của ảnh: Độ phân giải (Resolution) của ảnh là mật độ điểm ảnh
được ấn định trên một ảnh số được hiển thị. Theo định nghĩa, khoảng cách giữa các
điểm ảnh phải được chọn sao cho mắt người vẫn thấy được sự liên tục của ảnh. Việc
lựa chọn khoảng cách thích hợp tạo nên một mật độ phân bổ, đó chính là độ phân giải
và được phân bố theo trục x và y trong không gian hai chiều.
Ví dụ: Độ phân giải của ảnh trên màn hình CGA (Color Graphic Adaptor) là một
lưới điểm theo chiều ngang màn hình: 320 điểm chiều dọc * 200 điểm ảnh (320*200).
Rõ ràng, cùng màn hình CGA 12” ta nhận thấy mịn hơn màn hình CGA 17” độ phân
giải 320*200. Lý do: cùng một mật độ (độ phân giải) nhưng diện tích màn hình rộng
hơn thì độ mịn (liên tục của các điểm) kém hơn.
Mức xám của ảnh: Một điểm ảnh (pixel) có hai đặc trưng cơ bản là vị trí (x, y)
của điểm ảnh và độ xám của nó. Dưới đây chúng ta xem xét một số khái niệm và
thuật ngữ thường dùng trong xử lý ảnh.
Định nghĩa: Mức xám của điểm ảnh là cường độ sáng của nó được gán bằng giá
trị số tại điểm đó.
Các thang giá trị mức xám thông thường: 16, 32, 64, 128, 256 (Mức 256 là mức
phổ dụng. Lý do: từ kỹ thuật máy tính dùng 1byte (8bit) để biểu diễn mức xám: Mức
xám dùng 1byte biểu diễn: 28 =256 mức, tức là từ 0 đến 255).
Ảnh đen trắng: là ảnh có hai màu đen, trắng (không chứa màu khác) với mức
xám ở các điểm ảnh có thể khác nhau.

10
Ảnh nhị phân: ảnh chỉ có 2 mức đen trắng phân biệt tức dùng 1bit mô tả 21 mức
khác nhau. Nói cách khác: mỗi điểm ảnh của ảnh nhị phân chỉ có thể là 0 hoặc 1.
Ảnh màu: trong khuôn khổ lý thuyết ba màu (Red, Blue, Green) để tạo nên thế
giới màu, người ta thường dùng 3byte để mô tả mức màu, khi đó các giá trị màu:
28*3=224≈ 16,7 triệu màu [5].

3.2. Cài đặt thư viện OpenCV vào project Visual studio

3.2.1. Thư viện Open CV 3.0:


Thư viện OpenCV (Open Computer Vision) là một thư viện mã nguồn mở hàng
đầu cho xử lý về thị giác máy tính, machine learning, xử lý ảnh. OpenCV đươc viết
bằng C/C++, vì vậy có tốc độ tính toán rất nhanh, có thể sử dụng với các ứng dụng
liên quan đến thời gian thực. Opencv có các interface cho C/C++, Python Java vì vậy
hỗ trợ được cho Window, Linux, MacOs lẫn Android, iOS. OpenCV có cộng đồng
hơn 47 nghìn người dùng và số lượng download vượt quá 6 triệu lần. Phiên bản mới
nhất hiện tại là Open CV 4.0.0.

3.2.2. Phần mềm Visual Studio


Visual Studio là một môi trường phát triển tích hợp (IDE) từ Microsoft. Nó được
sử dụng để phát triển chương trình máy tính cho Microsoft Windows, cũng như các
trang web, các ứng dụng web và các dịch vụ web.
Visual Studio hỗ trợ nhiều ngôn ngữ lập trình khác nhau và cho phép trình biên
tập mã và gỡ lỗi để hỗ trợ (mức độ khác nhau) hầu như mọi ngôn ngữ lập trình. Các
ngôn ngữ tích hợp gồm có C, C++, C++/CLI, CSS, VB.NET, C# ngoài ra còn hỗ trợ
các ngôn ngữ khác như Python, Ruby, HTML/XHTML.

3.3. Lập trình xử lí ảnh số để phát hiện ra các vật hình tròn màu trắng và
xác định tọa độ tâm

3.3.1. Tích hợp OpenCV 3.0 vào project:


Thư viện OpenCV phiên bản 3.0 sau khi tải về có dạng opencv-3.0.0.exe. Tiến
hành chạy file cài đặt, ta chọn đường dẫn để bộ cài đặt giải nén thư viện OpenCV.
Sau khi giải nén, ta thu được 2 folder:
 Build: chứa thư viện OpenCV đã được biên dịch thành thư viện cho nhiều
ngôn ngữ khác nhau: C++, Java, Python
 Sources: tài liệu hướng dẫn, ví dụ và mã nguồn của OpenCV.

11
Hình 2 Thư viện OpenCV 3.0 sau khi giải nén
Khởi tạo một project C++ trống và đặt tên là TTKT20181

Hình 3 Khởi tạo Project mới với Visual Studio

Tại giao diện của Visual Studio, chọn Project Properties > Configuration
Properties > C/C++ > General > Addition Include Directories, ta thêm đường dẫn
D:\phan mem\Thư viện xử lý ảnh\opencv\build\include.

12
Hình 4 Tích hợp OpenCV vào Project (1)

Tiếp theo, cũng tại trang Project Properties, chọn Linker > General > Addition
Library Directories, thêm vào đường dẫn D:\phan mem\Thư viện xử lý
ảnh\opencv\build\x64\vc12\lib .

Hình 5 Tích hợp OpenCV vào Project (2)


Và tại Linker => Input, ta thêm vào các thư viện sau: opencv_ts300d.lib,
opencv_world300d.lib.

13
Hình 6 Tích hợp OpenCV vào Project (3)
Copy opencv_world300d.dll trong Lib\opencv\bin vàofolder Debug của project.
Tới đây, ta đã kết thúc việc tích hợp thư viện OpenCV vào project.

3.3.2. Viết chương trình nhận dạng vật hình tròn, màu trắng và xác định vị trí tâm
của vật trong ảnh số:
 Đọc và hiển thị một hình ảnh:

Trong thư viện OpenCV cung cấp cấu trúc cũng cấp hình ảnh Mat trong modules
Core . Cấu trúc [5]. Khai báo:
Mat src;
src = imread("that1.jpg");
Hàm imread("that1.jpg") là hàm dùng để đọc hình ảnh truyền vào từ một
file với đối số truyền vào là tên hìn hảnh được chọn.
 Xử lí ảnh:
Chuyển đổi hệ màu RGB ở ảnh gốc sang hệ màu HSV phục vụ cho cho quá
trình nhận dạng, ta sử dụng hàm cvtColor [5]:
cvtColor (src, hsv_image, CV_RGB2HSV);
Với các đối số:
 src: hình ảnh RGB đầu vào.
 hsv_image: hình ảnh đầu ra có cùng size với đầu vào.
 CV_RGB2HSV: code quy định chuyển hệ màu từ RGB sang HSV
Sau khi chuyển đổi từ hệ màu RGB sang hệ màu HSV, ta tiến hành lọc màu

14
ảnh (filter color) bằng cách sử dụng hàm InRange [6] :
inRange (hsv_image,
Scalar (0, 0, 164),
Scalar (48, 0, 255),
imgThreshold1);

inRange (hsv_image,
Scalar (140, 0, 164),
Scalar (180, 0, 255),
imgThreshold2);

imgThreshold = max (imgThreshold1, imgThreshold2);


Khi đã phát hiện được các đối tượng màu sắc cần theo dõi (màu trắng) ta sử
dụng hàm findContours [6] để xác định và vẽ đường biên bao quang các vùng
màu trắng:
findContours(imgThreshold,contours,hierarchy, CV_RETR_TREE,
CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
Để tìm được trọng tâm của vùng màu khép kín, ta sử dụng hàm moments:
vector<Moments> mu (contours.size());
for (int i = 0; i < contours.size(); i++)

{
mu[i] = moments(contours[i], false);
}

vector<Point2f> mc(contours.size());

for (int i = 0; i < contours.size(); i++)

{
mc[i] = Point2f(mu[i].m10 / mu[i].m00, mu[i].m01 /
mu[i].m00);
cout << mc[i] << endl;
}

4. Khâu thiết kế không gian hiển thị, mô phỏng vật thể trong không
gian
4.1. Truy xuất dữ liệu với Apache POI

4.1.1. Giới thiệu về Apache POI?

15
Để hiển thị mô phỏng trước hết chúng ta phải đọc dữ liệu tọa độ các điểm
file excel sang java. Ở đây chúng em sử dụng thư viện Apache POI để đọc dữ liệu

Apache POI là một thư viện mã nguồn mở Java, được cung cấp
bởi Apache. Thư viện này cung cấp các API (phương thức) làm việc với các tài liệu
của Microsoft như Word, Excel, Power point, Visio,

Các class của Apache POI thường có tiếp đầu ngữ HSSF, XSSF, HPSF, … Nhìn
vào tiếp đầu ngữ của một class bạn có thể biết được class đó hỗ trợ loại định dạng
nào.

Hình 7 Các tiếp đầu ngữ trong Apache POI

4.1.2. Tổng quan Apache POI Excel


Microsoft Excel hiện tại có 2 phần mở rộng:

 . xls: tương ứng với phiên bản Microsoft Excel 2003 trở về trước. Định
dạng này được Apache POI hỗ trợ bởi các lớp java với tiếp đầu ngữ là
HSSF.
 .xlsx: tương ứng với phiên bản Microsoft Excel 2007 trở về sau. Định dạng
này được Apache POI hỗ trợ bởi các lớp java với tiếp đầu ngữ là XSSF,
SXSSF.

Một số khái niệm cơ bản của Apache API:

16
Hình 8 Các đối tượng trong Apache POI Excel

Apache POI cung cấp cho bạn các interface Workbook, Sheet, Row, Cell,… và
các class thể hiện (implementation) tương ứng:

 Workbook: đại diện cho một file Excel. Nó được triển khai dưới hai class là:
HSSFWorkbook và XSSFWorkbook tương ứng cho định dạng .xls và .xlsx
.
 Sheet: đại diện cho một bảng tính Excel (một file Excel có thể có nhiều Sheet).
Nó có 2 class là HSSFSheet và XSSFSheet.
 Row: đại diện cho một hàng trong một bảng tính (Sheet). Nó có 2 class là
HSSFRow và XSSFRow
 Cell: đại diện cho một ô trong một hàng (Row). Tương tự nó cũng có 2 class
là HSSFCell and XSSFCell.

4.1.3. Một số thao tác cơ bản với Apache POI Excel


Quy ước chung cần nhớ khi làm việc với Apache POI: Các index của Workbook,
Sheet, Row đều bằng đầu bằng 0.
Workbook:

17
Workbook wb2003 = new HSSFWorkbook();

Workbook wb2007 = new XSSFWorkbook();

Lấy đối tượng Workbook từ file excel có sẵn

String fileExcel2003 = "path/books.xls";

Workbook wb2003 = new HSSFWorkbook(fileExcel2003);

String fileExcel2007 = "path/books.xlsx";

Workbook wb2007 = new XSSFWorkbook(fileExcel2007);

Sheet:
Tạo Sheet mới

// Tạo sheet với tên mặc định Sheet0

Sheet sheet = wb2003.createSheet();

Sheet sheet = wb2007.createSheet();

// Tạo sheet với tên MySheetName

String safeName = WorkbookUtil.createSafeSheetName("MySheetName");

Sheet sheet = wb2003.createSheet(safeName);

Sheet sheet = wb2007.createSheet(safeName);


Lớp WorkbookUtil.createSafeSheetName() được sử dụng để loại bỏ ký tự
không hợp lệ trong tên sheet. Phương thức tiện ích này sẽ thay thế các ký tự không
hợp lệ bằng ký tự khoảng trắng (space).
Lấy đối tượng Sheet từ file sẵn có:

// Lấy sheet theo index

18
// Lấy sheet thứ nhất (index = 0)

Sheet sheet = wb2003.getSheetAt(0);

Sheet sheet = wb2007.getSheetAt(0);

// Lấy sheet theo tên Sheet

Sheet sheet = wb2003.getSheet("MySheetName");

Sheet sheet = wb2007.getSheet("MySheetName");

Lưu ý:

 Phương thức getSheetAt() sẽ throw IllegalArgumentException nếu index <


0 hoặc index >= totalSheet.
 Phương thức getSheet() sẽ trả về NULL nếu không tồn tại tên sheet được chỉ
định.

Row

Tạo Row

1 Row row = sheet.createRow(rowIndex);

Lấy đối tượng Row từ Sheet sẵn có

1 Row row = sheet.getRow(rowIndex);

Lưu ý:

 Phương thức getRow() sẽ trả về giá trị NULL nếu Row tại rowIndex chưa
được tạo.

19
Cell

Tạo Cell

1 Cell cell = row.createCell(columnIndex);

Lấy đối tượng Cell từ Row sẵn có

1 Cell cell = row.getCell(columnIndex);

Tạo Cell công thức

1 cell = row.createCell(columnIndex, CellType.FORMULA);

Lưu ý:

 Phương thức getCell() sẽ trả về giá trị NULL nếu Column tại columnIndex
chưa được tạo.

Gán giá trị cho Cell

1 cell.setCellValue(stringValue);

2 cell.setCellValue(numberValue);

4 // Gán giá trị là một công thức Excel (lưu ý: không có dấu = trong công thức)

5 cell.setCellFormula("SUM(E2:E6)");

7 // ...

Lấy giá trị của Cell

20
1 boolean value = cell.getBooleanCellValue();

2 double value = cell.getNumericCellValue();

3 String value = cell.getStringCellValue();

5 // Get Formula value

6 Workbook workbook = cell.getSheet().getWorkbook();

7 FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();

8 double value = evaluator.evaluate(cell).getNumberValue();

10 // ...

Tự động điều chỉnh độ rộng của cột vừa đủ để hiển thị đầy đủ nội dung

1 for (int columnIndex = 0; columnIndex < lastColumn; columnIndex++) {

2 sheet.autoSizeColumn(columnIndex);

3 }

Lưu ý:

 Phương thức autoSizeColumn() xử lý khá chậm, do đó chỉ sử dụng sau khi


đã hoàn thành xử lý đỗ dữ liệu hoặc chỉ sử dụng khi cần thiết.

CellStyle

Lớp CellStyle được sử dụng để format các dữ liệu xuất ra của file excel chẳng
hạn: font chữ, màu sắc, border, format chữ số thập phân, ..

21
1 // Tạo định dạng: font Times New Roman, in đậm, font-size 14, chữ màu trắng

2 Font font = sheet.getWorkbook().createFont();

3 font.setFontName("Times New Roman");

4 font.setBold(true);

5 font.setFontHeightInPoints((short) 14); // font size

6 font.setColor(IndexedColors.WHITE.getIndex()); // text color

8 // Tạo cell style áp dụng font ở trên

9 // Sử dụng màu nền xanh (Blue), định dạng border dưới

10 CellStyle cellStyle = sheet.getWorkbook().createCellStyle();

11 cellStyle.setFont(font);

12 cellStyle.setFillForegroundColor(IndexedColors.BLUE.getIndex());

13 cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

14 cellStyle.setBorderBottom(BorderStyle.THIN);

15

16 // Áp dụng định dạng CellStyle cho một Cell

17 cell.setCellStyle(cellStyle);

Ví dụ định dạng format hiển thị số:

1 // Tạo format số

22
2 short format = (short)BuiltinFormats.getBuiltinFormat("#,##0");

4 // hoặc

5 DataFormat df = workbook.createDataFormat();

6 short format = df.getFormat("#,##0");

8 // Tạo CellStyle với format số

9 CellStyle cellStyle = workbook.createCellStyle();

10 cellStyle.setDataFormat(format);

11

12 // Áp dụng định dạng CellStyle cho một Cell

13 cell.setCellStyle(cellStyle);

4.2. Hiển thị đồ họa 3D trên Java sử dụng thư viện JOGL

4.2.1. 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
 Bước 1: Tải tập tin cài đặt Visual Studio C++ từ
http://www.microsoft.com/express/Downloads/
 Bước 2: Thực thi tập tin cài đặt và làm theo hướng dẫn để cài đặt Visual
Studio C++. 3.3.2.
Cài đặt thư viện GLUT
 Bước 1: Tải tập tin "glut-3.7.6-bin-32and64.zip" từ
http://www.mediafire.com/?12ncmty5g6mgr7t
 Bước 2: Giải nén tập tin glut-3.7.6-bin-32and64.zip ra thư mục glut-3.7.6-
bin

23
 Bước 3: Trong thư mục glut-3.7.6-bin:
Với phiên bản Windows 32bit (viết ứng dụng 32bit)
 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\MicrosoftSDKs\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 32bit và 64bit)
 Sao chép tập tin glut.h và glut.def vào thư mục
C:\ProgramFiles(x86)\Microsoft SDKs\Windows\v7.0A \Include\gl + Sao
chép glut32.lib và glut64.lib vào thư mục C:\ProgramFiles(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

4.2.2. Cài đặt GLEW (Nên cài đặt)


Bước 1: Tải tập tin "Windows 32-bit and 64-bit Binaries" từ
http://glew.sourceforge.net/
Bước 2: 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

4.2.3. Cấu trúc chương trình java sử dụng thư viện OpenGL vẽ đồ họa 3D
Import thư viện:

import com.jogamp.opengl.GL;
import static com.jogamp.opengl.GL.GL_LINES;

24
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.awt.GLCanvas;
import com.jogamp.opengl.glu.GLU;
import javax.swing.JFrame;
import com.jogamp.opengl.util.FPSAnimator;

Chuong trình cơ bản

public class TEN_CLASS extends JFrame implements GLEventListener {


public static void main(String[] args) {
//opengl final GLProfile profile = GLProfile.get(GLProfile.GL2);
GLCapabilities capabilities = new GLCapabilities(profile);
// The canvas
final GLCanvas glcanvas = new GLCanvas(capabilities);
projectI cube = new projectI();
glcanvas.addGLEventListener(cube);
glcanvas.setSize(800, 800);
final JFrame frame = new JFrame(" Multicolored cube");
frame.getContentPane().add(glcanvas);
frame.setSize(frame.getContentPane().getPreferredSize());
frame.setVisible(true);
final FPSAnimator animator = new FPSAnimator(glcanvas, 300, true);
animator.start();
}
@Override public void display(GLAutoDrawable drawable) {}
@Override public void dispose(GLAutoDrawable drawable) {}
@Override public void init(GLAutoDrawable drawable) {}
@Override public void reshape(GLAutoDrawable drawable, int x, int y, int
width, int height) { }

25
4.2.4. Các chức năng của phần mềm mô phỏng
Chức năng cơ bản :
- Truy xuất dữ liệu tọa độ các hình cầu từ file excel
- Hiển thị mô phỏng chuyển động 3D của các hình cầu
- Thay đổi tốc độ chuyển động của các hình cầu

Chức năng mở rộng : thay đổi góc nhìn


Một phép biến đổi xoay làm quay một vectơ xung quanh gốc tọa độ (0,0,0)bằng
một trục và góc đã cho . Để hiểu cách trục và góc điều khiển một vòng quay, hãy thực
hiện một thí nghiệm nhỏ.

Đặt ngón tay cái của bạn lên trên màn hình của bạn và thử xoay bàn tay của bạn
xung quanh nó. Đối tượng, bàn tay của bạn, đang xoay quanh ngón tay cái của bạn:
trục xoay. Bạn càng xoay tay ra khỏi vị trí ban đầu, góc xoay càng cao.
Theo cách này, trục xoay có thể được tưởng tượng như một mũi tên mà một đối
tượng đang quay xung quanh. Nếu bạn tưởng tượng màn hình của bạn là bề mặt XY
2 chiều, trục xoay (ngón tay cái của bạn) sẽ chỉ theo hướng Z.
Các đối tượng có thể được xoay quanh bất kỳ trục đã cho nào, nhưng hiện tại chỉ
có trục X, Y và Z là quan trọng. Bạn sẽ thấy sau trong chương này rằng bất kỳ trục
xoay nào cũng có thể được thiết lập bằng cách xoay quanh trục X, Y và Z cùng một
lúc.
Các ma trận để quay quanh ba trục được chỉ định ở đây. Góc quay được biểu thị
bằng theta.

+ Xoay theo trục Ox:

26
+ Xoay theo trục Oy:

+ Xoay theo trục Oz

Đừng lo lắng về việc hiểu hình học thực tế đằng sau điều này, giải thích rằng nó
nằm ngoài phạm vi của hướng dẫn này. Điều quan trọng là bạn có một ý tưởng vững
chắc về cách xoay được mô tả bởi trục xoay và góc và ít nhất bạn đã nhìn thấy ma
trận xoay trông như thế nào.

4.3. Xuất bản ứng dụng trong Java


Một trong những công việc mà chúng ta cần phải thực hiện khi đã xây dựng hoàn
chỉnh một ứng dụng (phần mềm) là xuất bản ứng dụng này thành file .exe để người
dùng cuối (end-user) có thể dễ dàng sử dụng mà không cần quan tâm nó được viết ra
như thế nào.
Để xuất bản ứng dụng cần chú ý là ứng dụng được xây dựng với NetBeans 8.0.x
hoặc được xây dựng trên Eclipse sau đó import vào NetBeans. Phần mềm hỗ trợ xuất
bản sản phẩm ra file .exe là Launch4j, bạn có thể dễ dàng tìm thấy trên mạng sau đó
download về và cài đặt. Đây là một phần mềm miễn phí, cài đặt rất dễ dàng với chỉ
vài click chuột.

27
Việc xuất bản này gồm hai giai đoạn, giai đoạn một là tạo file .jar, giai đoạn hai
là tạo file .exe cho ứng dụng.

4.3.1. Tạo file .jar cho ứng dụng:


File .jar là file được biên dịch sau khi xây dựng xong ứng dụng. File này được
tạo trực tiếp từ NetBeans. Người dùng không cần phải mở NetBeans để chạy ứng
dụng mà có thể chạy trực tiếp từ tập tin .jar bằng cách double click vào nó (Lưu ý:
trên máy của người dùng phải cài đặt sẵn JVM – Java Vitual Machine).

Các bước thực hiện:


 Bước 1: Chọn project muốn xuất bản > click phải chọn Properties > chọn
Run > vào mục Main Class > Nhấn Browse… > chọn Main Class muốn xuất
bản > nhấn Select Main Class > nhấn OK

Hình 9 Chọn main class trong project


 Bước 2: Chọn lại project > click phải chọn Clean and Build

28
Hình 10 Clean and build file .jar
 Bước 3: Đến nơi lưu trữ project > chọn thư mục dist để kiểm tra tập tin .jar
vừa xuất bản

Hình 11 Hoàn thành tạo file jar

29
 Bước 4: Double click vào tập tin jar vừa tạo để chạy ứng dụng và kiểm tra

Hình 12 Kiểm tra việc chạy file jar


Sau khi kiểm tra thấy ứng dụng chạy ổn định, chúng ta qua giai đoạn hai là tạo
file .exe.

4.3.2. Tạo file .exe cho ứng dụng:


File .exe là file được tạo ra từ file .jar đã tạo ra ở trên. File này được tạo từ các
phần mềm hỗ trợ xuất file .exe (ở đây chúng ta sử dụng Launch4j). File .exe là file
được sử dụng bởi người dùng cuối bằng cách double click vào nó. (Lưu ý: trên máy
của người dùng phải cài đặt sẵn JVM – Java Vitual Machine).
Các bước thực hiện:
 Khởi động Launch4j

30
Hình 13 Mở giao diện phần mềm lauch4j
 Nhập tên file .exe muốn xuất bản và chọn vị trí lưu trữ (Lưu ý: có thể để ngay
ở thư mục gốc của ứng dụng cho khách hàng dễ tìm hoặc trong thư mục dist
của ứng dụng)

Hình 14 Đặt tên cho file exe


 Tìm và chọn file .jar tương ứng (được tạo ra ở giai đoạn một)

31
Hình 15 Thêm file jar
 Chọn icon cho ứng dụng (tập tin hình ảnh có định dạng .ico)

Hình 16 Thêm icon cho file exe

32
Ở Tab JRE:

Hình 17 Tạo file exe


+ Chọn icon Build wrapper > cửa sổ xuất hiện > nhập tên file .xml > nhấn Save >
xem kết quả
+ Chọn icon Save > cửa sổ xuất hiện > chọn Save
+ Chọn icon Test wrapper chúng ta sẽ thấy ứng dụng sẽ tự động chạy và hiển thị.

33
Hình 18 Chạy thử file exe
+ Đến thư mục dist của ứng dụng, chúng ra sẽ thấy tập tin .exe và các tập tin cần
thiết đã được tạo ra. Chỉ cần double click vào file .exe là ứng dụng sẽ chạy.

Hình 19 Chọn vị trí lưu file

5. Kết quả
5.1. Kết quả hiển thị

5.1.1. Xử lý hình ảnh


Trong ảnh chụp vật thể màu trắng bằng camea Iphone 6, chương trình đã khoanh
vùng được vật thể màu trắng và xác định được tọa độ tâm của vật trong ảnh là
(387.557, 310.994)

34
Hình 20 Kết quả thực hiện chương trình

Ảnh thu nhận qua camera sẽ đc remap với bộ thông số chuẩn của camera để tìm
tâm trong hai ảnh trái phải Tính tọa độ theo công thức Một camera âm thanh nổi là
hai camera cùng loại và thông số kỹ thuật được đặt trên một đường thẳng so với mặt
phẳng dọc hoặc ngang. Khoảng cách đến một đối tượng có thể được đo khi đối tượng
nằm trên điểm quan sát chồng chéo của hai camera quan sát. Hình 1 mô tả hệ thống
tọa độ của một camera âm thanh nổi, được chụp như tại điểm trung tâm giữa camera
bên trái và bên phải. Với sự phù hợp của các tam giác ∆ PCLCR và ∆ PLPR trong
Hình 1, hệ thống tọa độ âm thanh nổi cho cả hai máy ảnh có thể được viết như trong
Phương trình 1 và 2.
𝑏 (𝑏 + 𝑋𝑟) − 𝑋𝑖
=
𝑧 𝑧−𝑓

𝑏∗𝑓 𝑏∗𝑓
𝑧= =
𝑋𝑖 − 𝑋𝑟 𝑑

35
5.1.2. Hiển thị đồ họa 3D
Kết quả hiển thị đồ họa 3D

Hình 21 Kết quả hiển thị đồ họa 3D


Giao diện khi mở ứng dụng

Hình 22 Giao diện của ứng dụng

5.2. Kết quả so mới mục tiêu đề ra


Vì thời gian nghiên cứu chưa dài, hạn chế về mặt kiến thức cùng những khó khăn
trong việc tìm kiếm tài liệu, trình độ ngoại ngữ kém dẫn đến những hạn chế trong
việc đọc tài liệu tiếng anh nên kết quả chưa thực sự tốt, chưa hoàn thành được mục
tiêu đề ra.
Chúng em cố gắng hoàn thiện hơn chương trình của mình để có thể hoàn thành
xâu chuỗi giữa các khâu với nhau sau đấy phát triên đề tài hơn nữa.

36
C. KẾT LUẬN
Sau 1 học kì học tập và nghiên cứu, cuối cùng nhóm chúng em đã hoàn thành được
mục tiêu ban đầu của dự án. Qua lần thực hiện đề tài này, không chỉ kiến thức và kỹ
năng lập trình được nâng cao, chúng em còn được rèn luyện thêm các kĩ năng làm
việc nhóm, kỹ năng thuyết trình, khả năng và phương pháp tư duy.
Mặc dù đã cố gắng để hoàn thành, nhưng vì nhiều lý do chủ quan và khách quan,
đề tài này của chúng em còn nhiều thiếu sót, chưa được hoàn thiện theo như mong
muốn của thầy giáo. Chúng em mong rằng thầy giáo sẽ tạo điều kiện để chúng em có
thể hoàn thiện đề tài này trong thời gian tới.
Lời cuối chúng em xin chân thành cám ơn các thầy, cô trên viện Điện tử - Viễn
thông, TS. Đào Việt Hùng, các bạn sinh viên cùng tham gia nghiên cứu tại phòng Lab
C9-308A đã giúp đỡ trực tiếp chúng em trong trong việc nghiên cứu đề tài này.

37
D. TÀI LIỆU THAM KHẢO
Đọc Ghi file excel trong Java sử dụng Apache POI
[1]https://o7planning.org/vi/11259/doc-ghi-file-excel-trong-java-su-dung-apache-
poi

Java 3D
[2] https://www.slideshare.net/huyna88/java-3d
[3]https://tailieu.vn/doc/gioi-thieu-va-tong-quan-thu-vien-opengl-va-glut-
1263687.html
[4]https://text.123doc.org/document/1568453-gioi-thieu-va-tong-quan-thu-vien-
opengl-va-glut-doc.htm
[5]https://designervn.net/threads/tim-hiu-cong-ngh-nhn-dang-hinh-anh-va-x-ly-
hinh-anh.6628/
[6]http://itplus-academy.edu.vn/Uu-va-nhuoc-diem-cua-Python-trong-lap-trinh.html
[7]http://niithanoi.vn/chi-tiet-tin/1729/7-diem-manh-5-diem-yeu-cua-ngon-ngu-lap-
trinh-java.html#.XD6U61wzbIV
[8]https://daynhauhoc.com/t/loi-arrayindexoutofboundsexception-khi-hien-thuc-
insertion-sort/2394/5
[9]www.oracle.com/technetwork/java/index.htmlhttp://
[10]www.java3d.org/samples.htmlhttps://
[11]www.google.com/search?q=h%C3%A0m+GL_POINT+trong+JOGL&oq=h%
C3%A0m+GL_POINT+trong+JOGL&aqs=chrome..69i57.18240j0j7&sourceid=chr
ome&ie=UTF-8
[12] https://open.gl/transformations
[13] https://community.khronos.org/t/opengl-rotation-function/70020
[14] https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glRotate.xml

38
PHỤ LỤC
 Code truy xuất dữ liệu excel

/*
* To change this license header, choose License Headers
in Project Properties.
* To change this template file, choose Tools |
Templates
* and open the template in the editor.
*/
package project1;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
*
* @author Nick
*/
public class ImportExcel {

/**
*
*/
public static ArrayList<Double> ArrayX = new
ArrayList<>();
private static final String FILE_NAME = "Demo.xlsx";

public static double a[] = {0.0d, 0.0d, 0.0d, 0.0d,


1.0d, 1.0d, 1.0d, 1.0d};

39
public static double b[] = {0.0d, 0.0d, 1.0d, 1.0d,
0.0d, 0.0d, 1.0d, 1.0d};
public static double c[] = {0.0d, 1.0d, 0.0d, 1.0d,
0.0d, 1.0d, 0.0d, 1.0d};

//main
public static void main(String[] args) {
ArrayX.clear();
try {

FileInputStream excelFile = new


FileInputStream(new File(FILE_NAME));
Workbook workbook = new
XSSFWorkbook(excelFile);
Sheet datatypeSheet =
workbook.getSheetAt(0);
Iterator<Row> iterator =
datatypeSheet.iterator();

while (iterator.hasNext()) {

Row currentRow = iterator.next();


Iterator<Cell> cellIterator =
currentRow.iterator();

while (cellIterator.hasNext()) {

Cell currentCell =
cellIterator.next();

ArrayX.add(currentCell.getNumericCellValue());
}

}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(ArrayX);

for (int i = 0; i < 24; i++) {

40
if (i % 3 == 0) {
a[i / 3] = ArrayX.get(i);
} else if (i % 3 == 1) {
b[(i - 1) / 3] = ArrayX.get(i);
} else {
c[(i - 2) / 3] = ArrayX.get(i);
}

}
for (int i = 0; i < 8; i++) {
System.out.println("Tọa độ của điểm thứ " +
(i + 1) + " là:" + "(" + a[i] + "," + b[i] + "," + c[i]
+ ")");

}
}

 Code hiển thị 3D

/*
* To change this license header, choose License Headers
in Project Properties.
* To change this template file, choose Tools |
Templates
* and open the template in the editor.
*/
package project1;

import com.jogamp.opengl.GL;
import static com.jogamp.opengl.GL.GL_LINES;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.awt.GLCanvas;
import com.jogamp.opengl.glu.GLU;
import javax.swing.JFrame;
import com.jogamp.opengl.util.FPSAnimator;

41
public class Cube extends JFrame implements
GLEventListener {

/**
*
*/
public static double a[] = {0.0d, 0.0d, 0.0d, 0.0d,
1.0d, 1.0d, 1.0d, 1.0d};
public static double b[] = {0.0d, 0.0d, 1.0d, 1.0d,
0.0d, 0.0d, 1.0d, 1.0d};
public static double c[] = {0.0d, 1.0d, 0.0d, 1.0d,
0.0d, 1.0d, 0.0d, 1.0d};

//main
public static void main(String[] args) {

//opengl
final GLProfile profile =
GLProfile.get(GLProfile.GL2);
GLCapabilities capabilities = new
GLCapabilities(profile);

// The canvas
final GLCanvas glcanvas = new
GLCanvas(capabilities);
projectI cube = new projectI();

glcanvas.addGLEventListener(cube);
glcanvas.setSize(800, 800);

final JFrame frame = new JFrame(" Multicolored


cube");
frame.getContentPane().add(glcanvas);

frame.setSize(frame.getContentPane().getPreferredSize())
;
frame.setVisible(true);
final FPSAnimator animator = new
FPSAnimator(glcanvas, 300, true);

animator.start();

42
}

//other
private GLU glu = new GLU();
private float rotation = 0.0f;

@Override
public void display(GLAutoDrawable drawable) {

final GL2 gl = drawable.getGL().getGL2();


gl.glClear(GL.GL_COLOR_BUFFER_BIT |
GL.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glTranslatef(-2.0f, 0.0f, -6.0f);

gl.glRotatef(0, 1.0f, 1.0f, 1.0f);

//Oxyz
//Ox red
gl.glBegin(gl.GL_LINES);
gl.glColor3d(1.0, 0.0, 0.0);
gl.glVertex3d(0.0, 0.0, 0.0);
gl.glVertex3d(10.0, 0.0, 0.0);
gl.glEnd();
//OY yellow
gl.glBegin(GL_LINES);
gl.glColor3d(1.0, 1.0, 0.0);
gl.glVertex3d(0.0, 0.0, 0.0);
gl.glVertex3d(0.0, 10.0, 0.0);
gl.glEnd();
//OZ blue
gl.glBegin(GL_LINES);
gl.glColor3d(0.0, 0.0, 1.0);
gl.glVertex3d(0.0, 0.0, 0.0);
gl.glVertex3d(0.0, 0.0, 10.0);
gl.glEnd();

//cube
// create solid cube
gl.glTranslated(0.0, 0.0, 0.0);
gl.glRotatef(rotation, 1.0f, 1.0f, 0.0f);
gl.glScaled(0.5, 0.5, 0.5);

43
gl.glBegin(gl.GL_POLYGON);
gl.glColor3d(0.0f, 0.0f, 0.1f);
gl.glVertex3d(a[0], b[0], c[0]);
gl.glVertex3d(a[1], b[1], c[1]);
gl.glVertex3d(a[3], b[3], c[3]);
gl.glVertex3d(a[2], b[2], c[2]);
gl.glEnd();

gl.glBegin(gl.GL_POLYGON);
gl.glColor3d(0.0f, 1f, 0.0f);
gl.glVertex3d(a[0], b[0], c[0]);
gl.glVertex3d(a[2], b[2], c[2]);
gl.glVertex3d(a[6], b[6], c[6]);
gl.glVertex3d(a[4], b[4], c[4]);
gl.glEnd();

gl.glBegin(gl.GL_POLYGON);
gl.glColor3d(1.0f, 0f, 0f);
gl.glVertex3d(a[1], b[1], c[1]);
gl.glVertex3d(a[3], b[3], c[3]);
gl.glVertex3d(a[7], b[7], c[7]);
gl.glVertex3d(a[5], b[5], c[5]);
gl.glEnd();

gl.glBegin(gl.GL_POLYGON);
gl.glColor3d(1f, 1f, 0f);
gl.glVertex3d(a[1], b[1], c[1]);
gl.glVertex3d(a[5], b[5], c[5]);
gl.glVertex3d(a[4], b[4], c[4]);
gl.glVertex3d(a[0], b[0], c[0]);
gl.glEnd();

gl.glBegin(gl.GL_POLYGON);
gl.glColor3d(1f, 0f, 1f);
gl.glVertex3d(a[4], b[4], c[4]);
gl.glVertex3d(a[5], b[5], c[5]);
gl.glVertex3d(a[7], b[7], c[7]);
gl.glVertex3d(a[6], b[6], c[6]);
gl.glEnd();

gl.glBegin(gl.GL_POLYGON);
gl.glColor3d(1, 1.0, 1.0f);

44
gl.glVertex3d(a[2], b[2], c[2]);
gl.glVertex3d(a[6], b[6], c[6]);
gl.glVertex3d(a[7], b[7], c[7]);
gl.glVertex3d(a[3], b[3], c[3]);
gl.glEnd();

gl.glFlush();

rotation += 0.6f;
}

@Override
public void dispose(GLAutoDrawable drawable) {

@Override
public void init(GLAutoDrawable drawable) {
final GL2 gl = drawable.getGL().getGL2();
gl.glEnable(GL.GL_DEPTH_TEST); // bật chức năng
cho phép loại bỏ một phần của đối tượng bị che bởi đối
tượng khác

@Override
public void reshape(GLAutoDrawable drawable, int x,
int y, int width, int height) {

final GL2 gl = drawable.getGL().getGL2();


if (height <= 0) {
height = 1;
}

final float h = (float) width / (float) height;


gl.glViewport(0, 0, width, height);
gl.glMatrixMode(gl.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluLookAt(0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0,
1.0, 0.0);

glu.gluPerspective(45.0f, h, 1.0, 20.0);

45
gl.glMatrixMode(gl.GL_MODELVIEW);
gl.glLoadIdentity();
}
}

 Code phần mềm cuối cùng

package javafxapplication4;

import com.jogamp.opengl.GL;
import static com.jogamp.opengl.GL.GL_LINES;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.awt.GLCanvas;
import com.jogamp.opengl.glu.GLU;
import javax.swing.JFrame;
import com.jogamp.opengl.util.FPSAnimator;
import java.io.File;
import java.util.ArrayList;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

46
/**
* 80
*
* @author admin
*/
public class JavaFXApplication4 extends Application
implements GLEventListener{

ArrayList<Double> arrayX = new ArrayList<>();


Scene scene; Stage stage;
public static ArrayList<Double> ArrayX = new
ArrayList<>();
private static final String FILE_NAME = "Demo.xlsx";
private GLU glu = new GLU();
private float rotation = 0.0f;
public static double a[] = {0.0d, 0.0d, 0.0d, 0.0d, 1.0d,
1.0d, 1.0d, 1.0d};
public static double b[] = {0.0d, 0.0d, 1.0d, 1.0d, 0.0d,
0.0d, 1.0d, 1.0d};
public static double c[] = {0.0d, 1.0d, 0.0d, 1.0d, 0.0d,
1.0d, 0.0d, 1.0d};
public static void main(String[] args) throws IOException
{
launch(args);
}
@Override
public void start(Stage primaryStage) throws IOException
{
stage = primaryStage;
Button getDataButton = new Button("Get Data");
Button playButton = new Button("Play");

//Lấy dữ liệu từ file Excel vào mảng


getDataButton.setOnAction(e -> {
arrayX.clear();

try {
getData();
} catch (IOException ex) {

Logger.getLogger(JavaFXApplication4.class.getName()).log(Leve
l.SEVERE, null, ex);
}

});

47
//JavaFx Animation
playButton.setOnAction(e -> {
play();
System.out.println(e.toString());
});

HBox layout = new HBox(20);

layout.getChildren().addAll(getDataButton,playButton);
layout.setAlignment(Pos.CENTER);
scene = new Scene(layout, 300, 250);
stage.setTitle("Demo");
stage.setScene(scene);
stage.show();
}
public void play(){
//opengl
final GLProfile profile =
GLProfile.get(GLProfile.GL2);
GLCapabilities capabilities = new
GLCapabilities(profile);

// The canvas
final GLCanvas glcanvas = new GLCanvas(capabilities);
JavaFXApplication4 app = new JavaFXApplication4();

glcanvas.addGLEventListener(app);
glcanvas.setSize(800, 800);

final JFrame frame = new JFrame(" Multicolored


cube");
frame.getContentPane().add(glcanvas);

frame.setSize(frame.getContentPane().getPreferredSize());
frame.setVisible(true);
final FPSAnimator animator = new
FPSAnimator(glcanvas, 300, true);
animator.start();

}
public void getData() throws FileNotFoundException,
IOException{

48
try {

FileInputStream excelFile = new


FileInputStream(new File(FILE_NAME));
Workbook workbook = (Workbook) new
XSSFWorkbook(excelFile);
Sheet datatypeSheet = workbook.getSheetAt(0);
Iterator<Row> iterator =
datatypeSheet.iterator();

while (iterator.hasNext()) {

Row currentRow = iterator.next();


Iterator<Cell> cellIterator =
currentRow.iterator();

while (cellIterator.hasNext()) {

Cell currentCell = cellIterator.next();

ArrayX.add(currentCell.getNumericCellValue());
//getCellTypeEnum shown as deprecated for
version 3.15
//getCellTypeEnum ill be renamed to
getCellType starting from version 4.0
// if (currentCell.getCellTypeEnum() ==
CellType.STRING) {
//
System.out.print(currentCell.getStringCellValue() + "++");
// } else if
(currentCell.getCellTypeEnum() == CellType.NUMERIC) {
//
//
System.out.println(currentCell.getNumericCellValue());
// }

}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

49
System.out.println(ArrayX);

for (int i = 0; i < 24; i++) {


switch (i % 3) {
case 0:
a[(i-1)/ 3] = ArrayX.get(i);
break;
case 1:
b[(i - 1) / 3] = ArrayX.get(i);
break;
default:
c[(i - 2) / 3] = ArrayX.get(i);
break;
}

}
for (int i = 0; i < 8; i++) {
System.out.println("Tọa độ của điểm thứ " + (i +
1) + " là:" + "(" + a[i] + "," + b[i] + "," + c[i] + ")");

}
}

@Override
public void display(GLAutoDrawable drawable) {

final GL2 gl = drawable.getGL().getGL2();


gl.glClear(GL.GL_COLOR_BUFFER_BIT |
GL.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glTranslatef(-2.0f, 0.0f, -6.0f);

gl.glRotatef(0, 1.0f, 1.0f, 1.0f);

//Oxyz
//Ox red
gl.glBegin(gl.GL_LINES);
gl.glColor3d(1.0, 0.0, 0.0);
gl.glVertex3d(0.0, 0.0, 0.0);
gl.glVertex3d(10.0, 0.0, 0.0);
gl.glEnd();
//OY yellow
gl.glBegin(GL_LINES);
gl.glColor3d(1.0, 1.0, 0.0);

50
gl.glVertex3d(0.0, 0.0, 0.0);
gl.glVertex3d(0.0, 10.0, 0.0);
gl.glEnd();
//OZ blue
gl.glBegin(GL_LINES);
gl.glColor3d(0.0, 0.0, 1.0);
gl.glVertex3d(0.0, 0.0, 0.0);
gl.glVertex3d(0.0, 0.0, 10.0);
gl.glEnd();

//cube

// create solid cube


gl.glTranslated(0.0, 0.0, 0.0);
gl.glRotatef(rotation, 1.0f, 1.0f, 0.0f);
gl.glScaled(0.5, 0.5, 0.5);
gl.glBegin(gl.GL_POLYGON);
gl.glColor3d(0.0f, 0.0f, 0.1f);
gl.glVertex3d(a[0], b[0], c[0]);
gl.glVertex3d(a[1], b[1], c[1]);
gl.glVertex3d(a[3], b[3], c[3]);
gl.glVertex3d(a[2], b[2], c[2]);
gl.glEnd();

gl.glBegin(gl.GL_POLYGON);
gl.glColor3d(0.0f, 1f, 0.0f);
gl.glVertex3d(a[0], b[0], c[0]);
gl.glVertex3d(a[2], b[2], c[2]);
gl.glVertex3d(a[6], b[6], c[6]);
gl.glVertex3d(a[4], b[4], c[4]);
gl.glEnd();

gl.glBegin(gl.GL_POLYGON);
gl.glColor3d(1.0f, 0f, 0f);
gl.glVertex3d(a[1], b[1], c[1]);
gl.glVertex3d(a[3], b[3], c[3]);
gl.glVertex3d(a[7], b[7], c[7]);
gl.glVertex3d(a[5], b[5], c[5]);
gl.glEnd();

gl.glBegin(gl.GL_POLYGON);
gl.glColor3d(1f, 1f, 0f);
gl.glVertex3d(a[1], b[1], c[1]);
gl.glVertex3d(a[5], b[5], c[5]);
gl.glVertex3d(a[4], b[4], c[4]);

51
gl.glVertex3d(a[0], b[0], c[0]);
gl.glEnd();

gl.glBegin(gl.GL_POLYGON);
gl.glColor3d(1f, 0f, 1f);
gl.glVertex3d(a[4], b[4], c[4]);
gl.glVertex3d(a[5], b[5], c[5]);
gl.glVertex3d(a[7], b[7], c[7]);
gl.glVertex3d(a[6], b[6], c[6]);
gl.glEnd();

gl.glBegin(gl.GL_POLYGON);
gl.glColor3d(1, 1.0, 1.0f);
gl.glVertex3d(a[2], b[2], c[2]);
gl.glVertex3d(a[6], b[6], c[6]);
gl.glVertex3d(a[7], b[7], c[7]);
gl.glVertex3d(a[3], b[3], c[3]);
gl.glEnd();

gl.glFlush();

rotation += 0.6f;
}

@Override
public void dispose(GLAutoDrawable drawable) {

@Override
public void init(GLAutoDrawable drawable) {
final GL2 gl = drawable.getGL().getGL2();
gl.glEnable(GL.GL_DEPTH_TEST); // bật chức năng cho
phép loại bỏ một phần của đối tượng bị che bởi đối tượng khác

@Override
public void reshape(GLAutoDrawable drawable, int x, int
y, int width, int height) {

final GL2 gl = drawable.getGL().getGL2();


if (height <= 0) {
height = 1;
}

52
final float h = (float) width / (float) height;
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(gl.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluLookAt(0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0,
0.0);

glu.gluPerspective(45.0f, h, 1.0, 20.0);


gl.glMatrixMode(gl.GL_MODELVIEW);
gl.glLoadIdentity();
}
}

53

You might also like