Professional Documents
Culture Documents
Thiết kế phần mềm mô phỏng chuyển động của khung xương
Thiết kế phần mềm mô phỏng chuyển động của khung xương
Thiết kế phần mềm mô phỏng chuyển động của khung xương
ĐỒ ÁN II
Đề tài: Thiết kế phần mềm mô phỏng
chuyển động của khung xương
HÀ NỘI - 2019
MỤC LỤC
C. KẾT LUẬN........................................................................................................37
1
DANH MỤC HÌNH ẢNH
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.
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
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:
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).
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
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.
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.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.
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.
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.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.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.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
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.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
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
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 .
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);
{
mu[i] = moments(contours[i], false);
}
vector<Point2f> mc(contours.size());
{
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
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.
. 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.
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.
17
Workbook wb2003 = new HSSFWorkbook();
Sheet:
Tạo Sheet mới
18
// Lấy sheet thứ nhất (index = 0)
Lưu ý:
Row
Tạo Row
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
Lưu ý:
Phương thức getCell() sẽ trả về giá trị NULL nếu Column tại columnIndex
chưa được tạo.
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 // ...
20
1 boolean value = cell.getBooleanCellValue();
10 // ...
Tự động điều chỉnh độ rộng của cột vừa đủ để hiển thị đầy đủ nội dung
2 sheet.autoSizeColumn(columnIndex);
3 }
Lưu ý:
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
4 font.setBold(true);
11 cellStyle.setFont(font);
12 cellStyle.setFillForegroundColor(IndexedColors.BLUE.getIndex());
13 cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
14 cellStyle.setBorderBottom(BorderStyle.THIN);
15
17 cell.setCellStyle(cellStyle);
1 // Tạo format số
22
2 short format = (short)BuiltinFormats.getBuiltinFormat("#,##0");
4 // hoặc
5 DataFormat df = workbook.createDataFormat();
10 cellStyle.setDataFormat(format);
11
13 cell.setCellStyle(cellStyle);
4.2. Hiển thị đồ họa 3D trên Java sử dụng thư viện JOGL
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.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;
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
Đặ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.
26
+ Xoay theo trục Oy:
Đừ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.
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.
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
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
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)
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)
32
Ở Tab JRE:
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.
5. Kết quả
5.1. Kết quả hiển thị
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
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";
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 {
while (iterator.hasNext()) {
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);
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]
+ ")");
}
}
/*
* 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);
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) {
//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) {
45
gl.glMatrixMode(gl.GL_MODELVIEW);
gl.glLoadIdentity();
}
}
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{
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());
});
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);
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 {
while (iterator.hasNext()) {
while (cellIterator.hasNext()) {
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 < 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) {
//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
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) {
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);
53