Chiến lược chia để trị : Ví dụ nửa mặt phăng giao nhau

Một phần của tài liệu Khóa luận tốt nghiệp Toán tin: Tìm hiểu lý thuyết về cơ sở dữ liệu quan hệ không gian (Trang 58 - 73)

CÁC THUAT TOÁN CHO DOI TƯỢNG HÌNH HỌC

5.2.2 Chiến lược chia để trị : Ví dụ nửa mặt phăng giao nhau

Nội dung của chiến lược chia dé trị như sau : Dé giải một bài toán kích thước n, ta chia bài toán đã cho thành một số bai toán con có kích thước nhỏ hơn. Giải các bài toán toán con nay roi tông hợp kết quả lại dé được lời giải của bài toán ban đầu.

Chiến lược chia để trị bao gồm hai bước :

¢ Bước | : Phan tích bai toán đã cho thành những bài toán con đủ nhỏ mà giải

quyết một cách dé đảng.

¢ Bude 2 : Tông hợp kết quả từ các bài toán con để có được lời giải của bài toán ban đầu.

Ở đây, ta minh họa chiến lược chia dé trị với bai toán trình bay sự giao nhau của một tập các nửa mặt phẳng. Dé đơn giản, ta thừa nhận kết quả la một da giác lồi và đa giác kết quả được giả sử là luôn luôn chứa trong không gian R (R lả một hình chữ nhật). Ba bước trong chiến lược được phác họa như sau :

¢ Xây dựng cấu trúc : Tập của n nửa phẳng được chia đôi đệ quy cho đến khi

Hình 34 : Minh họa thuật toán nửa phẳng giao nhau.

Thuật toán như sau :

HalfPlanelnter (S : Tập của các nửa phẳng): Da giác lôi

Begin

-57-

If( Card(S) > 2 ) then

Return HalfPlanelnter(S/2) ơ HalfPlanelnter(S - S/2)

Else

Retun S OR End

End

5.2.3 Phương thức Đường quét : Vi dụ hình chữ nhật giao nhau

Ta sẽ minh họa kỳ thuật sử dụng đường quét dựa vào một ví dụ như sau :

Cho một tập S gồm n hình chữ nhật mà các cạnh của mỗi hình tương ứng song song

với các trục tọa độ. Tim và liệt kê tất cả các cặp hình chữ nhật giao nhau. Ching

hạn tập S được cho như hình sau (gồm 7 hình chữ nhật) :

Hình 35 : Minh họa thuật toán dùng đường quét.

Kết quả của thuật toán sử dụng đường quét / cho bài toán trên là : Các cặp

hình chữ nhật giao nhau bao gồm 5 cặp là (E,C); (B,C); (B.A); (D,B) và (G,B).

Gọi £ là tập vị trí của các cạnh trái và cạnh phải của các hình chữ nhật được

sắp thứ tự theo hoanh độ x (một hình chữ nhật sẽ có một cạnh trái ứng với x„... và

một cạnh phải ứng với x„„). Và L là tập lưu trữ các hình chữ nhật được quẻt bởi

đường quét /. Khi đó thuật toán hoạt động như sau :

Rectanglelntersection ( S : Tập hợp hình chữ nhật) Begin

Sắp xếp 2n các giá tri x„„ và x„„ của S theo thứ tự trong £

L=¢ // L là tập rỗng

While(é z ý ) do Begin

p CMin (£) // Được lẫy ra lần lượt trong £

if (p là cạnh trái của một hình chữ nhật r) then

bcgin

Insert (r,L) // Thêm hình chữ nhật r vào L

Tim và ghi ra những hình chữ nhật trong L. mà giao với

hình chữ nhật r.

end

if (p là cạnh phải của hình chữ nhật r) then Delete (r,L) /í Loại bỏ r khỏi L

end // của while end.

Mô tả cách hoạt động của thuật toán trong ví dụ trên :

Sắp xếp 14 vị trí các cạnh trái và phải của 7 hình chữ nhật theo thứ tự x.

Đầu tiên L là một tập rỗng

Đường quét / đầu tiên ở vị trí cạnh trái của hình chữ nhật A và C (vì hai hình

này có cùng x,,,. ). Cạnh trai này được gan cho p.

Vi p là cạnh trái của 2 hình chữ nhật A và C nên 2 hình này được đưa vào tập L. Tới đây trong L có 2 hình chữ nhật là A và C.

Không có hình chữ nhật nào trong L giao với A và C nên ta tiếp tục vòng

lặp.

Đường quét / tiếp tục quét đến vị trí kế tiếp là cạnh trái của hình chữ nhật E.

Tới đây ta có thêm hình chữ nhật E vào L.

Trong L bây giờ có hình chữ nhật C giao với E, nên ta được một cặp hình

chữ nhật giao nhau dau tiên là (E,C).

- 59 -

© Đường quét / tiếp tục quét đến vị trí kế tiếp là cạnh trái của hình chữ nhật B.

Ta lại thêm B vào L. L bây giờ gồm A, B, C, E.

e A vàC trong L giao với B, nên ta có thêm hai cặp giao nhau nữa là (B.A) và

(B,C).

© Đường quét / tiếp tục quét dén vị trí kế tiếp là cạnh phải của hình chữ nhật

A. Như vậy A bị loại ra khỏi L. L bây giờ gồm B, C, E.

© Dường quét / tiếp tục quét đến vị trí kế tiếp là cạnh phải của hình chữ nhật

C. C bị loại ra khỏi L. L gồm B và E.

© Cứ như vậy, đường | quét cho đến hết 14 vị trí. Lúc đó vòng lặp while kết

thúc, Va ta thu được kết quả gồm các cặp hình chữ nhật giao nhau như đã

trình bày ở trên.

Š.3 Phân chia đa giác

5.3.1 Hình thang hóa một đa giác đơn

Hình thang là một tứ giác có ít nhất hai cạnh song song với nhau. Một tam

giác có thé được xem như là một hình thang thoái hóa với một cạnh không độ dai

(null — length).

Thuật toán hình thang là thuật toán chia một đa giác đơn thành các hinh thang dựa vào các đỉnh của đa giác. Thuật toán này hoạt động dựa trên kỹ thuật sử

dụng đường quét mà ta mới trình bay ở trên. Ta có thé sử dụng thuật toán

Rectanglelntersection đề phân chia đa giác thành các hình thang với một số thay đổi

như sau :

£ là danh sách các đỉnh của đa giác được sắp xếp theo tọa độ x.

L là tập các cạnh dang bị cắt bởi đường quét.

Đoạn nhìn thay được (Visibility segment) là đoạn sinh bởi đường quét, vẽ tir

một đỉnh tới một cạnh và nằm hoan toán trong đa giác. Có thé có 2 đoạn như vậy,

hoặc 1 hoặc không có như hinh dưới đây (có 2 là đỉnh v,; 1 là đỉnh vị; ; và đỉnh v ;

thi không có).

V\sfltty

M)

Hình 36 : Hình thang hóa một đa giác đơn

Hình thang được tách ra từ đa giác như sau : Doan thay được tử đỉnh v tới giao điểm với cạnh e, gọi là i, là cạnh thẳng đứng đầu tiên của hình thang. Tiếp theo e tử ¡ tới điểm bên trái của nó là cạnh thứ hai. Cạnh thứ hai thăng đứng của hình

thang là đoạn thấy được của trường hợp trước đó,...Cứ như vậy ta phân chia đa giác ban đầu thành các hình thang theo kỹ thuật đường quét.

5.3.2 Tam giác hóa một đa giác đơn

Tam giác hóa một đa giác đơn là việc phân chia một đa giác đơn ra thành các tam giác. Quá trình này được chia ra thành hai công đoạn :

¢ Chia một đa giác đơn P ra thành các đa giác đơn điệu.

e© Tam giác hóa mỗi đa giác đơn điệu.

Phân chia đa giác đơn thành các đa giác đơn điệu :

- 61 -

Chia một đa giác đơn ra thành các thành phân đơn điệu giống như thuật toán

hình thang hóa một đa giác đơn. Quá trình thực hiện như sau :

e Chia đa giác thành các thành phần đơn điệu tại các “dinh quay ve” (return

vertices). Những điểm trở lại là những khía hình chữ V ma hai cạnh gắn liền với nó nằm cùng một bên của đường thằng đứng đi ngang qua đỉnh chung

của chúng.

e Áp dụng cho một hinh thang “thang đứng”, như trong hình dưới

Hình 38 : Chia đa giác đơn thành các thành phần đơn điệu.

Có một hình thang bên trái của khía r, và một hình thang bên phải của khía

r,. Chúng ta đã thu được các thành phần đơn điệu bằng việc tạo ra các đường

chéo từ các hình thang này. Chúng ta đã chia ra từ đa giác một thành phần đơn điệu là A bằng cách vẽ một đường chéo giữa v và r,. Kế tiếp, bằng cách vẽ một

đường chéo giữa đình trở lại thứ hai lar, và đỉnh w, chúng ta đã chia đa giác ra

thêm hai thành phan đơn điệu là B và C.

Tam giác hóa đa giác đơn điệu :

Thuật toán tam giác hóa gồm các công việc như sau :

© Quét theo thứ tự các đỉnh được sắp sếp của đa giác P.

e Giữ lại một danh sách L các đỉnh đã được đường quét quét qua rối nhưng

tam giác chưa được tạo ra.

-62-

¢ Loai ra các điểm trong L. khi một tam giác được tạo.

Ta minh họa quá trình này bằng vi dụ như hình sau : Ba bước dau tiên thực hiện

như sau ;

se Ba điểm dau tiên trên cùng một đường gap khúc (chain). Góc lỗi abe cho phép hai điểm a và c nỗi với nhau bằng một đường chéo. Điểm b bị loại ra khỏi L nên L chi còn hai điểm a và c.

© Cộng thêm điểm d vào. Khi đó góc acd là phản xạ (reflex) do đó tam giác

(a, c, d) ở ngoài đa giác. Nên tam giác này không được lay, ta chèn d vào

L. Tương tự với điểm e, ta được L gồm (a, c, d, e).

© Thêm điểm f. Điểm f có thé nối với a, c và d. Chúng ta thu được 3 tam giác. Loại các điểm a, c và d ra khỏi L, khi đó L còn f và e.

Ta có mã giả cho thuật toán như sau :

MonotoneTriangulation ( P : Da giác đơn điệu): set( Tam giác) Begin

Sắp xếp n đỉnh của P theo tọa độ x và lưu vào V.

L = danh sách với hai điểm đầu của V,

While (V + ¢) do

Begin

p © Min (V)

if (p đối diện với các điểm trong L ) then

begin

-63-

while( | L ' > 1 ) do

Xuất ra tam giác : {Điểm đầu của L. Điểm hai của L, p}

Loại ra điểm đầu của L

End

Chén p vào L End

Else Begin

While( góc gồm (điểm cuối của L, điểm kế cuối của L, p) 1a lồi

và ( L |> l) do

Xuất ra tam giác : { điểm cudi của L, điểm kế cuối của

L, p}

Loại ra điểm cudi của L

End

//¡ Góc là lỗi hoặc | L | = 1

Thêm p vào L

End

End // của while đầu

End.

5.4 Các thuật toán cho cơ sở dé liệu không gian

5.4.1 Thuật toán kiểm tra điểm trong đa giác

Thuật toán cho biết một điểm p có nằm trong một đa giác P hay không.

Thuật toán sử đụng một nửa đường thẳng / bắt đầu được vẽ từ điểm p và kéo ngang qua cắt đa giác tại các giao điểm ở các cạnh của P. Nếu số giao điểm là chin thi

điểm p ở ngoài đa giác P, nếu là lẻ thì điểm p nằm trong đa giác P.

Giao_diem = 0

{= đường ngang vẽ từ điểm p

for (i= 1 to n) / n là số cạnh giao với /

begin

if{ cạnh i giao với / và không trùng với /) then

begin

if{ một điểm cuối của cạnh i cao hơn /) //tinh theo trục y

Giao điem = Giao điem + l;

end end

if (Giao_diem là lẽ) p nằm trong P

end End.

5.4.2 Thuật toán kiểm tra đoạn thing giao nhau

Thuật toán dựa vào kỹ thuật đường quét dé kiểm tra xem trong một tập đoạn thẳng có những cặp đoạn thẳng nào giao nhau. Đường quét sẽ quét qua lần lượt các đầu mút của các đoạn thẳng theo thứ tự được sắp theo tọa độ x của chúng. Tại các

- 65 -

giao điểm của đường quét và các đoạn thẳng, các đoạn thing được so sánh cao hơn hay thấp hơn đoạn khác dựa vào tọa độ y của các giao điểm đó.

Thuật toán được minh họa bang ma giả sau (Tập S gồm n đoạn thẳng) : SegmentlntersectionTest (S : Tập đoạn thang) : Boolean

Begin

Sắp xếp 2n điểm đầu mút của các đoạn thẳng của S và lưu vào £

For(i= 1 to 2n) do

Begin

p= €[i)

if{p là điểm mút trái của đoạn thẳng s) then

begin

insert(s, L) // Chèn đoạn s vào tập L

if{cac đoạn trong L cao hơn s mà giao với s) return true

if{các đoạn trong L thấp hơn s mà giao với s) return true

end

if{p là điểm mút phải của đoạn thẳng s) then

begin

if{cac đoạn trong L cao hơn s giao với các đoạn trong L

thấp hơn s) return true

delete(s.L) // Loại s khỏi L end

cnd End.

S.4.3 Thuật toán kiểm tra đa giác giao nhau

Hai đa giác đơn P và Q giao nhau nếu xảy ra một trong ba trường hợp sau :

e Một cạnh của đa giác P giao với một cạnh của giác Q.

e© Pnằm trong Q.

se Qnằm trong P.

Ta có mã giả mình họa cho thuật toán kiểm tra hai đa giác giao nhau như sau :

PolygonlntersectionTest (P, Q : Da giác)

Begin

// Kiểm tra đoạn thang giao nhau

If (không có cạnh nào của P giao với bat kì cạnh nào của Q) do

Begin

p = Diễm bat ki thuộc đường biên của P

if(p nằm trong Q) ⁄ Kiểm tra điểm trong đa giác

PcQ Else

Begin

q = Điểm bat ki thuộc đường biên của Q

if{q nằm trong P) // Kiểm tra điểm trong đa giác

QcP

Else P và Q không giao nhau End

End

Else P giao với Q End.

Š.4.4 Thuật toán Windowing

Thuật toán được minh họa qua mã giả sau :

Windowing (/ : line, r : rectangle) : Boolean

-67-

Begin

For(mỗi cạnh /, của /) do

For(mỗi cạnh r, của r) do

lẹ(, giao với r,) then return true End

End

p= đinh bat ki của /

if(p ở trong r) return true / đối tượng hình học ở trong r

else / kiểm tra điểm trong đa giác nếu / là đường biên của đa giác

p= đỉnh bat kì của r

if[p ở trong /) return true // r được chứa đựng trong đối tượng

else return false

End.

5.4.5 Thuật toán Clipping

Ta sẽ xem xét thuật toán Clipping (xén) đa giác. Một điêu chú ý khi xén đa

giác là kết quá sau khi xén nhiều khi là tập các đoạn thẳng rời nhau, nhưng chúng ta lại mong muốn kết quả là các đa giác. Để làm được điều đó, ta xem xét hình chữ

nhật xén như là một nửa mặt phẳng và nó xén đa giác dựa vào 4 nửa mặt phẳng. Ta xem rằng đa giác P và hình chữ nhật xén r được lưu trữ theo thứ tự ngược chiều kim đồng hd. Xem xét P trong nửa mặt phẳng H được xác định bằng đường L quét các

cạnh e, =p,p,,, của P. Kiểm tra vị trí của e, dựa vào 4 trường hợp sau :

Case |

n

Case 2

L £Jái

Case 3 Case 4

H H

L Lễ

hị ˆ

Hình 42 : Clipping một cạnh dựa vào nửa phẳng H.

e Cạnh e, ở bên ngoài H, Điểm p,., bị loại bỏ khỏi danh sách các đình của P.

e© Cạnh e, ở bên trong H. Điểm p,,, được giữ lại.

e Cạnh e, ngang qua L và p,,, nằm trong H. Khi đó điểm p,,, được giữ và giao

điểm | giữa L và e, được thêm vào danh sách các đỉnh cia P.

e© Cạnh e, ngang qua L và điểm p,., nằm ngoài H. Khi đó điểm p,,, bị loại bỏ

và giao điểm I giữa L và e, được thêm vào danh sách các đỉnh cia P.

Mã giả của thuật toán như sau :

Clipping ( P: Đa giác, r : Hình chữ nhật) : Đa giác Begin

Sao chép P thành P'

For(mỗi cạnh r, của r) do

{= Đường thang chứa r,

for(mỗi cạnh e, của P`) do

lf giao với e,) then // Case 3 và 4

l=e, AI

Result © I

Endif

- 69 -

Hp,., năm bên trái của r, ) then

Result€p,, // Case 3 Endif

End

Sao chép Result thành P

End End.

re) (4)

Hình 43 : Minh họa xén đa giác qua 4 bước.

Một phần của tài liệu Khóa luận tốt nghiệp Toán tin: Tìm hiểu lý thuyết về cơ sở dữ liệu quan hệ không gian (Trang 58 - 73)

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

(73 trang)