Để đơn giản hóa thuật toán nhằm tránh tình huống đỉnh chèn vào rơi ra ngoài lưới tam giác, người ta đưa thêm một số đỉnh nhân tạo vào lưới tam giác để tạo thành siêu hình bao sao cho tất cả các đỉnh thêm vào sau đó đều nằm bên trong nó. Trong thực tế, giải pháp chọn siêu hình bao là tam giác xem ra là đơn giản nhất.
2.4.1.1. Các bướccơbảncủa thuật toán chèn đỉnh tuần tự:
Khởitạo:
Bổ sung ba đỉnh nhân tạo để xây dựng siêu tam giác phủ toàn bộ diện tích của tập các đỉnh đầu vào. Tọa độ các đỉnh nhân tạo được xác định như sau:
, , ,
Ở đây là giá trị cực đại theo trị tuyệt đối của tọa độ bất kỳ đỉnh nào trong . Điều này bảo đảm rằng tam giác chứa toàn bộ . [Hình 2.15]
Tạolưới tam giác:
Các đỉnh chèn tuần tự vào lưới tam giác hiện hành theo cách sau: Xác định tam giác chứa đỉnh vừa chèn vào.
Tách tam giác nhận được thành ba (bốn) tam giác con tùy theo đỉnh thêm vào rơi vào trong tam giác hay ở trên cạnh của nó.
Nếu đỉnh thêm vào nằm trọn trong tam giác thì phân rã tam giác đó thành 3 tam giác con là , , . [Hình 2.16 (a)] Nếu đỉnh thêm vào nằm trên cạnh chung của hai tam giác thì phân rã
chúng thành 4 tam giác là , , , . [Hình 2.16(b)]
Kiểm tra điều kiện Delaunay và hiệu chỉnh lưới tam giác trong trường hợp không thỏa.
Kết thúc:
Hủy tất cả các tam giác có chứa đỉnh nhân tạo của tam giác nhân tạo tạo ra ban đầu (siêu hình bao).
M
Cạnh chung
Hình 2.16. Các trườnghợp phân rã thành các tam giác con
Nhận xét rằng chi phí nhiều nhất trong thuật toán chèn đỉnh tuần tự chính là thủ tục xác định tam giác chứa đỉnh kế tiếp vừa thêm vào lưới tam giác. Việc thiết kế thành công cấu trúc tìm kiếm hiệu quả sẽ cải thiện tốc độ thực thi của thuật toán chèn đỉnh tuần tự. Để cải tiến tốc độ tìm kiếm vấn đề này chúng ta khảo sát vấn đề dưới đây:
2.4.1.2. Xác định vị trí các đỉnh trong lưới tam giác:
Cho một phân hoạch phẳng trên mặt phẳng (trong trường hợp này là lưới tam giác) và một đỉnh . Cần tìm một phần tử của phân hoạch phẳng (tam giác) chứa đỉnh đã cho. Cấu trúc khung lưới chữ nhật đều để xác định nhanh tam giác chứa đỉnh thêm vào đã được Fang, T.P., and L. Piegl đề cập trong công trình [14] nhưng lượng thông tin lưu trữ ở mỗi ô là khá lớn và chưa thật hiệu quả cho khi tập đỉnh đầu vào phân bố không đều. Một cải tiến đáng kể theo cách tiếp cận trên là cấu trúc lưới đều theo hai mức đã được B. Zalik và I. Kolingerova trình bày trong công trình[13] . Cấu trúc chọn lựa cho độ phức tạp thực nghiệm của thuật toán xấp xỉ . Việc ước lượng trước kích thước khung lưới ngay từ đầu dựa trên số đỉnh đầu vào vẫn có thể làm mỗi ô lưới quản lý số lượng tam giác quá dày, thậm chí ngay cả khi mỗi ô lưới ở mức thứ nhất được chia nhỏ thành ô con ở mức thứ hai. Giải pháp này không thật hiệu quả khi số lượng đỉnh của lưới tam giác còn chưa nhiều (đang trong quá trình thêm vào mà kích thước khung lưới theo ước tính lại khá lớn). Trong công trình [84] , Skvortsov đề cập giải pháp sử dụng kích thước khung lưới tăng trưởng động theo số lượng đỉnh được thêm vào lưới tam giác. Cách
tiếp cận này bảo đảm ở mọi thời điểm từ vị trí ô lưới xác định nhanh hơn đến tam giác thuộc lưới tam giác chứa đỉnh vừa thêm vào. Để làm điều đó ta cần xây dựng một phân hoạch đơn giản hơn là phủ lên mà trên đó thực hiện nhanh quá trình xác định đỉnh cần tìm. Sau đó đặt mối tương quan giữa phần tử của phân hoạch và phần tử của phân hoạch sao cho phần tử gần phần tử nhất có thể. Bắt đầu từ phần tử thông qua chuỗi các tìm kiếm qua các phần tử lân cận sẽ sẽ tìm được phần tử đích . Sau khi thực hiện thành công quá trình tìm kiếm ta có thể thay thế tương ứng bằng một tương ứng khác tốt hơn chính là . Do vậy, quá trình tìm kiếm sẽ ngày càng nhanh.
Bây giờ ta sẽ tìm cách chọn lựa phân hoạch tốt nhất có thể. Giải pháp cụ thể được đề nghị ở đây là chọn phân hoạch là khung ô lưới chữ nhật đều. Ví dụ có một phân hoạch phủ hoàn toàn lên hình vuông kính lưới thì có thể chia nó thành phần là ô lưới hình vuông. Đánh số thứ tự các ô lưới đó theo số tự nhiên: . Khi đó, với đỉnh cho trước một cách tức thời ta có thể xác định được hình vuông , ở đây là ký hiệu lấy phần nguyên. Một trong các cải tiến đáng kể là kích thước lưới chữ nhật phân hoạch sẽ tăng dần theo số lượng đỉnh thêm dần vào lưới để cho ở mọi thời điểm, mỗi ô lưới sẽ chỉ phải phủ một số lượng tam giác xác định đủ nhỏ để quá trình dò tìm lân cận là ít nhất có thể. Ví dụ khi kích thước lưới chữ nhật tăng lên hai lần theo mỗi chiều, ta cần chép thông tin từ mỗi ô cũ sang các ô mới như sau:
r1(i) step 2 step 1 r0(j) r0(taget) Đỉnh thêm vào
Tam giác tham chiếutới ô lưới chữnhật Tam giác đích
Hình 2.17. Cách xác địnhđỉnhthuộcmột tam giác
Vậy kích thước lưới chữ nhật sau mỗi lần hiệu chỉnh sẽ tăng lên 4 lần. Ta chọn kích thước khung lưới ban đầu khởi tạo . Khởi tạo các giá trị ban đầu các ô lưới tham chiếu tới rỗng. Ô lưới nào chứa trọng tâm của tam giác đầu tiên thì đặt tham chiếu đến tam giác đó. Tam giác đầu tiên được tạo ra từ ba đỉnh nhân tạo thêm vào như Hình 2.15. Cần lưu ý rằng nếu có nhiều tam giác cùng phủ lên một ô lưới thì ta chỉ tham chiếu đến một tam giác được cập nhật cuối cùng nhất.
Từ một đỉnh, đỉnh kế tiếp tuần tự thêm vào lưới tam giác, một cách tức thời ta có thể xác định ngay nó thuộc . Từ ta tham chiếu được tam giác . Nếu đó chưa phải là tam giác chứa đỉnh thêm vào thì thực hiện lần theo các tam giác lân cận dựa trên mô hình biểu diễn để hướng đến tam giác cần tìm .
Ở đây, tác giả đề xuất tìm kiếm lân cận theo đường xoắn ốc để phát hiện ra ô lưới khác rỗng đầu tiên. Cách tiếp cận này tăng hiệu quả thực thi của thuật toán lên đáng kể do chỉ loang qua các ô lưới lân cận. Chi tiết của thuật toán tìm kiếm theo đường xoắn ốc để tìm điểm gần nhất từ một điểm truy vấn đã được Bentley, Weide và Yao trình bày chi tiết trong công trình [7] . Quá trình duyệt theo đường xoắn ốc mô phỏng như trong Hình 2.18.
35 34 33 32 31 30 29 36 16 15 14 13 12 28 37 17 5 4 3 11 27 38 18 6 1 2 10 26 39 19 7 8 9 25 49 40 20 21 22 23 24 48 41 42 43 44 45 46 47
Hình 2.18. Quá trình tìm theo đườngxoắnốc dựa trên khung lưới
2.4.1.3. Độ phức tạp thuật toán
Độ phức tạp của thuật toán xây dựng lưới tam giác trên phụ thuộc vào các công đoạn sau:
Xác định đỉnh thêm vào lưới là thuộc tam giác nào.
Hiệu chỉnh lại lưới tam giác thỏa điều kiện Delaunay mỗi khi phân rã một tam giác.
Nới kích thước lưới khung chữ nhật.
Theo tính toán của [7] Bentley, Weide và Yao thì việc xác định ô lưới khác rỗng đầu tiên có độ phức tạp là .
Để xác định độ phức tạp của thuật toán chèn đỉnh tuần tự với các công đoạn còn lại ta khảo sát một số nhận định:
Bổ đề 1. Cho lưới tam giác Delaunay của một tập hợp đỉnh phân bố đều trong một hình vuông. Cho trước hai tam giác và bất kỳ thuộc lưới. Khi đó, việc di chuyển từ tam giác này đến tam giác kia theo hướng thẳng trung bình đòi hỏi
phép toán, trong đó . Chứng minh:
Do các điểm được phân bố đều trong một hình vuông nên các tam giác Delaunay cũng phân bố đều trong hình vuông do đó số lượng tam giác tối đa nằm trên một đưởng thẳng không vượt quá tam giác. Ta nối một đường thẳng giữa hai tam giác, đường thẳng này sẽ giao với m tam giác này chính là đường dẫn giữa hai tam
giác bắt đầu và kết thúc. Dễ dàng thấy rằng . Ta sử dụng hằng số để thể hiện số phép toán trong lần di chuyển.
Định lý 1. Cho đỉnh phân bố đều trong hình vuông đơn vị. Giả sử mỗi lần kích thước lưới tăng lần khi số lượng đỉnh trong lưới tam giác đạt , ở đây - hệ số tăng trưởng lưới, còn - kích thước hiện hành của khung lưới chữ nhật. Khi đó, độ phức tạp trung bình của thuật toán xây dựng lưới tam giác Delaunay là .
Chứng minh: Xét chuỗi thêm các đỉnh với kích thước cố định của khung lưới . Giả sử trong lần tăng kích thước cuối cùng thực hiện sao chép mỗi ô của khung lưới cũ thành 4 ô mới. Bởi vậy cần thực hiện tìm kiếm trong giới hạn ô lưới, tức là phải thực hiện khoảng phép dịch chuyển khi tìm kiếm, ở đây -số thứ tự của đỉnh thứ thêm vào lưới, còn là một hằng số. Khi tăng kích thước lưới lên lần và số lượng đỉnh trong khung ưới đạt giá trị bằng thì khi đó thỏa bất đẳng thức , ở đây – kích thước tối đa của khung lưới. Không mất tính tổng quát, ta giả sử . Khi đó tổng số lượng phép toán dịch chuyển khi tìm kiếm là:
(6)
Thay thế công thức tính tổng bằng công thức tính tích phân ta tính được sự đánh giá số lượng phép toán dịch chuyển như sau:
Từ công thức trên, ta đánh giá được số lượng dịch chuyển trung bình là . Bây giờ ta cần khảo sát số lượng đảo cạnh sau mỗi lần chèn đỉnh kế tiếp vào lưới tam giác hiện có . Nhận xét rằng số lượng đảo cạnh khi ta thêm đỉnh là , ở đây là bậc của đỉnh . [số lần hoán đổi cạnh sau khi thêm đỉnh ]=
(8)
Vậy tổng số hoán đảo cạnh khi chèn tuần tự các đỉnh vào lưới tam giác Delaunay là phụ thuộc tuyến tính .
Độ phức tạp của các phép toán nới kích thước khung lưới là:
(9)
Cuối cùng, độ phức tạp thuật toán xây dựng lưới tam giác sử dụng khung ô lưới chữ nhật động là trong trường hợp trung bình và khi xấu nhất.
2.4.1.4. Cấu trúc dữ liệu trong thuật toán chèn đỉnh tuần tự
Hình 2.19. Cấu trúc dữliệubiểudiễnlưới tam giác theo Winged-Edge rút gọndựa
trên danh sách liên kết
Hình 2.20. Cấu trúc dữliệubiểudiễnlưới tam giác theo Winged-Edge rút gọndựa
trên mảng
Tập hợp các đỉnh, cạnh và các tam giác của lưới tam giác được lưu trữ trong các danh sách liên kết kép. Thuật toán đề ra chọn giá trị phù hợp dựa theo số đỉnh đã tồn tại trong lưới tam giác như đề cập trong mục trên và tạo ra mảng hai chiều tham chiếu tới các tam giác thuộc lưới. Đầu tiên, toàn bộ mảng được gán giá trị tham chiếu đến siêu tam giác. Sau đó, sau mỗi lần tìm được tam giác chứa
đỉnh kế tiếp thêm vào bắt đầu từ ô lưới , ta cần phải cập nhật lại thông tin ô lưới
như sau: .
:
Hình 2.21. Cấu trúc dữliệu biểudiễnlưới tam giác theo cấu trúc tam giác lân cận dựa trên danh sách liên kết
:
Hình 2.22. Cấu trúc dữliệu biểudiễnlưới tam giác theo cấu trúc tam giác lân cận dựa trên mảng
Biểu diễn lưới tam giác sử dụng cấu trúc tam giác lân cận. Dung lượng bộ nhớ sử dụng ít đi đáng kể so với mô hình Winged-Edge mở rộng nhưng đòi hỏi cài đặt phức tạp hơn, đặc biệt đối với lưới tam giác Delaunay ràng buộc.
Việc biểu diễn mô hình dữ liệu ở dạng mảng cho phép tốc độ thực thi nhanh lên đáng kể so với mô hình dữ liệu ở dạng danh sách liên kết. Tuy nhiên, cấu trúc này
sẽ kém hiệu quả khi thực hiện các thao tác biên tập trên lưới tam giác hay ghép các lưới tam giác.