Luận văn -Xây dựng hệ thống mô phỏng và thực tại ảo sử dụng ngôn ngữ WAVE

Chương trình WAVE có thể được đóng gói để chạy nhưmột ứng dụng riêng biệt, tuy nhiên, vì trong chương trình chúng ta sử dụng các thư viện của WAVE để chạy nên chúng ta sẽ gộp chung chương trình hiển thị và WAVE vào chung một project của Netbeans cho thuận tiện hơn khi chạy.

pdf143 trang | Chia sẻ: lylyngoc | Ngày: 28/10/2013 | Lượt xem: 2400 | Lượt tải: 3download
Bạn đang xem nội dung tài liệu Luận văn -Xây dựng hệ thống mô phỏng và thực tại ảo sử dụng ngôn ngữ WAVE, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
,1) và CREATEGRID(5,5;6,1). Tuy nhiên CREATEGRID(5,5;6,1) có các điểm được quy ước ngầm như bên dưới: Hình 3-19 minh họa cho lưới thực địa ngầm định trong trường hợp gốc tọa độ ở vị trí (6-1) Mã được viết trong chương trình để tạo ra một lưới rất đơn giản.Ban đầu, chương trình đặt biến trạng thái status. Khi khởi tạo chương trình, biến này sẽ có giá trị bằng 0. 6 7 9 8 1 10 4 2 5 3 Hình 4-19.Lưới thực địa với gốc là tọa độ (6-1) 68 Khi chương trình hiển thị nhận được một thông điệp và kiểm tra xem thông điệp đó có chứa lệnh điều khiển để tạo ra một lưới hay không, nếu đó là lệnh tạo lưới, chương trình sẽ phân tích lệnh này tiếp nhằm kiểm tra các tham số của lệnh có phù hợp và đúng với định dạng của lệnh tạo lưới hay không. Đoạn mã dưới được cài đặt vào trong chương trình: 69 Sau khi phân tích dữ liệu và lấy được ra tham số phù hợp với lệnh, chương trình sẽ gọi đến hàm tạo lưới: Hàm này, thực chất chỉ thay đổi biến status thành 1 và thiết lập độ dài và độ rộng cho lưới, còn việc hiển thị lưới được đặt trong trong hàm paintComponent: 4.4.5. Tạo chướng ngại vật Chướng ngại vật là tập hợp của các hình vuông. Mỗi một chướng ngại vật khi được thiết lập chương trình hiển thị sẽ thiết lập và tạo ra tại nút tương ứng một hình vuông được tô màu, để tạo ra một chướng ngại vật liên tiếp tại nhiều nút khác nhau cần truyền vào cho chương trình hiển thị vị trí của các nút tương ứng và chương trình sẽ hiển thị hình vuông tại mỗi nút đó. if (status == 1) { int x_grid = translation_x; int y_grid = translation_y; for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { g.drawRect(x_grid, y_grid, similar_width, similar_width); x_grid += similar_width; } x_grid = translation_x; y_grid += similar_width; } } private void createGrid(int num_x, int num_y) { x = num_x; y = num_y; status = 1; repaint(); } 70 Để tạo ra một chướng ngại vật, câu lệnh để tạo có định dạng: CREATEOBST(x,y): Trong đó: CREATEOBST: mã lệnh tạo chướng ngại vật x: vị trí của chướng ngại vật theo chiều ngang y: vị trí của chướng ngại vật theo chiều dọc Ví dụ, chúng ta muốn tạo một chướng ngại vật tại nút có tọa độ (4,4), câu lệnh tạo chướng ngại vật là: CREATEOBST(4,4) Hình 4-20. Chướng ngại vật tại tọa độ (4,4) Muốn tạo một chướng ngại vật theo hình tam giác tại (2,2), (2,3), (3,2) chúng ta phải sử dụng liên tiếp: CREATEOBST(2,2), CREATEOBST(2,3), CREATEOBST(3,2) 71 Hình 4-21. Chướng ngại vật được tạo liên tiếp 4.4.6. Di chuyển Sự di chuyển vị trí của một nút từ vị trí này đến vị trí khác thực ra chỉ là các thủ tục: xóa nút ở vị trí cũ và tạo ra một nút giống hệt nút cũ ở vị trí mới. Để tạo ra một nút mới, cần truyền cho chương trình hiển thị một lệnh có định dạng: CREATENODE(x,y,color) Để xóa một nút, cần truyền cho chương trình hiển thị một lệnh có dạng: DELETENODE(x,y,color) Trong đó: CREATENODE: mã lệnh tạo nút DELETENODE: mã lệnh xóa nút 72 x: vị trí của nút theo chiều ngang y: vị trí của nút theo chiều dọc color: màu của nút Màu của nút được quy ước: 0: Black (màu đen) 1: White (màu trắng) 2: Red (màu đỏ) 3: Blue (màu xanh) Để di chuyển một nút từ tọa độ(x1,y1) có màu color đến tọa độ(x2,y2), câu lệnh di chuyển như sau: MOVEFROMTO(x1,y1,color;x2,y2) Ví dụ, chúng ta tạo ra một nút có màu đỏ tại tọa độ (1,1) và một nút màu xanh tại tọa độ (3,2): CREATENODE(1,1,2) 73 Hình 4-22. Tạo node với tọa độ (1-1) và màu đỏ Hình 4-22 minh họa cho việc tạo node với màu đỏ trên lưới thực địa CREATENODE(3,2,3) Hình 4-23.Tạo node với tọa độ (3-2) và màu xanh Hình 4-23 minh họa cho việc tạo node với màu xanh trên lưới thực địa Sau đó, chúng ta di chuyển nút màu đỏ sang tọa độ (2,2): 74 MOVEFROMTO(1,1,2;2,2) Hình 4-24. Di chuyển node trên lưới thực địa Hình 4-24 minh họa cho việc di chuyển một node trên lưới thực địa sang một vị trí mới.Trong hình trên, màu đỏ đã di chưyển từ vị trí (1-1) sang (2-2). 75 CHƯƠNG 5. CÁC BÀI TOÁN MÔ PHỎNG PHỨC TẠP 5.1. Bài toán “Hồng cầu, Bạch cầu, Virus” 5.1.1. Mô tả chung Trong chương trước, chúng ta đã làm quen được với các bài toán cơ bản khi sử dụng ngôn ngữ Wave trong việc mô phỏng. Chương này sẽ giới thiệu một bài toán phức tạp hơn, ứng dụng đầy đủ các bài toán trước. Đó là bài toán mô phỏng hồng cầu, bạch cầu, virus. Chúng ta sẽ sử dụng lưới để mô phỏng không gian thực địa. Các đối tượng sẽ có thể di chuyển theo 4 hướng trong lưới: đi lên, đi xuống, sang bên phải, sang bên trái. Chúng ta có ba loại đối tượng đó là đối tượng hồng cầu, đối tượng bạch cầu, và đối tượng virus. Hồng cầu là đối tượng di chuyển tự do trong không gian.Virus luôn tìm cách tiếp cận hồng cầu và ăn hồng cầu đồng thời sản sinh ra virus mới. Bạch cầu luôn tìm virus để tiêu diệt.Tùy vào độ lớn của virus mà cần 1 số lượng bạch cầu để tiêu diệt. 5.1.2. Hồng cầu Mô tả Đây là đối tượng di chuyển tự do. Hồng cầu khởi đầu có số lượng nhiều nhất. Khi gặp virus, hồng cầu sẽ bị virus ăn và biến mất. Thuật toán 76 5.1.3. Bạch cầu Mô tả Đối tượng bạch cầu khi di chuyển luôn tìm kiếm virus. Nếu không thấy, nó sẽ di chuyển tự do trong không gian. Khi gặp virus, hồng cầu sẽ chết đi và làm cho virus bị suy yếu. Thuật toán 77 5.1.4. Virus Mô tả Đối tượng virus luôn tìm hồng cầu để gây bệnh. Nếu không tìm thấy hồng cầu, virus sẽ di chuyển tự do. Khi ăn được hồng cầu, virus sẽ sinh ra một virus khác. Mỗi virus sẽ có một chỉ số sức khỏe nhất định. Khi gặp bạch cầu, virus sẽ bị suy yếu, giảm chỉ số sức khỏe. Nếu chỉ số sức khỏe xuống mức 0, virus sẽ bị chết. Thuật toán 78 79 5.2. Bài toán “Rầy nâu” 5.2.1. Mô tả chung Sơ bộ về cây lúa Lúa (Oryza sativa L.) gồm 3 loại: Indica, Japonica, Javanica. Các giống lúa nhiệt đới thuộc loại Indica, các giống lúa ôn đới thuộc loại Japonica, còn loại Javanica có hạt rất dài, hàm lượng amylose từ 20 - 25 thì rất ít gặp. Giống địa phương là những giống cổ truyền được gieo trồng theo tập quán địa phương, thường cao gầy, dễ đổ, năng suất thấp, yêu cầu phân bón ít. Chu kỳ sinh trưởng của cây lúa trải qua 6 giai đoạn: mạ, đẻ nhánh, làm đòng, ngậm sữa, trổ bông và chín rộ. Hạt lúa sau khi chín có thời gian ngủ nghỉ vài ba tuần hoặc lâu hơn. Đặc tính này có lợi cho vùng nhiệt đới nóng và ẩm, đặc biệt khi bị ngập nước và lúa đổ. Sơ bộ về sâu rầy nâu Chu kỳ sinh trưởng và phát triển sâu rầy nâu Rầy nâu hay còn gọi là muội nâu,có tên khoa học là Nilaparvata lugens Stal, thuộc họ muội bay (Delphacidae), bộ cánh đều (Homoptera). Nó có ở các vùng trồng lúa trong nước và thế giới. Ngoài cây lúa, rầy nâu còn có thể phá hoại trên các cây ngô, mì, mạch, kê, cỏ gấu, cỏ lồng vực... Vòng đời của rầy nâu thay đổi theo mùa, trải qua 3 giai đoạn chính: thời gian trứng, rầy non, rầy trưởng thành. Rầy trưởng thành sau khi vũ hoá 3 - 5 ngày thì bắt đầu đẻ trứng, thời gian đẻ trứng dài. Mỗi con cái có khả năng đẻ từ 71 - 408 quả trứng, thường đẻ vào buổi chiều. Thời gian trứng nở phụ thuộc nhiều vào yếu tố ngoại cảnh. Trứng rầy nâu ở nhiệt độ 18.7 - 21.6o C, qua 13 - 14 ngày thì nở, ở nhiệt độ 23.4 - 29.6o C qua 5 - 9 ngày nở. Trứng nở rải rác trong một ngày. Tỉ lệ trứng nở cao trên 90%. 80 Rầy non ít di động, thường tập trung hút dịch cây ở phần dưới khóm lúa. Nếu khua động có thể nhảy hoặc bỏ trốn. Rầy trưởng thành có hai dạng: cánh dài và cánh ngắn. Tỉ lệ xuất hiện cửa các dạng phụ thuộc vào điều kiện nhiệt độ, độ ẩm, và dinh dưỡng. Nhiệt độ thấp, độ ẩm cao, thức ăn phong phú thì xuất hiện dạng cánh ngắn nhiều. Nhiệt độ cao, độ ẩm thấp, thức ăn không thích hợp thì xuất hiện dạng cánh dài nhiều. Rầy dạng cánh ngắn có tuổi sống dài, tỉ lệ cái/đực cao, số lượng rầy đẻ trứng cao hơn cánh dài. Do đó khi rầy cánh ngắn xuất hiện nhiều thì có khả năng thành dịch. Rầy trưởng thành có thể sống từ 3 - 50 ngày. Nhìn chung, thời gian sinh trưởng phát dục các giai đoạn của rầy nâu biến động như sau: • Trứng: 5.5- 14 ngày. • Rầy non: 12.5 - 32.5 ngày. • Rầy trưởng thành: 3 - 50 ngày. Quy luật phát sinh phát triển và các yếu tố ảnh hưởng Rầy thường tập trung thành đám ở trên thân cây lúa dưới khóm để hút nhựa, làm cho cây khô héo và chết. Khi bị khua động thì bỏ trốn bằng cách bò ngang, nhảy sang cây khác, hoặc xuống nước, hoặc bay xa đi chỗ khác. Ban ngày rầy ít hoạt động ở trên lá lúa, chiều tối bò lên phía trên thân lúa hoặc lá lúa. Khi lúa ở thời kỳ chín, phần dưới của thân lúa đã cứng khô thì ban ngày rầy tập trung phía trên cây lúa hoặc gần chỗ non mềm của cuống bông để hút nhựa, làm cho bông lúa bị lép một nửa hoặc toàn bộ. Rầy nâu còn là véc tơ truyền bệnh lúa lùn xoăn lá gây thiệt hại rất lớn cho mùa màng. Kinh nghiệm thực tế nhiều năm cho thấy khi ruộng lúa xuống giống được khoảng 20-25 ngày, lúa bắt đầu “phát” thì cũng là lúc Rầy nâu cánh dài từ nơi khác di chuyển đến đẻ trứng tạo thế hệ Rầy non thứ nhất. Nếu gặp điều kiện thuận lợi Rầy sẽ nhanh chóng tích lũy số lượng và tạo thế hệ rầy non thứ hai vào khoảng 50-55 ngày sau khi gieo sạ (lúc lúa làm đòng) và thế hệ Rầy non thứ ba vào khoảng 30 ngày sau đó (sau trổ-ngậm sữa). 81 Những năm có dịch thường Rầy sẽ gây “cháy rầy” vào hai đợt rầy sau (nhất là ở đợt rầy non thứ ba), vì thế cần hết sức cảnh giác với hai đợt rầy này. Như vậy, một năm rầy nâu có thể sinh thành 6 -7 lứa. Trong đó có 2 lứa cần được chú ý theo dõi để phòng trừ, đó là lứa rầy phá hại vào tháng 4 - 5 (đối với vụ chiêm xuân, đặc biệt vùng chiêm trũng) và lứa tháng 7 - 9 (đối với vụ mùa). Rầy nâu phát sinh gây hại thường đầu tiên xuất hiện thành từng vạt giữa ruộng, sau đó lan dần ra quanh ruộng. Qui luật phát sinh và mức độ gây hại liên quan nhiều đến yếu tố sinh cảnh. Thường thường nếu trước một thời gian nào đó nhiệt độ không khí cao, độ ẩm cao, lượng mưa nhiều, sau đó trời hửng nắng, nhiệt độ cao, độ ẩm thấp thì rầy nâu dễ phát sinh thành dịch. Thông thường nhiệt độ 20 - 30oC và độ ẩm 80 - 85 % là điều kiện thích hợp cho rầy nâu sinh sống và phát triển. Mức độ và triệu chứng tác hại Sâu rầy nâu là một trong những loại sâu được xếp vào hàng sâu bệnh nguy hiểm cho cây lúa. Chúng chích hút nhựa làm cây khô héo và chết hoặc làm cho bông lúa bị lép một nửa hoặc toàn bộ, làm giảm năng suất cây trồng và giảm chất lượng sản phẩm. Ngoài ra, rầy nâu còn là vectơ truyền bệnh vàng lùn và lùn xoắn lá - một bệnh cực kỳ nguy hiểm, gây nhiều thiệt hại cho cây trồng. Năm 1958, rầy nâu phát sinh thành dịch phá hại lúa chiêm từ thời kỳ trổ - chín ở các tỉnh phía Bắc. Vụ mùa năm 1962 và 1971, rầy nâu đã gây nhiều thiết hại lớn cho lúa như ở Nghệ An. Ở các tỉnh phía Nam từ năm 1970, rầy nâu đã gây thiệt hại nặng trên các giống lúa NN8, NN5, NN20 ở nhiều tỉnh thuộc đồng bằng sông Cửu Long, đồng bằng ven biển khu 5 và Thừa Thiên. Năm 1974, diện tích lúa bị rầy nâu hại ở các tỉnh phía Nam lên tới 97.869 ha. Từ năm 1975, đặc biệt từ tháng 11/1977, trong suốt 3 tháng từ tháng 11 – 1, rầy nâu gây thành dịch trên diện tích lúa rộng 200.000 ha. Các tỉnh Bến Tre, Tiền Giang và Long An là nơi bị rầy hại nghiêm trọng nhất (Tài liêu Cục bảo vệ thực vật) 82 Trong những năm gần đây, đặc biệt là vụ hè thu năm 2005 - 2006, nạn rầy nâu, kéo theo là dịch bênh vàng lùn xoắn lá lại trở lại, gây thiệt hại trên diện tích lúa rộng hơn 73.000 ha. Các tỉnh vùng Đồng bằng sông Cửu Long bị thiệt hại nặng nhất. Bài toán dự đoán Giới thiệu bài toán dự đoán tổng quát Trong thực tế, có rất nhiều vấn đề cần được dự toán trước. Một ví dụ đơn giản, một câu lạc bộ có truyền thống là tổ chức buổi tiệc thường niên cho tất cả các thành viên của câu lạc bộ và cả bạn bè của họ, có thể gặp gỡ. Những người có ý định tham dự sẽ báo trước cho ban tổ chức chậm nhất là trước nửa tháng. Vấn đề đặt ra là ban tổ chức muốn dự đoán số người thực sự sẽ đến dựa trên cơ sở số người báo trước là bao nhiêu để tránh phí phạm. Hay trong kinh kế, người ta muốn dự đoán giá cả thị trường tăng hay giảm để quyết định việc mua hay bán các mặt hàng sao cho có lãi nhất. Rất nhiều nhiều các nhu cầu dự đoán khác trong tương lai làm cơ sở cho phương hướng hoạt động của cá nhân, tập thể trong thời gian tới. Bài toán đặt ra là, chúng ta có thể xây dựng một mô hình toán học dựa trên các yếu tố ảnh hưởng tới vấn đề cần dự đoán để dự đoán một vấn đề nào đó hay không. Hướng tiếp cận bài toán Có hai hướng tiếp cận chính để dự đoán. Hoặc là ước lượng giá trị tương lai dựa trên phân tích các nhân tố có ảnh hưởng tới các giá trị tương lai (phương thức chứng minh (the explanatory method)), hoặc là dự đoán dựa trên việc suy luận từ các dữ liệu tổng quát trên thực tế đã xảy ra theo thời gian (phương thức ngoại suy - the extrapolation method). Trong phương thức chứng minh, từ các nhân tố có ảnh hưởng tới các giá trị tương lai, ta xây dựng một hàm tương quan. Từ đó, ta có thể dự đoán giá trị tương lai khi có giá trị các nhân tố ảnh hưởng. Trong phương thức ngoại suy, các dữ liệu tổng quát trên thực tế đã xẩy ra thường biến thiên theo một quy luật nhất định. Bằng việc thu thập dữ liệu đã xẩy ra trong thời gian dài, ta tìm ra quy luật biến thiên và từ đó, suy luận giá trị tương lai se xẩy ra 83 Giới thiệu bài toán đự đoán mật độ rầy nâu tên cây lúa Như đã nói ở trên, sâu rầy nâu thường tập trung gây hại trên diện rộng ở một số thời kỳ nhất định của vụ lúa. Bài toán đặt ra là chúng ta muốn dự đoán thời kỳ sâu gây hại nặng nhất để có biện pháp phòng trừ thích hợp. Hướng giải quyết Để tìm được hướng giải quyết, ta nghiên cứu vòng đời, quy luật phát sinh gây hại của rầy nâu và các yếu tố liên quan. Ta đã biết, qui luật phát sinh và mức độ gây hại của Rầy nâu liên quan nhiều đến yếu tố sinh cảnh. Có hai yếu tố chính ảnh hưởng đến vòng đời và mức độ gây hại của rầy nâu là: nhiệt độ và độ ẩm. Qua tài liệu thống kê, mặc dù mật độ rầy nâu gây thiệt hại ở từng thời kỳ qua từng năm là có quy luật, song rất khó để xác định được hàm tuyến tính để dự đoán mật độ rầy nâu gây hại trong thời gian tới một cách chính xác chỉ bằng phương pháp mô hình hoá thống kê thông thường. Phương pháp dùng ngôn ngữ WAVE để mô phỏng hành vi của Rầy từ đó tạo ra các dữ liệu thống kê theo thời gian được đề xuất sử dụng rất hữu hiệu. 5.2.2. Chi tiết bài toán Để đơn giản, coi nhiệt độ và độ ẩm là tham số theo ngày – tức là được cập nhật hàng ngày. Môi trường: Môi trường trong bài toán này là ruộng lúa lớn. Môi trường được chia ra thành lưới ô vuông, mỗi ô vuông ứng với một node, giữa các node cạnh nhau có link nối với nhau thể hiện chúng tiếp giáp với nhau. Hàng ngày, số lượng lúa trong mỗi node sẽ tăng theo một lượng nhất định. Rầy nâu đầu tiên sẽ xuất hiện trên khu vực giữa của lưới. Sau đó nó sẽ lan rộng ra các node xung quanh, mỗi ngày lan được tối đa một node. Tại mỗi node, ta định ra một số tham số sau: • Nraytt: số lượng rầy trưởng thành trên 1 node 84 • Ntrung: số lượng trứng rầy trong 1 node • Nlua: số lượng đơn vị thức ăn cho rầy trong 1 node Mỗi Đối tượng Rầy có những tham số sau: • Tuổi (tính theo ngày): o Tuổi <14: dưới dạng trứng o 14<Tuổi <32:rầy non o Tuổi >32: rầy trưởng thành • Di chuyển: Nếu node bên cạnh có Nlua lớn và Nraytt ít thì sẽ di chuyển đến node đó. Nếu không nó sẽ ở lại node hiện tại đợi đến ngày tiếp theo. • Ăn: o rầy non ăn 1lúa/ngày o rầy trưởng thành ăn 2 lúa/ngày • Đẻ: rầy trưởng thành đẻ 8 trứng / ngày • Chết: Rầy chết khi xảy ra các trường hợp sau o Tuổi >60 o Nlua tại node hiện tại bằng 0 và nó cũng không di chuyển được vì xung quanh không đạt được đủ điều kiện di chuyển. Thuật toán 85 Với hệ thống: 86 Khởi tạo Nlua trên các node bằng 100 Khởi tạo thời gian Ntime bằng 1. Cứ sau một khoảng thời gian, ta sẽ tăng Ntime lên 1. Ntime tăng đến 110 (gần 4 tháng cho một vụ lúa). Song song với việc tăng Ntime, ta sẽ tăng thêm Nlua ở mỗi node thêm một lượng nào đó. Cách thể hiện của chương trình Chúng ta sẽ sử dụng hệ thống đi theo lượt. Cứ mỗi khi chạy xong một bước, chuỗi wave rầy sẽ phải tạm dừng lại đợi chuỗi wave tăng Ntime và Nlua chạy thì mới tiếp tục chạy tiếp. 87 CHƯƠNG 6. 3D VÀ THỰC TẠI ẢO 6.1. Giới thiệu công nghệ 3D 6.1.1. Công nghệ 3D Các ứng dụng đồ họa thường thấy trên tivi hoặc trên máy tính thực ra chỉ là tập hợp của các bức ảnh hai chiều. Các bức ảnh này, chỉ đưa ra hình chiếu của vật thể theo một góc nào đó. Để theo dõi được hết vật thể, chúng ta cần chụp lại một số lượng lớn ảnh hai chiều. Điều này đã gây nên sự hạn chế khác lớn của con người với vật thể được quan sát. Công nghệ này được gọi là công nghệ 2D. Ví dụ, nếu bạn muốn mua một chiếc xe đạp, bạn ghé thăm một trang web bán xe đạp và tìm chiếc xe mà mình ưng ý. Tuy nhiên, trang web này chỉ có thể đưa cho bạn các thông tin về chiếc xe và một số hình ảnh chụp được về nó. Hình 6-1.Xe đạp được thể hiện với công nghệ 2D 88 Công nghệ 3D ra đời đã tạo ra một sự biến đổi to lớn giúp con người có thể quan sát vật thể dưới dạng 3 chiều. Bạn có thể quan sát từng chi tiết trên vật thể, có thể quay mọi hướng tương tự như ngoài đời vậy. Hình 6-2.Xe đạp được thể hiện với công nghệ 3D 6.1.2. Giới thiệu về Java 3D Java 3D được phát triển bởi Sun Microsystems. Java 3D thực ra là một giao diện lập trình ứng dụng cho phép lập trình viên thiết kế và xây dựng các ứng dụng 3D. Chương trình được viết bằng Java 3D có thể là một chương trình ứng dụng hoặc được nhúng vào Applet. Các chương trình được viết bằng Java 3D có thể chạy trên bất cứ hệ điều hành nào có cài đặt máy ảo Java và các thư viện hỗ trợ Java 3D. 6.2. Chương trình GnuPlot GnuPlot là một chương trình mô phỏng được ứng dụng rộng rãi trong các ngành khoa học với khả năng đưa ra đồ thị của các hàm và dữ liệu được đưa ra từ dòng lệnh. 89 Gnuplot được phát triển trên nhiều nền tảng khác nhau nên nó có nhiều phiên bản để chạy trên các hệ thống cài đặt hệ điều hành riêng, do vậy nó chạy được trên Unix, Linux, IBM OS/2, MS Windows, DOS, Macintosh, VMS, Atari và nhiều hệ điều hành khác. GnuPlot được thiết kế nhằm mục đích phục vụ cho sinh viên và các nhà khoa học để trực quan hóa các hàm và dữ liệu toán học, do vậy GnuPlot được phân phối miễn phí. GnuPlot hỗ trợ vẽ đồ thị dưới dạng 2D và 3D. Nó có thể vẽ được hầu hết các đối tượng hình học cơ bản và nâng cao như điểm, đoạn thẳng, hình hộp, vec tơ, bề mặt vật thể, … Bên dưới là đồ thị hàm sin(x) với x nằm trong khoảng từ -5 đến 5 dưới dạng 2D: Hình 6-3.Đồ thị hàm sin(x) Đồ thị được hiển thị dưới dạng 3D của hàm x2 + y2: 90 Hình 6-4.Đồ thị hàm x2 + y2 hiển thị 3D 6.3. Ngôn ngữ VRML 6.3.1. Khái niệm VRML và các phiên bản của VRML VRML (Virtual Reality Modeling Language) là ngôn ngữ mô hình hóa thực tại ảo, sử dụng mô hình phân cấp trong việc thể hiện các tương tác với đối tượng của mô hình. Phiên bản đầu tiên của VRML là 1.0, nó được ra đời vào tháng 10 năm 1994. Các file VRML 1.0 phải khai báo tại dòng đầu tiên của file nội dung #VRML V1.0 ascii. Dưới đây là một file VRML 1.0: 91 Sau một thời gian VRML được cải tiến lên phiên bản 2.0 với nhiều ưu điểm hơn so với 1.0 với các chức năng mạnh mẽ và trở thành một chuẩn phát triển cho các ứng dụng đồ họa. Các file VRML 2.0 bắt buộc phải có #VRML V2.0 utf8 tại dòng đầu tiên. #VRML V1.0 ascii Separator { Separator{ Material { diffuseColor 0 1 1 } Sphere { radius 10 } } Transform { rotation 1 100 8 1 } Separator { Transform { translation 0 20 20 } Material { diffuseColor 0 0 1 } Sphere { radius 2 } } } 92 Ví dụ một một file VRML 2.0: VRML ra đời nhằm mục đích xây dựng lên một ngôn ngữ internet 3D để phát triển đồ họa 3D trên web. 6.3.2. Ngôn ngữ VRML Các file VRML có phần mở rộng *.wrl, *.wgz, *.wrz. Trong đó wrl là định dạng chuẩn, còn hai định dạng còn lại là các định dạng nén của VRML. Thực chất các file VRML chỉ là các file văn bản nhưng nó được sắp xếp theo một trật tự và quy tắc nhất định để mô tả về vật thể trong thế giới 3D. #VRML V2.0 utf8 Transform { translation -4 4 0 children Transform { rotation 0 1 1 0 children Shape { appearance Appearance { material Material { diffuseColor 1 0 0 } } geometry Cylinder { } } } } 93 Một file VRML được cấu tạo từ các nút cơ bản. Các nút cơ bản này là các khối hình học cơ sở dùng để tạo nên thế giới 3D. Các đối tượng hình học này bao gồm: hình hộp (Box), hình trụ (Cylinder), hình nón (Cone), hình cầu (Sphere), … Tọa độ trong VRML được quy ước như hình vẽ: Với VRML 1.0, để vẽ một hình cầu với bán kính là 10, chúng ta chỉ cần khai báo: Sphere { radius 10 } Hình 6-6.Khối cầu với bán kính 10 trong VRML VRML có các phép biến đổi là: phép quay, phép dịch chuyển, phép tỉ lệ. x y z Hình 5-5.Tọa độ trong VRML 6 94 Phép quay (Rotation): được sử dụng để cho phép quay trong không gian 3 chiều. Cú pháp của phép quay: rotation x y z a – với x, y, z tương ứng là ba trục, a là góc quay. Phép dịch chuyển (Translation): dịch chuyển đối tượng tới vị trí bất kỳ trong không gian. Cú pháp của phép dịch chuyển: translation x y z - với x, y, z là các toạ độ theo ba trục tương ứng. Phép tỉ lệ (Scale): được hiểu như phép đồng dạng, cho phép nhân đối tượng với các tỷ lệ khác nhau. Cú pháp của phép tỉ lệ: scale x y z - trong đó x, y, z là tỉ lệ theo ba trục tương ứng. Ba loại biến đổi trên được sử dụng bên trong nút Transform. Ví dụ: Transform { translation 1 1 1 rotation 0 1 0 0.78 scale 2 1 2 } 6.4. Sử dụng Wave và GnuPlot 6.4.1. Giới thiệu chung Trong các chương trước, chúng ta đã nói về việc sử dụng lưới thực địa trong môi trường 2D. Nếu chúng ta thêm vào mỗi node giá trị Nodal z lưu giữ về độ cao, chúng ta có thể làm việc được với môi trường 3D, đặc biệt là việc mô phỏng các địa hình động với sự trợ giúp của các chương trình hiển thị đồ họa 3D, trong đó có GnuPlot. 95 6.4.2. Đọc file và tạo KN Với sự trợ giúp của chương trình đọc file, ta sẽ lấy được tọa độ (x, y, z) tại mỗi node. Từ đó ta sẽ có được tập các giá trị đầu vào để tạo KN. Việc tạo KN hoàn toàn giống như tạo trong môi trường 2D nhưng chỉ khác một điểm là chúng ta có thêm một biến Nodal Nz lưu giữ chiều cao (tọa độ z). Với sức mạnh của wave, chúng ta có thể lưu giữ KN trên một hoặc nhiều máy, từ đó tạo điều kiện tốt cho việc xử lý song song trên nhiều máy trong việc cập nhật hoặc duyệt KN để hiển thị file. Phần code tạo KN minh họa xin xem thêm ở phần phụ lục A. 6.4.3. Cập nhật dữ liệu Việc cập nhật dữ liệu có thể tiến hành hết sức đơn giản. Chúng ta chỉ việc thay đổi giá trị độ cao bằng cách nhảy đến node có tọa độ (x-y) và thay đổi giá trị Nz(z) tương ứng. 6.4.4. Duyệt KN và tạo file đầu vào cho GnuPlot Việc duyệt KN có thể tiến hành bằng cách đi lần lượt qua từng node trong KN từ trái qua phải, từ dưới lên trên. Cứ đi đến đâu, ta lưu ra giá trị x, y, Nz tương ứng. Nếu KN phân tán trên nhiều máy, ta có thể làm tăng hiệu suất duyệt bằng cách sử dụng nhiều bộ xử lý trên nhiều máy cùng duyệt KN một cách song song. Dữ liệu sau khi duyệt xong sẽ trở thành đầu vào cho chương trình tạo file đầu vào cho GnuPlot. Phần hiển thị sẽ được trình bày sau trong chương sau. 6.5. Thực tại ảo 6.5.1. Giới thiệu chung Việc mô phỏng các đối tượng 3d trên máy tính ngày càng phổ biến. Các ngôn ngữ hỗ trợ cho việc hiển thị cũng phát triển không ngừng. VRML là một trong những ngôn ngữ hỗ trợ như thế. Trong mục này, chúng ta đề cập đến VRML 1.0. Kết hợp với ngôn ngữ WAVE, chúng ta có thể mô phỏng được các thực thể 3d trong file VRML trên một hoặc nhiều máy, tận dụng được sức mạnh xử lý song song và phân tán. 96 6.5.2. Đọc file và tạo KN Với một chương trình parser VRML, chúng ta có thể dễ dàng đọc được các node trong file VRML. Những node đó sẽ là đầu vào cho chuỗi wave tạo KN. Chương trình Wave hiển thị cấu trúc của một file VRML dưới dạng cây. Sau khi tạo được KN từ file VRML ban đầu, ta có thể tận dụng được sức mạnh của WAVE trong việc xử lý phân tán trên nhiều máy, cập nhật trong lúc chạy và xử lý một cách song song, từ đó chúng ta đã biến file VRML từ thực thể tĩnh thành thực thể động. Ví dụ với 1 file VRML đơn giản: #VRML V1.0 ascii Separator { Separator { Material { diffuseColor 0 1 1} Sphere { radius 10 } } Separator { Transform { translation 0 20 20 } Material { diffuseColor 0 0 1 } Sphere { radius 2 } 97 } } Thuật toán sinh Wave code tạo KN: 98 KN của chúng ta sau khi đọc file và tạo với WAVE Hình 5-7 biểu diễn KN của Wave khi mô tả cấu trúc của file VRML. Việc duyệt nội dung hoặc cập nhật file VRML đều rất đơn giản. Để duyệt nội dung một file VRML sau đó sử dụng WAVE để tạo ra một KN cần phải qua một bước trung gian phân tích cú pháp file VRML và trình bày dữ liệu của file VRML dưới một cấu trúc dữ liệu bao gồm các nút và các nhánh con. Cấu trúc dữ liệu sẽ được sử dụng có cấu trúc dạng cây. Khi có cấu trúc dữ liệu này và dữ liệu phân tích được gán chương trình sẽ lấy dữ liệu ra từ cây và đưa vào KN một cách dễ dàng. Chương trình phân tích dữ liệu của file VRML được gọi là parser, hiện tại chương trình chỉ phân tích các file VRML đơn giản, hỗ trợ các dữ liệu phổ biến trong VRML 1.0. Chương trình parser được thiết kế với thuật toán như sau: 1 start 3 2 1 2 1 1 2 1 1 1 1 p Separator Separator1 Material1 diffuseColor 0 1 1 Radius1 10Sphere1 Separator2 Material1 diffuseColor 0 1 1 Radius2 2Sphere1 Transform translation 0 20 20 1 Hình 6-7.KN dạng cây của file VRML 99 Thuật toán được thể hiện dưới dạng sơ đồ khối: Bắt đầu Đọc file VRML Lấy nội dung file Kiểm tra xem nội dung file có đúng chuẩn VRML 1.0 hay không Nếu không đúng, kết thúc Nếu đúng chuyển sang bước tiếp theo Lấy dữ liệu từng thành phần trong nội dung file VRML Gắn dữ liệu nhận được vào từng nút tương ứng của dữ liệu hình cây Kết thúc 100 Nội dung file sau khi được đọc cần được duyệt lại và kiểm tra xem có tuân thủ theo chuẩn VRML 1.0 hay không. Thuật toán kiểm tra được thiết kế với các dữ liệu trong file VRML đơn giản, mặc dù chưa thể kiểm tra hết tất cả các trường hợp hợp lệ nhưng thuật toán cũng đã kiểm tra được các cú pháp phổ biến của VRML 1.0 như tiêu đề file và dấu kết thúc file. Đoạn chương trình kiểm tra sẽ được viết dưới dạng hàm, kết quả trả về của hàm là TRUE hoặc FALSE. Nếu kết quả trả về là TRUE, nội dung của file được kiểm tra là file VRML 1.0. Nếu kết quả trả về là FALSE, nội dung của file không tuân thủ đúng tiêu chuẩn của file VRML 1.0. Đầu tiên, chúng ta sẽ gán một biến isVRML bằng FALSE, biến này sẽ được dùng làm giá trị trả về của hàm kiểm tra. Sau đó kiểm tra dòng đầu và ký tự cuối cùng của file để thay đổi giá trị của biến isVRML. Sau khi kiểm tra xong, hàm trả về giá trị của isVRML là TRUE hay FALSE. Thuật toán có thể rút gọn bằng cách kiểm tra đồng thời cả dòng đầu tiên lẫn ký tự cuối cùng để đưa ra kết quả, tuy nhiên, do Bắt đầu Đọc file Lấy nội dung file Kết thúc Lấy dữ liệu từng thành phần Gắn dữ liệu nhận được và từng nút của cây Không theo chuẩn VRML 1.0 Theo chuẩn VRML 1.0 Hình 6-8.Sơ đồ khối thuật toán Parser 101 trong quá trình duyệt là tuần tự nên ở đây, thuật toán kiểm tra từng điều kiện một sau đó mới đưa ra kết quả. Sơ đồ khối của thuật toán: Bắt đầu Đặt isVRML = FALSE Duyệt nội dung file Kiểm tra dòng đầu tiên của nội dung file Nếu bắt đầu bằng #VRML V1.0 ascii (không phân biệt hoa thường), gán isVRML = TRUE Nếu không gán isVRML = FALSE Kiểm tra ký tự kết thúc nội dung file VRML Nếu ký tự là }, gán isVRML = isVRML ∩ TRUE Nếu không phải là }, gán isVRML = isVRML ∩ FALSE Trả về giá trị của isVRML Kết thúc 102 Bắt đầu isVRML = FALSE line1 = Dòng đầu của file endChar = Ký tự cuối cùng của file line1 == “#VRML V1.0 ascii” isVRML = TRUE Đúng isVRML = FALSE Sai endChar == ‘}’ isVRML = isVRML ∩ TRUE isVRML = isVRML ∩FALSE Đúng Sai Kết thúc Sơ đồ khối thuật toán kiểm tra một file có phải là VRML hay khôngHình 6-9.Sơ đồ khối thuật toán kiể tra ột file có phải là VR L hay không 103 6.5.3. Cập nhật VRML Sau khi kiểm tra nội dung của file tuân thủ đúng chuẩn của VRML 1.0, chúng ta cần phải lấy dữ liệu từng thành phần của file sau đó gắn dữ liệu này vào cấu trúc cây của chương trình. Việc cập nhật file VRML rất đơn giản. Chúng ta chỉ cần thêm vào KN những node tương ứng và cập nhật vào cây cấu trúc. Trong ví dụ dưới đây, chúng ta sẽ làm cho hình cầu nhỏ quay quanh hình cầu lớn bằng cách thêm thuộc tính rotation cho nó. Node mới sẽ kết nối với Seperator 2 theo link “1”. Số thứ tự của cách link cũ sẽ được cập nhật tăng lên 1 đơn vị để thể hiện thứ tự mới của các phần tương ứng trong file VRML. Với mỗi ba giây, chúng ta sẽ cập nhật file một lần với giá trị rotation mới thể hiện việc hình cầu nhỏ quay xung quanh hình cầu lớn. 104 6.5.4. Duyệt KN và tạo file VRML Khi chúng ta đã có KN gồm tất cả các node, khâu cuối cùng trước khi hiển thị file VRML đó là duyệt các node trên KN để đưa ra đầu vào cho chương trình tạo file VRML. Thuật toán Material1 Transform2 Separator Separator1 star Separator2 t ri l2 4 3 2 1 2 1 1 2 1 1 diffuseColor2 0 1 1 Sphere2 Transform1 Radius2 2 rotation1 0 20 20 Sphere1 Radius1 10 diffuseColor1 0 1 1 Material1 Translation1 0 20 20 1 1 1 1 1 Hình 6-10.KN sau khi thêm node mới 105 6.5.5. Thay đổi cách nhìn Trong ngôn ngữ VRML, các đối tượng hình học được biểu diễn trong không gian tại các vị trí đã xác định. Mặc dù là cố định nhưng chúng ta vẫn có thể thay đổi cách nhìn của các vật thể này theo các hướng khác nhau, phụ thuộc vào việc chúng ta đặt nguồn sáng ở đâu trong không gian và hướng nhìn của chúng ta từ phía nào. Hình bên dưới mô tả một cách trực quan hơn về vấn đề này: 106 Để có thể thay đổi cách nhìn trong VRML, chúng ta sử dụng nút Transform và sử dụng phép một trong các phép biến đổi dịch chuyển, xoay và tỉ lệ. Ban đầu nội dung của file VRML được chuyển vào thành một KN như bên dưới: Muốn thay đổi cách nhìn, chúng ta có thể sử dụng một, hai hoặc cả ba phép biến đổi cùng một lúc. Ở đây chúng ta chỉ sử dụng phép biến đổi translation (dịch chuyển), chỉ cần thay đổi giá trị của translation, file VRML có thể được nhìn thấy dưới một góc khác: Separator diffuseColor 0 1 1 0 Sphere Transform Radius 2 translation 0 20 20 Materia Cách nhìn 1 Cách nhìn 2 Hình 6-11.Hai cách nhìn khác nhau trong VRML Hình 6-12.Cách nhìn ban đầu 107 6.5.6. Hiển thị trên nhiều máy tính Ngày nay, tính toán và xử lý song song là vấn đề được quan tâm nhiều nhất. Hiệu năng của một máy tính dù cao đến đâu cũng chỉ đáp ứng được tối đa một số lượng công việc nào đó. Tính toán và xử lý song song đem lại hiệu suất cao trong công việc. Để dễ hình dung, chúng ta có ví dụ cụ thể về con người, với một khối lượng công việc A, theo mô hình làm việc cũ, một người chỉ có thể làm công việc A, những người con lại không thể tham gia vào công việc này. Thời gian để một người làm xong A là T. Ngày nay, công việc A có thể được làm chung bởi một nhóm người, những người này cùng nhau làm công việc A, thời gian để hoàn thành công việc giảm xuống rất nhiều, nhỏ hơn so với T nhiều lần, phụ thuộc vào số lượng người tham gia. Như vậy, nhiều người tham gia làm cùng một công việc sẽ nâng cao hiệu suất, giảm thời gian trễ. Các tệp tin VRML được thiết kế đơn giản và cấu trúc dữ liệu của tệp tin VRML có thể hình dung như cấu trúc dữ liệu của một cây với nhiều nhánh (lá) khác nhau. Bình thường, việc hiển thị các tệp tin VRML cực kỳ đơn giản và nhanh chóng. Tuy nhiên, khi dung lượng của tệp tin lớn dần, số nhánh tăng lên với số lượng cực kỳ lớn, lúc đó, vấn đề hiển thị file bắt đầu phát sinh. Bộ nhớ của máy tính cần phải được cấp phát cho chương trình hiển thị sẽ bắt buộc phải được nâng cấp đủ để hiển thị, bộ vi xử lý phải hoạt động nhiều và chiếm tài nguyên của máy tính do số lượng đối tượng hình họa cần biểu diễn rất lớn. Thông thường, các tệp tin VRML có kích thước lớn chiếm rất nhiều tài nguyên của máy tính để hiển thị được, cũng có nhiều trường hợp không thể hiển thị được các tệp tin Separator diffuseColor 0 1 1 0 Sphere Transform Radius 2 translation 0 2 2 Materia Hình 6-13.Một cách nhìn khác 108 có dung lượng lớn này. Như vậy, một máy tính có thể không đảm đương được nhiệm vụ hiển thị một tệp tin VRML. Mục đích cuối cùng của người sử dụng là làm sao hiển thị được nội dung này. Trong khi một máy tính là không thể nhưng nhiều máy tính sẽ là có thể. Dựa vào cấu trúc linh hoạt của tệp tin VRML, chúng ta sẽ phân bổ các nhánh (nút) trong tệp tin VRML tới các máy tính khác nhau để mỗi máy tính nhận nhiệm vụ hiển thị từng nhánh. Tổng hợp tất cả các máy tính chúng ta sẽ quan sát được tổng thể nội dung cần hiển thị của tệp tin VRML. Trong thực tế, một trường đại học có nhiều cửa ra vào khác nhau, tại mỗi một cửa ra vào sẽ có một khu vực bảo vệ. Mỗi khu vực bảo vệ chỉ có quyền kiểm soát và quản lý khu vực của mình. Tất cả các khu vực đều chịu sự quản lý chung của một khu vực bảo vệ Một máy tính không thể hiển thị được Máy tính 1 Máy tính 2 Máy tính 3 Nhưng nhiều máy tính có thể hiển thị được Hình 6-14.Hiển thị trên nhiều máy tính 109 cao nhất, khu vực này quản lý toàn bộ các khu vực khác và có quyền kiểm soát toàn bộ mọi khu vực trong trường. Vấn đề nảy sinh trong trường này ở chỗ phải làm sao để mỗi một khu vực khác nhau chỉ có quyền với khu vực đó mà không có quyền tại khu vực khác, các sự việc tại khu vực này không làm xáo trộn khu vực kia và khu vực bảo vệ cao nhất biết được việc làm và giải quyết được tại mọi khu vực. Tương tự trong việc hiển thị tệp tin VRML, giả sử trong một chương trình, một file VRML bao gồm 3 khu vực hiển thị, chúng ta cần mỗi một máy tính chỉ được nhìn thấy một phần nội dung là mỗi môt khu vực hiển thị. Nếu để các máy tính đều hiển thị chung một tệp tin VRML thì các máy này sẽ nhìn thấy được toàn bộ nội dung hình ảnh hiển thị của tệp tin. Như vậy, vấn đề chưa được giải quyết. Phần trên, chúng ta đã biết, tệp tin VRML có thể được hình dung việc tổ chức dữ liệu được thực hiện theo dạng cây nên ta có thể phân chia việc hiển thị theo các nhánh khác nhau. Dựa vào đặc điểm này, chúng ta sẽ chia từng nhánh, chính là các khu vực hiển thị, cho các máy tính. Mỗi máy tính sẽ chịu trách nhiệm hiển thị từng nhánh. Do vậy đảm bảo được yêu cầu mỗi máy sẽ chỉ xem được nội dung hình ảnh hiển thị là một phần hình ảnh của tệp tin VRML. Tại mỗi một máy tính, công việc cập nhật nội dung cho nhánh đó sẽ không thể ảnh hưởng được tới các nhánh còn lại, chính vì thế đảm bảo được quyền truy cập cho tệp tin được đặt ra ở trên đối với một máy tính. Chúng ta sẽ thiết lập một máy tính có thể xem được toàn bộ nội dung của tệp tin VRML, máy này đóng vai trò là máy tính trung tâm, nơi có thể biết được các máy khác làm các công việc gì liên quan tới các nhánh, và cũng có thể sửa đổi nội dung của các nhánh. 110 KN trong Wave có thể phân bố trên một hoặc nhiều máy. Trên một máy, chúng ta có thể hiện thị từng phần hoặc toàn bộ file VRML. Bằng cách đặt node “start” và gắn node đó với một nhánh trên cây KN trên một máy, ta có thể sử dụng duyệt và tạo ra file VRML với nội dung là một phần hoặc toàn bộ file ban đầu. Bằng cách gọi chương trình hiển thị VRML, ta có thể xem được file VRML vừa tạo được. Việc làm trên có thể làm song song trên nhiều máy cùng lúc giúp chúng ta phân bố và hiển thị được file VRML trên nhiều máy tính, góp phần làm tăng hiệu suất duyệt và hiển thị. 1 Máy tính trung tâm 3 2 1 Máy tính 1 2 Máy tính 2 3 Máy tính 3 Hình 6-15.Mỗi máy tính hiển thị một khu vực khác nhau 111 Material2 start2 1 1 Transform2 Separator Separator1 start Separator2 4 3 2 1 2 1 2 1 1 diffuseColor2 0 1 1 Sphere2 Transform1 Radius2 2 rotation1 0 20 20 Sphere1 Radius1 10 diffuseColor1 0 1 1 Material1 translation1 0 20 20 1 1 1 1 1 Hình 6-16. Đặt nút start tại một node khác node gốc 112 CHƯƠNG 7. CÀI ĐẶT VÀ THỬ NGHIỆM 7.1. Cài đặt 7.1.1. Các yêu cầu về phần cứng Muốn cài đặt và chạy các chương trình mô phỏng và hiển thị tệp tin VRML, chúng ta cần phải có những máy tính với phần cứng tối thiểu như sau: - CPU Pentium 4 - Bộ nhớ màn hình 64MB - RAM 128MB ( phụ thuộc vào yêu cầu tối thiểu của hệ điều hành được cài đặt) - Màn hình, chuột, bàn phím - Ổ đĩa cứng trống tối thiểu 30MB Để chạy được các chương trình trên nhiều máy tính, chúng ta cần phải có từ hai máy tính trở lên với cấu hình mỗi máy tối thiểu theo yêu cầu trên và mỗi máy phải có một card mạng và kết nối mạng với nhau. 7.1.2. Các yêu cầu về phần mềm Chương trình mô phỏng và hiển thị tệp tin VRML đòi hỏi từng phần mềm khác nhau được cài đặt sẵn, để chạy được tất cả các chương trình, cần phải có tối thiểu các phần mềm sau: - Hệ điều hành Windows, Linux, Unix, … (Bắt buộc phải sử dụng Windows để chạy chương trình GnuPlot và hiển thị tệp tin VRML tại các phiên bản hiện tại) - JRE phiên bản 6 - Java 3D phiên bản 1.5.2 - Netbeans 6.1 (Dùng để chạy chương trình dễ dàng hơn) - Bộ thư viện X3D - GnuPlot phiên bản 4.2.5 113 7.2. Thử nghiệm 7.2.1. Sử dụng chương trình Chương trình WAVE có thể được đóng gói để chạy như một ứng dụng riêng biệt, tuy nhiên, vì trong chương trình chúng ta sử dụng các thư viện của WAVE để chạy nên chúng ta sẽ gộp chung chương trình hiển thị và WAVE vào chung một project của Netbeans cho thuận tiện hơn khi chạy. Để chạy chương trình mô phỏng các bài toán ở dạng 2D, chúng ta cần phải chạy chương trình là lớp Sim trong gói (package) sim của project WAVE. Khi mới được chạy, chương trình sẽ xuất hiện cửa sổ chưa có nội dung. Hình 7-1. Chương trình hiển thị khi mới được chạy Sau khi chương trình hiển thị đã chạy, chúng ta chạy cả project WAVE (RUN project) để chạy chương trình WAVE. Lúc này, chương trình WAVE cũng xuất hiện một cửa sổ. 114 Hình 7-2. Chương trình WAVE khi bắt đầu chạy Sau đó, để thực hiện mô phỏng cho một bài toán cụ thể, chúng ta chọn nút Browse… của cửa sổ chương trình WAVE sau đó chọn các tệp tin tương ứng trong thư mục Simulation để chạy tiếp chương trình. 115 7.2.2. Tạo lưới thực địa Chúng ta muốn tạo lưới và hiển thị trên chương trình hiển thị, cần lựa chọn tệp tin tạo lưới trong thư mục Simulation. Tùy thuộc vào nội dung mà chúng ta tạo lưới sẽ được tạo khác nhau. Giả sử, ở đây, chúng ta tạo ra một lưới 5x5, chương trình hiển thị sẽ hiển thị lưới ra màn hình: Hình 7-3. Lưới 5x5 Chương trình WAVE cũng đưa ra thông báo, chúng ta có thể xem được tại cửa sổ Output của Netbeans: Hình 7-4. Cửa sổ output của Netbeans 116 7.2.3. Di chuyển tự do Bài toán di chuyển tự do của một vật từ tọa độ (1-1) đến (5-5) được mô phỏng trong chương trình có kết quả chạy như sau: Hình 7-5. Vị trí đầu tiên 1-1 Hình 7-6. Chạy ngẫu nhiên tới vị trí tiếp theo 117 Hình 7-7. Các bước chạy ngẫu nhiên tiếp theo 118 Hình 7-9. Dừng khi chạy tới đích 7.2.4. Di chuyển tránh chướng ngại vật Đối tượng di chuyển từ nút (1-1) đến (5-5) mà không đi qua chướng ngại vật Hình 7-8. Tiếp tục chạy ngẫu nhiên 119 Hình 7-10. Di chuyển qua chướng ngại vật 120 7.2.5. Di chuyển vòng quanh chướng ngại vật Hình 7-11. Vượt qua chướng ngại vật và về đến đích 121 Đối tượng đi vòng quanh chướng ngại vật mà không đi đến các điểm nằm cách xa chướng ngại vật hoặc đi xuyên qua chướng ngại vật: 122 Hình 7-12. Di chuyển vòng quanh chướng ngại vật 123 Hình 7-13. Vòng quanh chướng ngại vật 1 vòng thì dừng 124 7.2.6. Di chuyển cùng nhau kiểu tịnh tiến Hai đối tượng sẽ cùng nhau di chuyển đến đích: 7.2.7. Hiển thị hình ảnh 3D động bằng GnuPlot Bằng cách sử dụng GnuPlot, chúng ta có thể hiển thị các hình ảnh 3D động trên nhiều máy, mỗi máy hiển thị một phần hình ảnh động. Hình 7-14. Di chuyển tịnh tiến cùng nhau 125 Hình ảnh hiển thị 3D trên máy thứ nhất với tọa độ x trong khoảng từ 1 đến 5: Hình 7-15. Hình ảnh 3D trên máy thứ nhất sử dụng GnuPlot Máy thứ hai hiển thị phần hình ảnh 3D tiếp theo với x nằm trong khoảng từ 6 đến 10: Hình 7-16. Hình ảnh 3D trên máy thứ hai sử dụng GnuPlot 126 7.2.8. Hiển thị hình ảnh 3D của tệp tin VRML Từ KN của WAVE, WAVE sẽ tạo ra một tệp tin VRML và chương trình sẽ hiển thị tệp tin VRML này dưới dạng 3D: Hình 7-17. Tệp tin VRML được hiển thị sau khi được tạo bởi KN 7.2.9. Hiển thị hình ảnh 3D với các góc nhìn khác nhau Các vật thể được mô tả trong tệp tin VRML được mô tả giống như các vật thể trong tệp tin VRML được hiển thị trong Hình 7-17, sau khi thay đổi Transform, nó lại được hiển thị theo một cách khác: 127 Hình 7-18. Các đối tượng hiển thị theo cách khác thi thay đổi Transform Hình 7-19. Một cách nhìn khác thi thay đổi Transform 128 7.2.10. Hiển thị hình ảnh 3D VRML trên nhiều máy Các đối tượng khác nhau được đặt trên các máy khác nhau, mỗi một đối tượng được hiển thị trên một máy. Từ một tệp tin VRML được hiển thị như Hình 7-17 bây giờ mỗi máy sẽ nhận nhiệm vụ đưa ra từng đối tượng: Trên máy thứ nhất hiển thị đối tượng đầu tiên là hình cầu to: Hình 7-20. Hiển thị đối tượng đầu tiên trên máy 1 Máy 2 hiển thị hình cầu nhỏ: 129 Hình 7-21. Hiển thị đối tượng thứ hai trên máy 2 130 CHƯƠNG 8. PHỤ LỤC A – WAVE CODE 8.1. Tạo lưới đơn hướng Fdimension_x=5.Fdimension_y=5.Fsign=`-'. CR( REPEAT( Fcur_y+1.Fcur_y<=Fdimension_y.Fcur_x=1. Fnode=Fcur_x.Fnode&Fcur_y.Fnode%Fsign.@#Fnode. REPEAT( (Fcur_y/=1.Frt=Frow:1.-y#Frt.FALSE!), (Frow&CONTENT. OS( (Fcur_y/=1.Frow:1=NONE.FALSE!), (Fcur_x<Fdimension_x. Fcur_x+1.Fnode2=Fcur_x. Fnode2&Fcur_y.Fnode2%Fsign. +x#Fnode2 ) ) ) ) ) ) Tạo lưới trên nhiều máy Fcomputer=`10.0.0.5’;`10.0.0.6’;`10.0.0.7’;`10.0.0.8’. Fdimension_x=10.Fdimension_y=5.Fsign=`-'. 131 CR( REPEAT( Fcur_y+1.Fcur_y<=Fdimension_y. MAP=Fcomputers:Fcur_y. Fcur_x=1. Fnode=Fcur_x.Fnode&Fcur_y.Fnode%Fsign.@#Fnode. REPEAT( (Fcur_y/=1.Frt=Frow:1.-y#Frt.FALSE!), (Frow&CONTENT. OS( (Fcur_y/=1.Frow:1=NONE.FALSE!), (Fcur_x<Fdimension_x.Fcur_x+1. Fnode2=Fcur_x.Fnode2&Fcur_y. Fnode2%Fsign.+x#Fnode2) ) ) ) ) ) 132 8.2. Tạo lưới theo đa hướng Frow={ Fnode=Fcur_x.Fnode&Fcur_y.Fnode%Fsign.@#Fnode. REPEAT( (Fcur_y/=Fstart_y.Ftemp=Frow_address:1. Flink_to_previous_row#Ftemp.FALSE! ), (Frow_address&CONTENT. OS( (Fcur_y/=Fstart_y.Frow_address:1=NONE.FALSE!), ( Fcur_x<Fdimension_x.Fcur_x+1. Fnode2=Fcur_x.Fnode2&Fcur_y.Fnode2%Fsign. +x#Fnode2 ) ) ) ) }. Fdimension_x=5.Fstart_y=3. CR( 133 MAP=`10.0.0.12'.Fcurrent_y=Fstart_y.^Frow. (Fchange_y=1.Fstop_y=6.Flink_to_previous_row=-y), (Fchange_y=-1.Fstop_y=0. Flink_to_previous_row=+y.MAP=`10.0.0.13'). RP(Fcurrent_y+Fchange_y.Fcurrent_y/=Fstop_y.^Frow ) ) 8.3. Di chuyển tự do Fname=`a'.Fst=`1-5'.Finish_x=5.Finish_y=1. Fdecom={Ft=C.Fdel=`-'.Ft|Fdel.Fx=Ft:1.Fy=Ft:2}. @#Fst.Node_mark=2. Fa=1;1. Ft=`CREATENODE'.Ft&C.Ft&Node_mark.Fa:3=Ft. Fa?program1. RP( Frout&C.^Fdecom. OS ( (C==Fst.TRUE!), (Fcount+1.Fsource=Frout:Fcount. Fcount+1.Fdes=Frout:Fcount.Fcount-1. 134 Ft=`Movefromto'.Ft&Fsource.Ft&`2'. Ft&Fdes.Fa:3=Ft.Fa?program1.) ). OS( (Fx==Finish_x.Fy==Finish_y. Ftemp=`route of'.Ftemp&Fname.Ftemp&`:'.Ftemp&Frout. Fspace=` '.Ftemp%Fspace.ABORT!), RANDOM( ((FyFinish_y.-y#)), ((FxFinish_x.-x#)) ), STAY ) ) 8.4. Di chuyển tránh chướng ngại vật SQ( (@#`2-4',@#`3-4',@#`2-3',@#`3-3'.Node_mark=4. Fa=1;1. Ft=`CREATEOBST'.Ft&C.Fa:3=Ft.Fa?program1), ( Fname=a.Fstart=`1-5'.Finish_x=5.Finish_y=1. Fdecom={Ft=C.Fdel=`-'.Ft|Fdel.Fx=Ft:1.Fy=Ft:2}. @#Fstart.Node_mark=2. Fa=1;1. 135 Ft=`CREATENODE'.Ft&C. Ft&Node_mark.Fa:3=Ft.Fa?program1. RP( Frout&C.^Fdecom. OS ( (C==Fstart.TRUE!), ( Fcount+1.Fsource=Frout:Fcount. Fcount+1.Fdes=Frout:Fcount.Fcount-1. Ft=`Movefromto'. Ft&Fsource.Ft&`2'.Ft&Fdes.Fa:3=Ft. Fa?program1. ) ). OS( (Fx==Finish_x.Fy==Finish_y. Ft=`route of'.Ft&Fname.Ft&`:'. Ft&Frout.Fdel=` '.Ft%Fdel.T=Ft.ABORT! ), RANDOM( ( (Fx<Finish_x.+x#), (Fx>Finish_x.-x#) ), ( (Fy<Finish_y.+y#), (Fy>Finish_y.-y#) 136 ).Node_mark==NONE. ), STAY ) ) ) ) 8.5. Di chuyển vòng quanh chướng ngại vật SQ( (@#`3-3',@#`3-4',@#`4-4'.Node_mark=1. Fa=1;1. Ft=`CREATEOBST'.Ft&C.Fa:3=Ft.Fa?program1), (Fstart=`3-5'.@#Fstart.Fa=1;1. Ft=`CREATENODE'.Ft&C.Ft&`2'.Fa:3=Ft.Fa?program1. RP( Frout&C. OS( (C==Fstart.TRUE!), ( Fcount+1.Fsource=Frout:Fcount. 137 Fcount+1.Fdes=Frout:Fcount.Fcount-1. Ft=`Movefromto'.Ft&Fsource. Ft&`2'.Ft&Fdes.Fa:3=Ft.Fa?program1. ) ). OS( OP( ##.Node_mark==NONE. AS( (##.Node_mark/=NONE.TRUE!), STAY ) ), OP( ##.Node_mark==NONE. AS( (##.##.Node_mark/=NONE.TRUE!), STAY ) ) ) 138 ) ) ) 8.6. Nhìn trong không gian với độ sâu cho trước SQ( ( (@#`2-5'.Nobj=a), (@#`2-3'.Nobj=b), (@#`5-4'.Nobj=c), (@#`2-1'.Nobj=w), (@#`4-2'.Nobj=v) ), ( Fob=`3-4'.Fdep_limit=2. @#Fob.Freturn=C. SQ( RP( Node_mark==NONE.Node_mark=1. (Nobj/=NONE.Ftemp=Nobj.Ftemp&C.Fjoin=`:'. 139 Ftemp%Fjoin.Ftransit=Ftemp. @#Freturn.Nwhat_you_see&Ftransit.DONE! ), (Fdep+1.Fdep<=Fdep_limit.##) ), (Ftemp=`object seen in'.Ftemp&C. Ftemp&Nwhat_you_see.Fjoin=` '.Ftemp%Fjoin. T=Ftemp) ) ) ) 8.7. Di chuyển cùng nhau kiểu tịnh tiến 8.7.1. Chuỗi wave chạy theo Fode_mark=1. Follower=b.Follower_start=`1-3'. @#Follower_start. Fa=1;1. Ft=`CREATENODE'.Ft&C.Ft&Fode_mark.Fa:3=Ft. Fa?program1. 140 RP( Frout&C. OS ( (C==Follower_start.TRUE!), (Fcount+1.Fsource=Frout:Fcount. Fcount+1.Fdes=Frout:Fcount.Fcount-1. Ft=`Movefromto'.Ft&Fsource. Ft&Fode_mark.Ft&Fdes.Fa:3=Ft.Fa?program1. ) ). Nobj=Follower. RP(Next_hop==NONE).Fnext=Next_hop. Next_hop=NONE.Nobj=NONE.#Fnext ) 8.7.2. Chuỗi wave dẫn đầu Flead=a.Follower=b.Fode_mark=3. Flead_start=`2-3'.Follower_start=`1-3'. @#Follower_start.#Flead_start. Fa=1;1. Ft&`CREATENODE'.Ft&C. 141 Ft&Fode_mark.Fa:3=Ft.Fa?program1. RP( Frout&C. OS ( (C==Flead_start.TRUE!), (Fcount+1.Fsource=Frout:Fcount. Fcount+1.Fdes=Frout:Fcount.Fcount-1. Ft=`Movefromto'.Ft&Fsource. Ft&Fode_mark.Ft&Fdes.Fa:3=Ft.Fa?program1. ) ). SQ( (#P.RP(Nobj/=Follower).DONE!), (3?`sleep'.+x#), (#P.Next_hop=P.DONE!) ) ) 142 CHƯƠNG 9. PHỤ LỤC B – TÀI LIỆU THAM KHẢO TÀI LIỆU TIẾNG ANH [1] Bell, G., A. Parisi, and M. Pesce, The Virtual Reality Modelling Language: Version 1.0 Specification, November 9, 1995. [2] Bruno, J., and S. M. Altman, “A Theory of Asychronous Control Networks,” IEEE Trans. Comput., Vol. C-20, No. 6, June 1971. [3] Sapaty, P. S,. “Active Information Field as a Model for the Structural Solution of Task on Graphs and Networds,” Proc. USSR Academy of Sciences: Technical Cybernetics, No. 5, 1984 (in Russian). [4] Varbanov, S., and P. S. Sapaty, “An Information System Based on the Wave Navigation Techniques,” Abstr. International Conference, AIMSA’86, Varna, Bulgaria, 1986. [5] Sapaty, P.S., “The Wave-0 Language as a Framework of Navigational Structures for Knowledge Bases Using Semantic Networks,” Proc. USSR Academy of Sciences: Technical Cybernetics, No. 5, 1986 (in Russian). [6] Borst, P., The First Implementation of the WAVE System for UNIX and TCP/IP Computer Networks, TR 18/92, Faculty of Informatics, University of Karlsrule. Karlsruhe, Germany, December 1992. [7] Borst, P.M., H.-T Goetz, P. S. Sapaty, and W. Xorn, “Paralled Knowledge Processing in Open Networks,” Proc. International Conference and Exhibition “Hight- Perfor-mance Computing in Networks” (HPCN Europe ‘94), Munich, Germany, April 1994. [8] Corbin M. J., and P. S. Sapaty, “Distributed Object-Based Simulation in Wave,” J. Simul. Pract. Theory, Vol. 3, No.3, pp. 157-181, 1995. [9] Merchant F., L. F. Bic, P. M. Borst, M. J. Corbin, M. Dillencourt, M. Fukuda, and P. S. Sapaty, “Simulating Autonomous Objects in a S patial Database Using WAVE,” Proc. 9th European Simulation Multiconference, Prague, Czechoslovakia, June 1995. 143 [10] Livatharas, C., “Integration of Heterogeneous Databases Using WAVE,” M.Sc. Project Report, Department of Electrical Engineering, University of Surrey. Surrey, England, August 1995. [11] Vuong, S., and I. Ivanov, “Mobile Intelligent Agent Systems: WAVE vs. JAVA,” Proc, etaCOM’96, Portland, Oreg., May 1996. [12] Vuong, S., and L. Mathy, “Simulating the Mobile-IP Protocol Using Wave,” Proc, etaCOM’96, Porland, Oreg., May 1996. [13] Darling, J. C. C., P.S Sapaty, and M. J. Underhill, “Distributed Virtual Reality: A Fully Dynamic Approach,” Proc. 15th Workshop on Standards for the Interoperability of Distributed Simulations, Institute for Simulation and Training, University of Central Florida, Orlando, Fla., September 1995. [14] Tan, H. K. V,. “Distributed Dynamic 3D Virtual Reality,” M.Sc Telematics Diploma Project (base on WAVE), Department of Electrical Engineering, University of Surrey, Surrey, England, 1997. [15] Peter Sapaty, “Mobile Processing in distributed and open environments”, 1998 WEBSITE THAM KHẢO [16] [17] [18] [19] [20] [21]

Các file đính kèm theo tài liệu này:

  • pdfLUẬN VĂN-XÂY DỰNG HỆ THỐNG MÔ PHỎNG VÀ THỰC TẠI ẢO SỬ DỤNG NGÔN NGỮ WAVE.pdf
Luận văn liên quan