Giao TIN với một mặt phẳng cho trước

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 49 - 52)

II.1.1. Phân tích bài tốn:

Phép tốn giao TIN với một mặt phẳng cho trước nhận đầu vào là mặt phẳng cắt α là một instance của lớp CTinPlane ở lớp thuật tốn. Do CTinPlane có thể được khởi tạo từ nhiều cách nên mặt phẳng α cũng được xác định từ các tham số khác nhau ( phương trình mặt, ba điểm khơng thẳng hàng… ).

Phương pháp tổng quát của quá trình giao Tin với mặt phẳng là lần lượt tìm các giao tuyến của của các tam giác trong Tin với mặt phẳng và trả về kết quả là danh sách các

đoạn giao tuyến rời rạc nhau. Do đó để có thể tiến hành các phép tốn khác như : diện

tích mặt cắt… ta cần phải qua thêm một bước trung gian là kết nối các đoạn này thành những polyline hoặc polygon. Kết quả của kết nối có thể trả về nhiều polygon hoặc polyline.

Do phải vét cạn các tam giác trong Tin nên q trình tính tốn giao tuyến sẽ mất rất nhiều thời gian. Điều mà chúng ta thật sự khơng mong muốn. Do đó, để cải thiện tốc

độ thuật tốn, ta có thể giới hạn các tam giác để xét lấy giao tuyến với mặt phẳng cắt

lại là các tam giác lân cận có khả năng giao với mặt phẳng cắt. Từ đó có thể tận dụng khả năng tạo chỉ mục của DBMS giảm thời gian tính tốn. Vì vậy, trong trường hợp dữ liệu khơng được tạo chỉ mục thì thời gian để chọn các tam giác này có thể lớn hơn thời gian vét cạn toàn bộ tam giác.

II.1.2. Giải thuật:

a. Giải thuật1: giới hạn các tam giác bằng cách trượt hộp.

Ta chọn các tam giác lân cận mặt phẳng cắt α theo hình sau:

Hình 3-1. Trường hợp mp α cắt khối hộp bao tin tại 4 điểm A,B,C,D.

Hình hộp chữ nhật bao ngồi là hình hộp nhỏ nhất chứa tồn bộ Tin, cịn gọi là Tin- Boundary ( xem: tinGetMBR(…) ). Ta xét trường hợp đơn giản nhất : mặt phẳng cắt gần đứng và cắt mặt trước và mặt sau của khối hộp theo 4 điểm phân biệt A, B, C, D như hình vẽ. Từ A, B chọn ra 2 điểm E, F cách A, B một đoạn là MaxEdgeLen (độ dài tối đa của một cạnh trong Tin). Từ E, F dựng các mặt phẳng song song với mặt bên cắt mặt phẳng α tại 2 điểm (I, J). Từ các giao điểm này kết hợp với E, F ta xây dựng được khối hộp như hình vẽ. Sau đó ta chọn trong Tin các tam giác có ít nhất một đỉnh thuộc khối hộp.

Sau đó ta lặp lại các bước trên với 4 điểm mới là I,J,C,D cho đến khi I≡D và J≡C.

Đối với các trường hợp khác ta dùng các phép ánh xạ tọa độ và nới rộng biên hộp để đưa về trường hợp này.

Giải thuật:

Bước 1: xây dựng bảng thông số ánh xạ của các mặt của hình hộp.

struct _MAPAXISORDER {

int newX , newY , newZ ; } MapAxisOrderTable[6][4]={ {{X_AXIS,Y_AXIS,Z_AXIS},{X_AXIS,Z_AXIS,Y_AXIS},{X_AXIS,Y_AXIS,Z_AXIS},{X_ AXIS,Z_AXIS,Y_AXIS}} ,{{Y_AXIS,X_AXIS,Z_AXIS},{Z_AXIS,X_AXIS,Y_AXIS},{Y_AXIS,X_AXIS,Z_AXIS},{Z _AXIS,X_AXIS,Y_AXIS}} ,{{X_AXIS,Y_AXIS,Z_AXIS},{X_AXIS,Z_AXIS,Y_AXIS},{X_AXIS,Y_AXIS,Z_AXIS},{X _AXIS,Z_AXIS,Y_AXIS}} ,{{Y_AXIS,X_AXIS,Z_AXIS},{Z_AXIS,X_AXIS,Y_AXIS},{Y_AXIS,X_AXIS,Z_AXIS},{Z _AXIS,X_AXIS,Y_AXIS}} ,{{Z_AXIS,Y_AXIS,X_AXIS},{Y_AXIS,Z_AXIS,X_AXIS},{Z_AXIS,Y_AXIS,X_AXIS},{Y _AXIS,Z_AXIS,X_AXIS}} ,{{Z_AXIS,Y_AXIS,X_AXIS},{Y_AXIS,Z_AXIS,X_AXIS},{Z_AXIS,Y_AXIS,X_AXIS},{Y _AXIS,Z_AXIS,X_AXIS}} }; struct _MAPAXISDIRECTION {

int dirX , dirY , dirZ ; } MapAxisDirectionTable[6][4]={ {{AD_NORMAL,AD_NORMAL,AD_NORMAL},{AD_NORMAL,AD_NORMAL,AD_REVERSE},{AD_NOR MAL,AD_REVERSE,AD_REVERSE},{AD_NORMAL,AD_REVERSE,AD_NORMAL}} ,{{AD_REVERSE,AD_NORMAL,AD_NORMAL},{AD_REVERSE,AD_NORMAL,AD_REVERSE},{AD_ NORMAL,AD_NORMAL,AD_REVERSE},{AD_NORMAL,AD_NORMAL,AD_NORMAL}} ,{{AD_REVERSE,AD_REVERSE,AD_NORMAL},{AD_REVERSE,AD_REVERSE,AD_REVERSE},{A D_REVERSE,AD_NORMAL,AD_REVERSE},{AD_REVERSE,AD_NORMAL,AD_NORMAL}} ,{{AD_NORMAL,AD_REVERSE,AD_NORMAL},{AD_NORMAL,AD_REVERSE,AD_REVERSE},{AD_ REVERSE,AD_REVERSE,AD_REVERSE},{AD_REVERSE,AD_REVERSE,AD_NORMAL}} ,{{AD_REVERSE,AD_NORMAL,AD_NORMAL},{AD_NORMAL,AD_NORMAL,AD_NORMAL},{AD_NO RMAL,AD_REVERSE,AD_NORMAL},{AD_REVERSE,AD_REVERSE,AD_NORMAL}} ,{{AD_NORMAL,AD_NORMAL,AD_REVERSE},{AD_REVERSE,AD_NORMAL,AD_REVERSE},{AD_ REVERSE,AD_REVERSE,AD_REVERSE},{AD_NORMAL,AD_REVERSE,AD_REVERSE}} } ; Để đơn giản ta chia hộp thành 6 mặt phẳng, mỗi mặt được xoay 4 lần. Do đó bảng

thông số ánh xạ của các mặt phẳng của hộp là một ma trận 6x4 như trên.

MapAxisOrderTable là bảng ánh xạ thứ tự các trục ở mỗi mặt, còn

MapAxisDirectionTable là bảng ánh xạ chiều các trục ở mỗi mặt.

Bước 2: Tìm giao điểm của 12 cạnh của hình hộp bao Tin với mặt phẳng cắt. Nếu

tổng số giao điểm này lớn hơn 4 thì : mở rộng biên của hộp bao Tin và lặp lại bước 2. Các giao điểm này được lưu trữ trong cấu trúc sau:

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

POINT3D v1,v2 // 2 dinh cua doan thang ,InterPoint ;

bool check ;

} InterPointTable[12] ;

Bước 3: Xác định mặt chính. Mặt chính là nơi xây dựng hộp chọn đầu tiên của quá

trình cắt. Mặt chính phải thoả các tiêu chuNn sau:

Mặt phẳng cắt mặt chính tại hai điểm phân biệt A, B; có 1 giao điểm nằm ở cạnh trên.

Hình 3-2. Hai trường hợp của mặt phẳng chính.

Khoảng cách giữa hai giao điểm phải nhỏ hơn bằng một giá trị biên.(R). R có giá trị bằng một nửa chiều dài cạnh trên của mặt hình hộp đang xét. Giá trị biên này chỉ áp dụng cho lần duyệt đầu tiên. Nếu lần duyệt đầu tiên khơng tìm được mặt phẳng thích

hợp thì ta sẽ chọn mặt hình hộp có khoảng cách giữa 2 điểm A,B là nhỏ nhất được lưu lại trong quá trình duyệt ở trên.

Bước 4: Xác định 2 điểm E(xE,yE,zE), F(xF,yF,zF) như sau:

Hình 3-3. Xác định E và F.

xE = xF = xA;

yE = max(yB+R, yA+R); yF = min(yB-R, yA-R); zE = zF = zA;

Sau đó ta xác định I, J như sau:

Ta dựng mặt phẳng β qua E và song song với mặt bên hộp

if mp β cắt AD tại I then if mp β cắt BC tại J then

if AI < BJ then ta tính lại J (là giao điểm của mặt phẳng qua I và song

với mặt phẳ hính với mp α)

song ng c

else if BJ < AI then ta tính lại I (là giao điểm của mặt phẳng qua J và

song với mặt phẳng chính với mp α) song

else ta tính J (là giao điểm của mặt phẳng qua I và song song với mặt

phẳng chính với mp α)

else if mp β cắt BC tại J then ta tính I (là giao điểm của mặt phẳng qua

J và song song với mặt phẳng chính với mp α)

else

Ta dựng mặt phẳng β1 qua F và song song với mặt bên hộp

if mp β1 cắt AD tại I then if mp β1 cắt BC tại J then

if AI < BJ then ta tính lại J (là giao điểm của mặt phẳng qua I và song

song với mặt phẳng chính với mp α)

else if BJ < AI then ta tính lại I (là giao điểm của mặt phẳng qua J và

song song với mặt phẳng chính với mp α)

else ta tính J (là giao điểm của mặt phẳng qua I và song song với mặt

phẳng chính với mp α)

else if mp β1 cắt BC tại J then ta tính I (là giao điểm của mặt phẳng qua

song song với mặt phẳng chính với mp α) J và

else I=D và J=C

Sau khi có được I,J ta sẽ dựng hộp nhỏ để từ đó select ra các tam giác có ít nhất một đỉnh nằm trong hình hộp nhỏ này. Ta sẽ dùng mp α cắt các tam giác đó để được tập các giao tuyến. Sau đó ta gán A=I, B=J và lặp lại giải thuật trên cho đến khi A≡D và C≡D.

b. Giải thuật thứ hai: cắt lan theo tam giác kề.

Chọn tam giác đầu tiên cắt mặt phẳng α, gọi là initTriangle. Cắt initTriangle bằng mặt phẳng α. Đánh dấu tam giác initTriangle.

Sau đó xét các tam giác lân cận với tam giác initTriangle, đó là những tam giác có chung ít nhất một đỉnh với initTriangle.

c. Giải thuật thứ ba: truy vấn tam giác trên cơ sở dữ liệu bằng cây chỉ mục

Mỗi tam giác có một hình hộp nhỏ nhất bao nó, gọi là MBR (Minimum Boundary Region). Truy vấn tất cả các tam giác có khả năng bị cắt bởi mặt phẳng α, đó là những tam giác mà tâm hộp MBR của chúng cách mặt phẳng α một khoảng d bé hơn hoặc bằng một nửa đường chéo của MBR.

Do sự hỗ trợ tích cực của cây chỉ mục nên giải thuật này thật sự mang lại hiệu quả cao.

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 49 - 52)

Tải bản đầy đủ (PDF)

(117 trang)