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,
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).