Tính độ dốc của bề mặt TIN

Một phần của tài liệu XÂY DỰNG THƯ VIỆN PHẦN MỀM HỖ TRỢ HỆ THỐNG THÔNG TIN ĐNA LÝ GIS 3D DỰA TRÊN CƠ SỞ DỮ LIỆU HƯỚNG ĐỐI TƯỢNG BẰNG NGÔN NGỮ C++ (Trang 57)

Độ dốc của một mặt tam giác là góc tạo bởi tam giác đó và mặt phẳng ngang. Góc của

tam giác và mặt phẳng ngang chính là góc giữa pháp vector của tam giác và vector n(0, 0, 1).

Độ dốc của một vùng là độ dốc trung bình của các tam giác trong vùng đó. Chọn các

tam giác nằm trong vùng giới hạn này. Tính độ dốc cho từng tam giác. Tính trung bình cộng của chúng.

Bài tốn tính độ dốc chỉ có ý nghĩa khi bề mặt địa hình được tạo bởi các tam giác có cùng tính chất: pháp vector cùng hướng về một phía, khơng có sự gãy khúc đột biến.

II.5. Xác định độ cao của một điểm khi biết tọa độ x và y của điểm đó.

Khi đã biết được vị trí 2D của một điểm M trên TIN, chúng ta cần xác định điểm M ở

độ cao bao nhiêu. Đồng thời xác định điểm đó thuộc tam giác nào của TIN.

Do chúng ta không biết trước được tam giác nào chứa điểm 2D này, cho nên chúng ta sẽ chọn các tam giác trong vùng region có tâm là điểm 2D này.

Giải pháp 1:

Tương ứng với mỗi tam giác Δi tìm được, chiếu tam giác lên mặt phẳng Oxy, kiểm tra M có nằm trong (inside) tam giác này không?

Gọi ni(xn, yn, zn) là pháp vector của mặt phẳng chứa tam giác Δi. Nếu ni vng góc

với vector (0, 0, 1), nghĩa là tam giác Δi vng góc với mặt phẳng Oxy, thì hình chiếu của tam giác Δi suy biến thành đoạn thẳng. Lúc này, M nằm trên đoạn thẳng này thì khơng thể xác định chiều cao của M được.

Nếu M nằm trong tam giác thì thay xM, yM vào phương trình mặt phẳng chứa tam giác

để xác định tọa độ zM.

Giải pháp 2:

Gọi M1(xM, yM, zmax) là hình chiếu của M lên mặt phẳng z = zmax. Gọi M2(xM, yM, zmin) là hình chiếu của M lên mặt phẳng z = zmin.

Nhận xét rằng M1M2 là đoạn thẳng vng góc với mặt phẳng Oxy.

Tương ứng với mỗi tam giác Δi tìm được, ta gọi thủ tục đoạn thẳng M1M2 cắt mặt

phẳng πi của tam giác Δi. Ta có được giao điểm N trả về, xét N có nằm trong tam giác Δi hay khơng? Nếu có thì N trùng với M, nghĩa là zN chính là kết quả cần tìm.

Trong bản luận văn này chọn giải pháp thứ hai để hiện thực, bởi vì khơng thể tạo một tam giác hình chiếu lên mặt phẳng Oxy để gọi thủ tục xét 1 điểm nằm trong tam giác

được. Việc tạo mới một tam giác dễ dẫn đến mất tính nhất quán trên cơ sở dữ liệu.

II.6. Xác định M(xM, yM, zM) có thuộc bề mặt TIN hay khơng?

Khi chúng ta thao tác trực quan trên TIN, ví dụ như tạo một điểm M mới, chúng ta cần biết điểm M có thuộc bề mặt TIN hay khơng? Từ đó có biện pháp hiệu chỉnh tọa độ M một cách hợp lý.

Chúng ta có thể áp dụng giải thuật của bài toán xác định độ cao của một điểm để giải quyết bài toán này. Tuy nhiên, do biết trước cả ba thành phần toạ độ của M nên bài

toán này đơn giản hơn.

Chúng ta chỉ chọn những tam giác Δi trong vùng region có tâm là điểm M. Sau đó thay tọa độ M vào phương trình mặt phẳng πi của tam giác Δi. Nếu M thỏa phương trình

mặt phẳng πi thì xét xem M có nằm trong (inside) tam giác Δi hay không?

II.7. Từ một điểm C(xC, yC, zC) cho trước, hãy xác định phần bề mặt của TIN xung quanh điểm C trong vịng bán kính R>0 theo phương ngang.

Phương trình hình trụ trịn bán kính R có trục đi qua điểm C là:

( ) (2 )2 2 R y y x xC + − C = (adsbygoogle = window.adsbygoogle || []).push({});

Những điểm trên TIN thỏa mãn bài toán là những điểm nằm bên trong hình trụ trịn này. Đó là những đỉnh có toạ độ x và y thỏa bất phương trình:

( )2 2 2 ) (y y R x xC + − CII.8. Ma trận độ cao.

II.8.1. Phân tích yêu cầu:

Ma trận độ cao là một phương thức khác để biểu diễn địa hình 3 chiều. Ý tưởng chính của ma trận độ cao là một ma trận mà giá trị tại mỗi phần tử biểu diễn độ cao trung bình trong một đơn vị diện tích cho trước.

Luận văn tốt nghiệp GVHH: Nguyễn Hữu Hải.

Do đó để chuyển Tin sang ma trận độ cao, ta cần kích thước của ơ ma trận (dài *

rộng). Kích thước của ma trận được xác định bằng hình chữ nhật nhỏ nhất bao lấy

TIN. Từ hình chữ nhật này chúng ta chia đều cho kích thước mỗi ơ của ma trận. Sau

đó xác định số hàng và số cột cho ma trận.

II.8.2. Giải thuật:

Vào: Xsize, Ysize – độ rộng một ô của ma trận độ cao. HeightMatrix – con trỏ đến

buffer chứa ma trận độ cao.

Xuất: Cols, Rows – kích thước của ma trận độ cao. HeightMatrix – được điền dữ liệu. Trả về: Kích thước cần có của HeightMatix (tính theo bytes).

Hình 3-12. Tinh tốn độ cao cho ma trận độ cao

Tính kích thước của ma trận độ cao :

Cols = width/Xsize + 1; Rows = len/Ysize + 1. (width, len : kích thước của Tin).

Nếu HeightMatrix = NULL thì return (cols*rows *sizeof(real));

Xin cấp phát bộ nhớ cho HeightMatrix: HeightMatrix = new float[Rows*Cols].

Đối với mỗi tam giác T thuộc Tin làm các bước sau :

Xác định hình chữ nhật nhỏ nhất H chứa T và qua các node của lưới (rMin, rMax,

cMin, cMax).

Đối với mỗi HeightMatrix[i][j] thuộc H, tính độ cao h. Nếu (HeightMatrix[i][j] < h)

hoặc ( HeightMatrix[i][j]=0) thì gán HeightMatrix[i][j] = h.

II.8.3. Phục hồi TIN từ ma trận độ cao.

Hình 3-13. Phục hồi TIN từ ma trận độ cao

Ma trận độ cao có Rows hàng và Cols cột. Ứng với mỗi node[i][j] trên hàng thứ i

chúng ta sẽ nối nó với node[i][j+1] và node[i+1][j+1] tạo thành một tam giác, đồng thời nối nó với node[i+1][j] và node[i+1][j+1] tạo thành tam giác thứ hai. Trong đó:

] 2 , 0 [ ] 2 , 0 [ − ∈ − ∈ Cols j Rows i

Ví dụ: Rows = 5 và Cols = 6 như hình trên thì i chạy từ 0 đến 3 và j chạy từ 0 đến 4.

II.9. Tính khả kiến từ A đến B. (adsbygoogle = window.adsbygoogle || []).push({});

II.9.1. Phân tích giải thuật:

Để khảo xác tính khả kiến của hai điểm A và B trên lưới địa hình theo một đường cho

trước. Giải pháp chung nhất là kiểm tra xem đường nối giữa A và B với các tam giác trong Tin. Tương tự như phép toán giao Tin với mặt phẳng, ta chỉ xét các tam giác lân cận đường nối A và B để tăng tính hiệu quả của thuật toán. Nghĩa là chỉ duyệt các tam giác trong một hình hộp, đNy hình hộp này theo đoạn thẳng AB cho đến khi hết đoạn thẳng AB. Như vậy, chúng ta không cần duyệt hết mọi tam giác trên TIN.

Ta khảo xát tính khả kiến từ A đến B theo đường thẳng như hình vẽ sau :

Hình 3-14. A nhìn thấy B theo đường thẳng.

II.9.2. Giải thuật A nhìn B theo đường thẳng:

Input: A(x,y,z), B(x,y,z) là hai điểm trong không gian 3D.

Return: true - nếu A nhìn thấy B theo đường thẳng. false – khơng nhìn thấy. Giải thuật:

Gán điểm hiện hành C = A.

Chọn các tam giác trong hình hộp tâm A, cạnh D = Min(2*MaxEdgeLen, CB).

Đối với mỗi tam giác T chọn được, tìm giao điểm AB với T. Nếu có giao điểm thì

return False.

Nếu cạnh D = CB thì return True.

Tính delta = 2*(R/cos(alpha)), với alpha là góc AB với mặt phẳng ngang. Gán C += delta*n. Với n là vector đơn vị của vector AB. Quay lại (2).

Giải thuật khả kiến từ A đến B dùng cây chỉ mục:

Với sự hỗ trợ của cây chỉ mục chúng ta sẽ truy vấn những tam giác thông qua khối hộp MBR nhỏ nhất chứa tam giác đó. Nếu khoảng cách từ tâm của khối hộp MBR đến

Luận văn tốt nghiệp GVHH: Nguyễn Hữu Hải.

đoạn thẳng AB nhỏ hơn ½ chiều dài cạnh khối hộp thì chọn khối hộp MBR đó, cũng là

chọn tam giác bên trong khối hộp MBR.

Hình 3-15. Minimum Bounding Region.

Khoảng cách từ một điểm đến đoạn thẳng AB được định nghĩa như sau:

Nếu M nằm bên trong đoạn thẳng AB thì kết quả là chiều dài đoạn vng góc hạ từ M

xuống đoạn thẳng AB.

Nếu M nằm ngoài đoạn thẳng AB thì kết quả là khoảng cách ngắn nhất giữa MA và

MB.

Hình 3-16. Khoảng cách từ điểm đến đoạn.

II.9.3. Giải thuật A nhìn B theo đường bất kỳ:

Để kiểm tra A nhìn B theo một đường C bất kỳ có các phương trình tham số cho trước.

Ta cũng thiết lập một hình hộp tương tự như giải thuật trên và rời rạc đường cong C thành các đoạn nhỏ. Sau đó kiểm tra giao điểm của các đoạn này với các tam giác trong hình hộp. Tâm điểm tiếp theo của hình hộp sẽ được tính theo giao điểm của C với hình hộp (dựa theo tham số t của phương trình đường).

Hình 3-17. Tính khả kiến theo theo nhiều đoạn thẳng. (adsbygoogle = window.adsbygoogle || []).push({});

II.10. Khoảng cách giữa hai điểm trên Tin.

II.10.1. Phân tích yêu cầu:

Khoảng cách giữa hai điểm A, B trên Tin không đơn thuần là độ dài đoạn AB mà là khoảng cách trượt trên bề mặt lưới tam giác. Nghĩa là cho 2 vị trí A và B trên bề mặt

địa hình, chúng ta cần xác định quảng đường đi từ A đến B. Xem hình 7 sau:

Hình 3-18. Khoảng cách giữa A, B trên Tin.

Khoảng cách giữa hai điểm bất kỳ trên TIN được tính bằng tổng khoảng cách giữa các

đoạn giao tuyến giữa mặt phẳng P, qua hai điểm A, B và có vector chỉ phương n, với

các tam giác của TIN nằm trong khoảng AB.

II.10.2. Giải thuật:

Input : hai điểm cần xác định khoảng cách A và B, vector chỉ phương n. Return : khoảng cách giữa hai điểm A và B

Giải thuật :

Luận văn tốt nghiệp GVHH: Nguyễn Hữu Hải.

Dùng mặt phẳng P cắt TIN, ta thu được tập các đoạn giao tuyến giữa mặt phẳng và các tam giác, lưu vào Seglist.

Xét trên từng đoạn giao tuyến trong Seglist, ta tìm các đoạn chứa các điểm A và B.

Đối với đoạn chứa A, ta lưu chỉ số của nó trong Seglist vào biến start và xét góc α1

hợp bởi vector v1, tạo bởi A và điểm thứ nhất của đoạn, với vector AB và góc α2 hợp bởi vector v2, tạo bới A và điểm thứ hai.

if α1 < α2 then ta gán A vào điểm thứ hai của đoạn

else ta gán A vào điểm thứ nhất của đoạn.

Tương tự, đối với đoạn chứa B ta cũng xét hai góc β1 hợp bởi vector v1, tạo bởi B và điểm thứ nhất của đoạn, với vector AB và góc β2 hợp bởi vector v2, tạo bới B và điểm còn lại.

if β1 > β2 then ta gán B vào điểm thứ hai của đoạn else ta gán B vào điểm thứ nhất của đoạn.

if một trong hai điểm A và B hoặc cả hai điểm A và B không thuộc bất kỳ

đoạn giao tuyến nào trong Seglist, then ta tìm giao điểm M giữa AB và một đoạn bất kỳ trong Seglist, và M ≠ A, M ≠ B then khoảng cách AB =

Simple_Surf_Distance(A,M,n) + Simple_Surf_Distance(M,B,n). If khơng tìm ợc giao điểm M then khoảng cách AB là độ dài vector AB.

đư

If cả hai điểm A và B đều thuộc một đoạn nào đó trong tập Seglist. Đoạn

có một đầu là A có chỉ số là start, ta gán đầu còn lại vào biến current và loại bỏ đoạn có chỉ số start ra khỏi Seglist. Ta tìm đoạn có chứa current trong Seglist và lưu đầu cịn lại của nó vào next[2].

If khơng có đoạn nào chứa current then

AB = vector(A,current).length().

If có một đoạn chứa current then

AB = vector(A,curren).length() + vector(current, (adsbygoogle = window.adsbygoogle || []).push({});

next[0]).length()

If có hai đoạn chứa current then + Simple_Surf_Distance(next[0],B,n).

dự

If v1.AngleWith(AB) < v2.AngleWith(AB) then ng 2 vector v1(current,next[0]) và v2(current, next[1]).

AB = vector(A,current).length() + v1.length() +

e_Surf_Distance(next[0],B,n). Simpl

else AB = vector(A,current).length() + v2.length() + Simple_Surf_Distance

(next[1],B,n).

II.11. Truy xuất dữ liệu TIN từ file

Ngoài cách nhập dữ liệu cho TIN bằng form nhập liệu và bằng thao tác trực quan trên TIN, chúng ta cịn có thể nhập dữ liệu cho TIN từ một file. Từ một file dữ liệu có sẵn, chúng ta chỉ cần import nó vào dữ liệu của TIN. Cách nhập liệu từ file giúp chúng ta linh động hơn trong khâu nhập liệu. Ngoài ra việc dùng file giúp chúng ta dễ dàng di chuyển (portable) dữ liệu, xuất dữ liệu báo cáo.

Để có thể nhập liệu bằng file thì chúng ta cần quy định một kiểu định dạng file để đảm

bảo việc nhập liệu chính xác. Bản luận văn này sử dụng kiểu file ký tự (text file) có

định dạng như sau:

File định dạng có phần mở rộng là T3D. Ví dụ file có tên là: tinDemo.T3D

Header của file bao gồm các thông tin như: kiểu file, phiên bản của file, thơng tin chú thích.

Sau header của file là header của TIN bao gồm các thông tin: tên của TIN, số lượng

đỉnh và số lượng các tam giác có trong TIN.

Tiếp theo là phần mô tả quan hệ giữa các đối tượng dữ liệu (đỉnh, tam giác). Trong phần thân này, đầu tiên là danh sách các đỉnh. Mỗi đỉnh có tên (biểu diễn theo định dạng: @index), tiếp theo là tọa độ không gian, màu sắc. Sau danh sách đỉnh là danh sách các tam giác của TIN. Mỗi tam giác gồm có 3 đỉnh <point1, point2 và point3> kiểu tô, kiểu đường.

Luận văn tốt nghiệp GVHH: Nguyễn Hữu Hải.

CHƯƠNG 4 : VẼ LƯỚI TAM GIÁC & TƯƠNG TÁC VỚI NGƯỜI DÙNG - TẦNG PRESENTATION.

I. CÔNG CỤ VẼ.

Hiển thị lưới tam giác lên màn hình là một vấn đề rất quan trọng. Một trong ưu điểm của GIS 3D là mơ hình hóa các đối tượng gần với thế giới thực hơn. Do đó cần phải thể hiện các mơ hình này một các trực quan dưới dạng 3D. Hiện tại, trên môi trường Windows có hai cơng cụ thể hiện hình họa 3D phỗ biến là OpenGL và Direct3D. Direct3D là một trong những giao tiếp lập trình đồ họa 3D mạnh nhất hiện nay. Là một phần trong DirectX của Mircrosoft. Direct3D được tích hợp vào bên trong Windows cung cấp cho lập trình viên một giao tiếp lập trình dưới dạng các giao tiếp (interface) COM. Do đó, để sử dụng được Direct3D địi hỏi phải có kiến thức tương

đối về COM. Mặc khác, cấu trúc lập trình của Direct3D cũng tương đối phức tạp,

không phù hợp cho những người chưa có kinh nghiệm về lập trình đồ họa 3D.

Tương tự Direct3D, OpenGL cũng được tích hợp sẵn trong hệ điều hành Windows. OpenGL có tiền thân là GL do Silicon Graphics Incorporated (SGI) phát triển dành riêng cho các trạm làm việc của họ. Về sau, nó đã phát triển lên thành một chuNn công nghiệp được hỗ trợ bởi tất các các nhà sản xuất phần cứng cũng như được hỗ trợ bởi tất cả các hệ điều hành hiện tại.

OpenGL được xây dựng bởi tập các hàm thư viện. Các hàm này cung cấp cho người

dùng một giao diện lập trình mạnh mẽ nhưng lại rất đơn giản, trong sáng và dễ dàng, phù hợp cho hầu hết mọi trình độ.

Do thời gian hạn chế, nên trong đề tài này, chúng tôi đã chọn OpenGL là công cụ để hiện thị lưới tam giác lên màn hình, đồng thời cung cấp một số chức năng tương tác với người dùng cuối.

II. VẼ LƯỚI TAM GIÁC.

II.1. Các hệ tọa độ trong lập trình đồ họa. (adsbygoogle = window.adsbygoogle || []).push({});

Lập trình đồ họa 3D xây dựng hình ảnh các đối tượng 3D, các đối tượng này được mô tả từ các đối tượng cơ bản của hình học: đỉnh, cạnh và đa giác. Các đối tượng này

được xác định bởi các tọa độ của chúng trong hệ tọa độ ba chiều.

Có hai hệ tọa phỗ biến được dùng trong đồ họa: hệ tọa độ bàn tay trái và hệ tọa độ bàn tay phải. Sự khác biệt giữa hai hệ tọa độ này là hướng của trục z như hình vẽ.

Hình 4-1. Hệ tọa độ bàn tay trái và bàn tay phải.

Đối với hệ tọa độ bàn tay trái, đối tượng có tọa độ z càng lớn thì càng xa vị trị của

Một phần của tài liệu XÂY DỰNG THƯ VIỆN PHẦN MỀM HỖ TRỢ HỆ THỐNG THÔNG TIN ĐNA LÝ GIS 3D DỰA TRÊN CƠ SỞ DỮ LIỆU HƯỚNG ĐỐI TƯỢNG BẰNG NGÔN NGỮ C++ (Trang 57)