2011-11-02 27 views
19

Tôi có một danh sách các điểm tạo thành đường cong và tôi muốn giảm số điểm, nhưng vẫn giữ được hình dạng tổng thể của đường cong.Làm thế nào để giảm số lượng điểm trong một đường cong trong khi vẫn giữ được hình dạng tổng thể của nó?

Về cơ bản, tôi muốn đi từ này:

enter image description here

Để này:

enter image description here

Vì vậy, các thuật toán sẽ loại bỏ các điểm đó là không cần thiết nhưng gìn giữ những người mà thực sự xác định hình dạng (giống như các điểm ở dưới cùng của đường cong). Có bất kỳ thuật toán đã biết nào để làm điều đó không? Tôi hy vọng có nhưng tôi không chắc chắn những gì để tìm kiếm trên Google. Bất kỳ trợ giúp sẽ được đánh giá cao.

+5

tôi không có bất kỳ thuật toán cho bạn, nhưng chúng ta thường đề cập đến quá trình này là 'đỉnh decimation'. Có lẽ điều đó sẽ giúp ích cho Googling của bạn. –

Trả lời

23
+0

Cảm ơn, tôi đã sử dụng thuật toán Douglas-Peucker hoạt động tốt. –

+1

@ this.lau_ Bạn có thể chia sẻ triển khai của mình cho thuật toán này không. – EmptyData

13

Có một số thuật toán cho việc này.

Cách đơn giản nhất có lẽ là chỉ cần tiếp tục xóa điểm có góc giữa các điểm lân cận gần nhất là 180 độ, cho đến khi một số ngưỡng hoặc cho đến khi bạn đạt đến số điểm mong muốn.

Nếu đường cong trơn tru như trong ảnh của bạn, có thể bạn sẽ nhận được xấp xỉ tốt hơn (hoặc ít điểm hơn nếu bạn thích) bằng cách sử dụng đường cong Bezier chẳng hạn.

+0

Cảm ơn, nhưng tôi nghĩ gợi ý đầu tiên sẽ không hiệu quả đối với tôi vì dữ liệu của tôi không sạch như trong ví dụ. Có thể có những điểm nhỏ của các điểm rất gần nhau, mà nên được giảm xuống một điểm duy nhất bất kể góc. Sử dụng một đường cong Bezier có lẽ sẽ làm cho vấn đề phức tạp hơn thay vì đơn giản hóa nó, và làm cho việc render chậm hơn. –