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
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 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 cho tới khi đỉnh đầu tiên được gặp lại. Danh sách xuất ra ở thời điểm này (1,b,2,B)
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 35
D 6 5 4 3 2 1 d c b a C B A 1 b 2 3 4 d 5 6 a a restar t start SUBJ_LIST: SUBJ_LIST: A 6 3 2 B 1 C D 4 5
Bây giờ, ta kiểm tra một điểm giao“entering” khác của SUBJ. Và sẽ tạo ra danh sách xuất (3,4,5,6). Việc kiểm tra những điểm giao “entering” khác sẽ chỉ ra là tất cả chúng đã được duyệt, quá trình chấm dứt.
Cách thức để hiện thực quá trình xử lý này là xây dựng hai danh sách SUBJ_LIST: a, 1, b, 2, c, 3, 4, d, 5, 6 CLIP_LIST : A, 6, 3, 2, B,1, C, D, 4 , 5
Mà trong đo,ù việc duyệt mỗi đa giác và liệt kê những đỉnh và điểm giao phải theo thứ tự được gặp.
Giải thuật:
-Bước 1: Tạo danh sách SUBJ_LIST
Duyệt lần lượt mỗi cạnh đa giác SUBJ theo thứ tự cùng chiều kim đồng hồ {
- Tìm các điểm cắt của cạnh Pi-Pi+1 với đa giác CLIP.
- Sắp xếp danh sách điểm cắt theo hồnh độ tăng dần . Nếu hồnh độ
Pi.x=Pi+1.x thì sắp xếp theo tung độ. - Đưa đỉnh Pi vào danh sách SUBJ_LIST
- Đưa các điểm cắt từ danh sách điểm cắt vào SUBJ_LIST theo hướng đi từ Pi tới Pi+1
}
-Bước 2: Tạo danh sách CLIP_LIST
Duyệt lần lượt mỗi cạnh đa giác CLIP theo thứ tự cùng chiều kim đồng hồ {
- Tìm các điểm cắt của cạnh Pi- Pi+1 với đa giác SUBJ.
- Sắp xếp danh sách điểm cắt theo hồnh độ tăng dần. Nếu hồnh độ Pi.x=Pi+1.x sắp xếp theo tung độ.
- Đưa đỉnh Pi vào danh sách CLIP_LIST.
- Đưa các điểm cắt từ danh sách điểm cắt vào CLIP_LIST theo hướng đi từ Pi tới Pi+1.
}
Vịng lặp (1) Vịng lặp (2)
- Tìm điểm giao “entering” chưa duyệt của SUBJ_LIST. - Duyệt trên SUBJ_LIST tới khi thấy điểm giao tiếp theo .
- Chuyển sang duyệt trên CLIP_LIST tới khi thấy điểm giao tiếp theo. Cho tới khi điểm đầu tiên(điểm ‘entering’) được gặp lại. (vịng lặp 2 ) - Xuất Danh sách đa giác tìm được ở trên.
Cho tới khi tất cả các điểm giao ‘entering’ đã được duyệt (vịng lặp 1)