Kĩ thuật Douglas Peucker có thể mang lại kết quả đơn giản hóa tốt nhất, nhƣ trong so sánh với các phƣơng pháp hiện có. Kĩ thuật này luôn vƣợt trội về mặt toán học vì nó mang lại sự hiệu quả trong các phép đo lƣờng khác nhau. Kĩ thuật Douglas Peucker cũng đƣợc coi là kĩ thuật tốt nhất để lựa chọn các điểm trọng yếu và mang lại cảm nhận tốt nhất cho các đại diện của đƣờng cong gốc. Mặc dù có nhiều lợi thế nhƣ vậy nhƣng kĩ thuật này là một phƣơng pháp đệ quy, điều này sẽ dẫn tới việc tràn ngăn xếp với những bộ dữ liệu lớn và giá trị không ổn định.
Tràn ngăn xếp sảy ra khi quá nhiều bộ nhớ đƣợc sử dụng trên các cuộc gọi ngăn xếp. Các cuộc gọi ngăn xếp đƣợc giới hạn về số lƣợng bộ nhớ vì chủ yếu nó dùng để xác định sự khởi đầu của chƣơng trình. Tràn ngăn xếp thông thƣờng là nguyên nhân gây lỗi trong chƣơng trình, vì vậy cần phải tránh nguyên nhân gây ra điều này. Một trong những nguyên nhân chính của kết quả tràn ngăn xếp là từ những nỗ lực để cấp phát bộ nhớ trên ngăn xếp nhiều hơn là nó có thể đáp ứng. Nói cách khác, bằng cách sử dụng các giá trị có thể thay đổi trong ngăn xếp là rất lớn và chƣơng trình yêu cầu quá nhiều lần là nguyên nhân cho việc tràn ngăn xếp.
Kĩ thuật Douglas Peucker sau là một cải tiến phƣơng thức khám phá bằng cách sắp xếp “điểm đầu” bởi thủ tục đệ quy. Thủ tục này chia tách các đƣờng cong thành hai phần đƣờng cong nhỏ hơn và xử lý từng đƣờng cong
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
42
nhỏ một với cùng một kĩ thuật. Ở đây, vấn đề phát sinh khi một tập dữ liệu lớn đƣợc xử lý trên ngăn xếp, quá nhiều cuộc gọi đệ quy cho cùng một ngăn xếp dẫn đến tràn ngăn xếp và là nguyên nhân gây ra sụp đổ các chƣơng trình. Mã giả kĩ thuật Douglas Peucker đƣợc trình bày nhƣ sau:
Thuật toán Douglas Peucker đệ quy.
Giả sử V là một mảng của các đỉnh, bất kì yêu cầu nào của Douglas Peucker (V, i, j) thực hiện chức năng đơn giản hóa chuỗi từ Vi đến Vj.
Procedure Douglas-Peucker(V,i,j)
// Tìm đỉnh Vf, đỉnh xa dòng ViVj nhất
Đặt dist là khoảng cách
if dist > then // là giá trị ngưỡng
Douglas-Peucker(V,i,f) //Chia Vf một khoảng xấp xỉ đệ quy
Douglas-Peucker(V,f,j)
else
Output (ViVj)
end if
Để thực hiện đƣợc thuật toán mạnh mẽ hơn cho phƣơng pháp Douglas Peucker bằng cách chuyển đổi thuật toán đệ quy vào không đệ quy sử dụng ngăn xếp trong. Những thủ tục không đệ quy về cơ bản mô phỏng theo phƣơng pháp ban đầu, bằng cách sử dụng ngăn xếp bộ nhớ trong. Mã giả thuật toán mới đƣợc giải thích nhƣ sau:
Thuật toán Douglas Peucker không đệ quy [9].
Giả sử V là một mảng của các đỉnh, bất kì yêu cầu nào của Douglas Peucker (V, i, j) thực hiện chức năng đơn giản hóa chuỗi từ Vi đến Vj
Procedure Douglas-Peucker(V,i,j)
// Tạo ngăn xếp trong và thêm đường gấp khúc hoàn chỉnh vào ngăn xếp
while ngăn xếp không trống do
// Tìm đỉnh Vf, đỉnh xa dòng ViVj nhất
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
43
if dist > then
Add (V,f,j) into the stack // Chia Vf và thêm phần bên phải vào ngăn xếp
Add (V,i,f) into the stack // Thêm phần bên trái
else
Output (V iV j)
end if end while
Kết luận
Song song với việc tìm hiểu một số thuật toán đang đƣợc ứng dụng trong thực tiễn để đơn giản hóa đƣờng cong, Luận văn cũng đề xuất ra các tiêu chí đánh giá, các thuật toán mới tính toán đơn giản hơn và có thể nhanh hơn các thuật toán trƣớc đó. Tuy vậy việc cài đặt chƣơng trình cho thuật toán mới chƣa đƣợc hoàn thiện.
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
44
CHƢƠNG III
CHƢƠNG TRÌNH THỬ NGHIỆM