Thiết kế hệ thống kiểm tra các quan hệ hình họ ca trang

Một phần của tài liệu Thiết kế hệ thống kiểm tra các quan hệ hình học trong 2D và 3D (Trang 29 - 42)

III. CÁC THUẬT TỐN KIỂM TRA SỰ TƯƠNG QUAN GIỮA CÁC ĐỐI TƯỢNG HÌNH HỌC

Thiết kế hệ thống kiểm tra các quan hệ hình họ ca trang

b c d d c b a b a d c a b c d 1 2

Luận văn tốt nghiệp

Phương trình tham số cho mỗi đường như sau: x1 (t) = ax + (bx - ax) * t

y1 (t) = ay + (by - ay) * t và

x2 (u) = cx + (dx - cx) * u

y2 (u) = cy + (dy - cy) * u

Ta gọi các đường thẳng chứa các đoạn thẳng ab và cd là các đường cha, đây là các đường vơ hạn. Trước hết, ta xét hai đường “cha” cĩ giao nhau khơng, sau đĩ xem giao điểm cĩ thuộc cả hai đoạn thẳng khơng? Nếu các đường “cha’ giao nhau, ta cĩ giá trị to và uo sao cho:

x1 (to) = x2(uo) và y1(to) =y2(uo) Từ đây, ta cĩ các phương trình sau:

ax + (bx- ax) * to = cx+ (dx - cx) * uo

ay + (by- ay) * to = cy + (dy - cy) * uo

Khử uo, ta được:

D* to = (cx - ax) * (dy - cy ) - (cy - ay) * (dx - cx) với D = (bx - ax) * (dy - cy) - ( by - ay) * (dx - cx)

Cĩ hai trường hợp cơ bản, D bằng hay khác 0.

• D khác zero

Nếu D khác 0, ta tính to từ phương trình (4). Nếu to nằm ngồi đoạn [0, 1] thì khơng cĩ giao điểm giữa hai đoạn. Ngược lại, thì cĩ thể cĩ giao điểm, thay to vào (3) để tính uo. Nếu uo nằm trong đoạn [0, 1] thì chắc chắn cĩ giao điểm, và dùng phương trình (1) và (2) để tính.

• D bằng zero

Thiết kế hệ thống kiểm tra các quan hệ hình học trang 30

(1) (2)

(3)

(4) (5)

Luận văn tốt nghiệp

Nếu D bằng 0, từ phương trình (5) suy ra:

(dy - cy) / (dx - cx) = (by - ay) / (bx - ax)

Nghĩa là các hệ số gĩc bằng nhau, nên các đường cha song song. Nếu các đường cha trùng nhau thì các đoạn cũng cĩ thể trùng nhau. Để kiểm điều này, ta xem c cĩ nằm trên đường cha đi qua a và b khơng. Dựa vào phương trình của đường cha là:

(bx - ax) * (y - ay) - (by - ay) * (x - ax) = 0

thay cx cho x và cy cho y và xem vế trái cĩ đủ gần 0 khơng (nghĩa là: nhỏ hơn lượng nào đĩ, như 10 - 5). Nếu khơng, các đường cha khơng trùng nhau, và khơng cĩ

giao điểm. Nếu thỏa mãn thì phải thực hiện bước kiểm cuối cùng để xem các đoạn cĩ trùng nhau khơng.

Từ phương trình (1) tìm haigiá trị tc và td mà đường đạt tới vị trí c và d. Vì các đường cha trùng nhau, ta chỉ cần dùng thành phần x (nếu đường 1 thẳng đứng, thì dùng thành phần y), và thay cx và dx, ta cĩ :

tc = (cx - ax) / (bx - ax)

td = (dx - ax) / (bx - ax)

Đường 1 bắt đầu tại 0 và kết thúc tại 1, và xét thứ tự của bốn giá trị 0, 1, tc và td, ta xác định được vị trí tương đối của hai đường. Sẽ chồng nhau trừ khi cả hai tc và td nhỏ hơn 0 hay lớn hơn 1. Nếu cĩ trùng nhau, ta dễ dàng xác định các điểm đầu trùng nhau từ tc và td. (adsbygoogle = window.adsbygoogle || []).push({});

Giải thuật được xây dựng trong thủ tục Intersect (), gồm các tham số là bốn điểm đầu của các đường, giá trị trả về cĩ thể cĩ thể cĩ các giá trị sau:

• 1: cĩ một giao điểm.

• 2: khơng giao nhau.

• 3: các đoạn thẳng song song nhau.

• 4: hai đoạn thẳng chồng nhau.

• 5: hai đoạn thẳng cùng nằm trên 1 đường thẳng, khơng cắt nhau.

Thiết kế hệ thống kiểm tra các quan hệ hình học trang 31

(6)

(7)

Luận văn tốt nghiệp Giải thuật: -Tính Mẫu số D; -Nếu D < > 0 . Tính to,uo;

. Nếu to thuộc [0,1] và uo thuộc [0,1] + Tính giao điểm M

+ Return 1; ( 2 đoạn thẳng cắt nhau tại M) Ngược lại Return 2; (2 doạn thẳng khơng cắt nhau) - Ngược lại,

. Nếu c nằm trên đoạn ab + Tính tc, td;

+ Nếu khơng phải cả tc và td < 0 hoặc cả tc, td >1 Return 4; (2 doạn thẳng chồng nhau) + Ngược lại,

Return 5; (2đoạn thẳng nằm trên 1 đường thẳng và khơng cắt nhau)

. Ngược lại, Return 3; (2 đoạn thẳng song song )

4.Vẽ đa giác (Polygon)

Cơ sở tốn học:

Đa giác là tập hợp các đoạn thẳng liên tiếp cùng nằm trong mặt phẳng khép kín. Một đa giác cĩ ít nhất 3 cạnh. Như vậy, đa giác đơn giản nhất là tam giác.

Giải thuật:

- Xuất phát từ đỉnh đầu tiên

- Vẽ nối đến đỉnh kế tiếp theo thứ tự cùng chiều kim đồng hồ. - Vẽ nối từ đỉnh cuối cùng đến đỉnh đầu tiên.

Luận văn tốt nghiệp

5.Vẽ n-giác

Cơ sở tốn học:

Một n-giác là đa giác quy tắc cĩ N cạnh (đa giác quy tắc: đa giác mà mọi cạnh cĩ độ dài bằng nhau, và các cạnh kề nhau tạo nên những gĩc trong bằng nhau). Nếu cho đỉnh đầu tiên trên trục x tại (R, x). Cho gĩc A bất kỳ, vị trí (x,y) của một điểm trên đường trịn cĩ gĩc A sẽ được tính (x,y) = (R cos(A), R sin(A)). Và đỉnh thứ i, Vi, của n -giác nằm ở gĩc 2π (i -1) / N và cĩ vị trí: Vi = ( R cos(2π (i -1) / N ), R sin(2π (i -1) / N) ). Giải thuật: - Số đỉnh = N - Định gĩc A = 2 Pi / N - Vịng lặp xác định đỉnh thứ i . Gĩc = i *A; . Tìm tọa độ đỉnh Vi.

6.Tơ màu đa giác

Cơ sở tốn học:

Phương pháp hiển thị các vùng được tơ màu trong đồ họa máy tính là quá trình xác định các pixel tương ứng thuộc vùng tơ màu cho nĩ. Cĩ nhiều thuật tốn đã được nghiên cứu và phát triển cho việc hiển thị các vùng được tơ màu trên màn hình, một trong những thuật tốn đĩ là tơ màu theo vết dầu loang, một thuật tốn khác là tơ màu theo dịng quét. Ở đây ta dùng phương pháp tơ màu theo dịng quét (scan-line algorithm) hay cịn gọi là giải thuật tơ màu chẵn lẻ (odd - even algorithm).

Thuật giải này sử dụng các giao điểm giữa các đường biên của vùng cần tơ với các đường thẳng gọi là dịng quét và xác định các pixel nào nằm trong vùng tơ màu giữa hai giao điểm liên tiếp, đĩ chính là các pixel dọc theo đường quét nằm giữa hai giao điểm và nằm bên trong đa giác. (adsbygoogle = window.adsbygoogle || []).push({});

Luận văn tốt nghiệp

Ở mỗi điểm giao dịng quét chuyển đổi hoặc đi vào hoặc đi ra khỏi đa giác, đĩ là sự thay đổi parity của điểm đĩ. Nếu dịng quét đi vào trong đa giác những pixels tiếp theo sẽ được tơ, nếu đi ra ngồi những pixels tiếp theo sẽ khơng được tơ.

Khi dịng quét đi qua một đỉnh P của đa giác (chính là giao điểm của 2 cạnh của đa giác) nĩ tạo ra 2 giao điểm, mỗi điểm với 1 cạnh của đa giác đi qua đỉnh đĩ, nếu đỉnh ở giá trị cực (local extremum) Pixels ở bên trái và bên phải của đỉnh đĩ sẽ cĩ cùng parity, nhưng nếu đỉnh khơng ở giá trị cực các Pixels ở bên trái và bên phải của đỉnh đĩ sẽ cĩ parity ngược nhau, do đĩ ta cần cĩ một xử lý đặc biệt hơn.

 Nếu P là giao điểm của hai cạnh cĩ hướng y ngược nhau (một cạnh cĩ giá trị y tăng,một cạnh cĩ giá trị y giảm - Scan Line 1) thì dịng quét cĩ 2 điểm giao.

 Nếu P là giao điểm của hai cạnh cĩ hướng y trùng nhau (hai cạnh đều cĩ giá trị y cùng tăng hay giảm - Scan Line 2) thì dịng quét cĩ 1 điểm giao.

Trước khi tơ màu, ta cần kiểm tra mỗi đỉnh đa giác. Nếu y của nĩ khơng là giá trị cực trị(local extremum), như trong scan line 2. Vì những Pixels đối với bên trái và phải của đỉnh đĩ khác parity, khác giá trị kiểm tra inside-outside; ta phải làm ngắn một trong hai cạnh đi một chút (giảm y của đầu cạnh đĩ một pixel).

Đối với cạnh nằm ngang trong đa giác khơng cần đưa vào tập các cạnh của đa giác để xử lý.

Giải thuật:

Bước 1: Xác định Frame “bao” đa giác.

Frame bao đa giác là hình chữ nhật nhỏ nhất chứa tồn bộ đa giác. Để xác định hình chữ nhật này ta lấy min hoặc max các tọa độ đỉnh của đa giác trong hệ tọa độ Descartes rồi tăng, hoặc giảm 1 để đảm bảo hình chữ nhật là hình bao và đa giác hồn tồn nằm trong nĩ.

Thiết kế hệ thống kiểm tra các quan hệ hình học trang 34

1 2, 3

1 4

2

Scan line Scan Line

Luận văn tốt nghiệp

Bước 2: Xác định danh sách các cạnh đa giác để xử lý. Lần lượt duyệt tất cả cạnh của đa giác:

• Khơng đưa cạnh nằm ngang của đa giác vào danh sách.

• Kiểm tra 2 cạnh đa giác liên tiếp, nếu đỉnh chung khơng là điểm cực trị (local extremum), làm ngắn đầu cạnh của một cạnh đi qua đỉnh chung một pixel.

Bước 3: Tiến hành tơ màu.

Tiến hành các đường quét ngang tư ø Ymin + 1 đến Ymax - 1.

• Ứng với một đường quét ngang yi nào đĩ, ta xác định các điểm cắt (bằng giải thuật tìm giao điểm giữa hai đoạn thẳng đã cĩ), giữa các đường quét ngang với tất cả các cạnh của đa giác. Vì tung độ y của điểm cắt bằng yi nên ta chỉ cần đưa các hồnh độ xi của điểm cắt vào một danh sách.

• Sắp xếp lại danh sách sao cho các giá trị xi tăng dần.

• Duyệt qua các điểm cắt và đếm số điểm cắt đã duyệt.

• Nếu điểm cắt trùng với đỉnh của đa giác: Nếu cĩ một cạnh song song với đường quét thì đỉnh trước đếm tăng và đỉnh sau khơng đếm tăng.

• Tơ màu giữa các cặp giao điểm .

Bước 4: Lập lại bước hai cho đến khi yi= ymax.

Bước 5: Vẽ lại đa giác bằng màu đã tơ.

Lưu ý: Nếu đa giác khơng phải là đa giác đơn thì giải thuật này khơng vận dụng được.

7.Điểm bên trong / bên ngồi đa giác (adsbygoogle = window.adsbygoogle || []).push({});

Cơ sở tốn học:

Giải thuật này nhằm xác định một điểm cho trước cĩ nằm bên trong một đa giác đơn phẳng hay khơng.

Giải thuật xây dựng dựa trên định lý mang tên JORDAN sau đây:

“Mỗi đường cong, kín, đơn, phẳng, một chiều, phân hoạch mặt phẳng thành hai miền, một trong hai miền đĩ hồn tồn chứa những đường thẳng nào đĩ, miền cịn lại thì khơng cĩ tính chất đĩ”.

Luận văn tốt nghiệp

Trong định lý trên đây một trong hai miền sẽ được gọi là miền trong (gồm bản thân đường cong và phần mặt phẳng giới nội bởi đường cong). Khơng thuộc miền trong gọi là miền ngồi.

Định lý này vẫn đúng cho trường hợp đa giác đơn phẳng một chiều như là một trường hợp riêng.

Từ định lý này dẫn đến hệ quả sau:

Từ một điểm P bất kỳ, vẽ một tia chỉ cắt đa giác ở những điểm trong của các cạnh (nghĩa là : khơng đi qua đỉnh nào của đa giác); nếu số giao điểm là lẻ thì P là điểm trong, nếu số giao điểm là chẵn thì P là điểm ngồi”.

Về mặt kỹ thuật mọi đường cong đơn, phẳng, kín, liên thơng, khơng tự cắt đều cĩ thể tiếp cận tuyến tính bằng một đa giác bao gồm một số hữu hạn các cạnh liên tiếp. Vì vậy cho phép xây dựng một giải thuật test quan hệ trong/ ngồi chỉ bằng cách xét số giao điểm của tia cĩ gốc là điểm cần xét.

Giải thuật:

- Chọn Px là nửa đường thẳng xuất phát từ P song song với trục Ox, hướng về phía x>0. Lấy P=(x,y).

- P là điểm cần xét.

- Nếu (P là một đỉnh) hoặc (P thuộc trong một cạnh) thì Return (P điểm trong)

- Ngược lại, xác định giao điểm Px với các cạnh đa giác {

. Ci là cạnh Pi Pi+1 của đa giác

. Nếu y = yi thì xét hai cạnh cĩ một đầu là Pi (1)

.. Nếu cả hai đầu kia ở một phía của Pi thì tính Px cắt cả hai cạnh

. Ngược lại (1)

Nếu y > Max(yi,yi+1) hay y<Min(yi,yi+1) (2) Thì Px khơng cắt cạnh Ci

Luận văn tốt nghiệp

. Ngược lại (2)

.. Nếu x <= Min (xi,xi+1) (3) Thì Py cắt cạnh Ci

. Ngược lại (3)

.. Xét tọa độ giao điểm (yo,xo) của Px với cạnh Ci Nếu x >= xo thì Px khơng cắt Ci

}

- Nếu số giao điểm lẻ

. Return P thuộc đa giác.

8.Kiểm tra quan hệ giữa đoạn thẳng và đa giác

Các chương trình ứng dụng mơ tả các hình ảnh bằng hệ tọa độ thế giới thực, cĩ thể là bất kỳ hệ tọa độ Descartes nào mà người dùng cảm thấy thuận tiện nhất. Các hình ảnh được mơ tả trong hệ tọa độ thực sau đĩ sẽ được các hệ độ họa ánh xạ vào các hệ tọa độ thiết bị. Thơng thường, các hệ đồ họa cho phép người dùng xác định một vùng nào đĩ của hình ảnh được hiển thị và nĩ sẽ hiển thị ở đâu trên màn hình (viewport). Ta cĩ thể chọn một vùng hay nhiều vùng để hiển thị, các vùng này cĩ thể đặt ở các nơi khác nhau hay lồng vào nhau trên màn hình. Quá trình này địi hỏi nhiều thao tác như dịch chuyển, biến đổi tỷ lệ để đưa vào bên trong viewport hoặc đơn giản là loại bỏ các phần hình ảnh nằm ngồi vùng đang được xét. Thao tác cuối cùng và cũng được sử dụng nhiều nhất cịn được gọi là clipping. Trong thuật ngữ thơng thường Viewport được hiểu như một window (hình chữ nhật) theo đĩ hình ảnh được clipping. Tuy nhiên Viewport cũng cĩ thể là một đa giác bất kỳ. Bài tốn clipping sau đây được xét cho trường hợp tổng quát hơn: clipping với đa giác đơn bất kì (cho cả hai trường hợp đa giác lồi hoặc lõm). (adsbygoogle = window.adsbygoogle || []).push({});

Cơ sở tốn học và giải thuật:

Các bước tiến hành clipping đoạn thẳng AB bằng một đa giác đơn, phẳng bất kì như sau:

Bước 1: Hốn đổi A, B để xA < xB.

Luận văn tốt nghiệp

Nếu xA = xB . Hốn đổi A,B để yA < yB

Bước 2: Kiểm tra tính trong ngồi của A và B đối với đa giác (Dùng giải thuật kiểm tra điểm bên trong/ngồi đa giác )

Bước 3: Tìm giao điểm của AB với đa giác

(Dùng giải thuật xác định giao điểm của 2 đoạn đã cĩ ) Nếu cĩ giao điểm thì

{

- Đưa các tọa độ của các điểm cắt vào một danh sách - Sắp xếp cho hồnh độ các giao điểm tăng dần

(Nếu xA = xB sắp xếp theo tung độ) }

Bước 4: Thực hiện clipping.

- Nếu A và B đều nằm trong đa giác thì (1)

Nếu số điểm cắt = 0, Return (AB nằm hồn tồn trong đa giác) - Ngược lại

{

. Đoạn thẳng từ A đến điểm cắt thứ 1 thuộc đa giác.

. i = 1

. Lặp lại

. Tìm trung điểm của đoạn thẳng nối hai điểm cắt kế tiếp nhau.

. Kiểm tra trong /ngồi đối với trung điểm. . Nếu trung điểm nằm trong đa giác thì

Return (Đoạn thẳng thuộc đa giác)

. Ngược lại, Return (Đoạn thẳng khơng thuộc đa giác). . Inc (i,1)

Luận văn tốt nghiệp

Cho đến khi i = số điểm cắt }

- Ngược lại, cĩ điểm A hay B nằm ngồi đa giác (1) - Nếu số điểm cắt = 0, Return (Đoạn AB nằm ngồi đa giác). - Nếu số điểm cắt <> 0 thì

{

. Thêm tọa độ điểm A vào đầu danh sách . Thêm tọa độ điểm B vào cuối danh sách . i = 1

. Lặp lại

. Tìm trung điểm của đoạn thẳng nối hai điểm cắt kế tiếp nhau

. Kiểm tra trong/ ngồi đối với trung điểm. . Nếu trung điểm nằm trong đa giác thì (adsbygoogle = window.adsbygoogle || []).push({});

Return (Đoạn thẳng thuộc đa giác)

. Ngược lại, Return (Đoạn thẳng khơng thuộc đa giác) . inc (i,1)

Cho đến khi hết danh sách }

- Ngược lại, Return (Đoạn thẳng khơng thuộc đa giác).

Bước 5: Vẽ lại các đoạn thẳng thuộc đa giác

Mở rộng: Giải thuật cĩ thể được mở rộng cho việc clipping một đa giác bằng cách thực hiện clipping tất cả các cạnh của đa giác.

9.Kiểm tra quan hệ hai đa giác

Cơ sở tốn học:

Giải thuật này cho phép clip bất kỳ một đa giác vào 1 đa giác. Nĩ cũng cho phép hình thành sự giao, hội của 2 đa giác.Chúng ta bắt đầu bằng ví dụ minh

Luận văn tốt nghiệp

họa trong hình sau. Ta liệt kê những đỉnh theo thứ tự từ trái sang phải, theo chiều kim đồng hồ.

Hai đa giác SUBJ và CLIP được thể hiện bằng 2 danh sách (a,b,c,d) và (A,B,C,D) tương ứng. Tất cả điểm giao của 2 danh sách sẽ được xác định và lưu vào danh sách (theo thứ tự sang phải của mỗi cạnh).

Dựa vào hình vẽ trên, ta cĩ:

SUBJ_LIST: a, 1, b, 2, c, 3, 4, d, 5, 6 CLIP_LIST: A, 6 ,3 , 2, B, C, D, 4, 5

Duyệt SUBJ theo hướng đi tới cho tới khi tìm được 1 điểm giao đi vào (entering intersection), là điểm giao mà SUBJ di chuyển từ ngồi vào trong đa giác CLIP.Và đưa điểm này vào danh sách xuất đa giác được clip.

Duyệt SUBJ tới khi gặp 1điểm giao khác. Nhảy ra khỏi SUBJ và di chuyển theo CLIP thay vì SUBJ. Duyệt CLIP theo hướng đi tới. Tới khi gặp một điểm giao, nhảy ra khỏi CLIP và duyệt theo SUBJ theo hướng đi tới, và cứ tiếp tục như vậy. Mỗi đỉnh hoặc mỗi điểm giao gặp phải khi duyệt sẽ được đưa vào danh sách xuất đa giác được clip. Lặp lại tiến trình trên giữa 2 đa giác, duyệt mỗi đa giác theo hướng đi tới

Một phần của tài liệu Thiết kế hệ thống kiểm tra các quan hệ hình học trong 2D và 3D (Trang 29 - 42)