II I CÁC THUẬT TỐN TEST QUAN HỆ HÌNH HỌC
6- Tơ màu đa giá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.
Ở 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.
1 4 Scan Line 1
2,3
1 2 Scan Line 2
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ĩ.
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ơ.
Chú ý: 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
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 đĩ”.
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 (ie : 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)
{
- 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
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ệ đoạn thẳng và đa giác (Clipping 1 đoạn thẳng vào 1 đ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).
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ì.
Bước 1: Hốn đổi A, B để xA < xB.
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) Bằng khơng
{
Đ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.
Return (Đoạn thẳng thuộc đa giác)
Bằng khơng Return (Đoạn thẳng khơng thuộc đa giác). Inc (i,1)
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ì Return (Đoạn thẳng thuộc đa giác)
Bằng khơng Return (Đoạn thẳng khơng thuộc đa giác) inc (i,1)
Cho đến khi hết danh sách }
Bằng khơng 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.