2010-04-30 27 views
10

Tôi có một tập hợp các đỉnh (được gọi là A) và tôi muốn tìm tất cả các đỉnh của đường viền sao cho các đỉnh của đường viền này là đường viền của hình dạng.Cho một tập hợp lớn các đỉnh trong một đa giác không lồi, làm thế nào tôi có thể tìm thấy các cạnh?

Nhiều đỉnh trong A thừa vì chúng nằm bên trong hình dạng, tôi muốn loại bỏ các đỉnh này.

Câu hỏi của tôi tương tự như Best Algorithm to find the edges (polygon) of vertices nhưng tôi cần nó để làm việc cho một trường hợp đa giác không lồi.

EDIT: Làm rõ: Hình ảnh bên dưới là đa giác lõm. Đây là những gì tôi có nghĩa là không lồi. Nếu tôi chạy một thuật toán lồi lồi trên nó, nó sẽ không bảo toàn phần lõm của đa giác. (Trừ khi tôi bị nhầm lẫn).

concave polygon

Tôi có một tập các đỉnh bên trong và trên biên giới của đa giác: [[x1, y1], [x2, y2] ...] tôi muốn giảm bớt các thiết lập sao cho đỉnh chỉ là đường viền biên của hình dạng.

+0

Bạn có ý nghĩa gì khi "làm việc cho trường hợp đa giác không lồi"? Câu hỏi bạn liên kết để bao gồm trường hợp các đỉnh đầu vào tạo thành đa giác lõm, vì vậy tôi không thấy câu hỏi của bạn khác như thế nào. – outis

+0

Làm thế nào để bạn phân biệt các đỉnh nào nằm trong đa giác và các đỉnh nào là * trên * cạnh? –

Trả lời

0

Mô tả của bạn hơi mơ hồ nhưng có thể bạn đang tìm kiếm thuật toán để xây dựng một Convex Hull của một tập hợp các điểm. Đơn giản chỉ cần đặt, vỏ lồi là hình dạng bạn nhận được nếu bạn đặt một ban nhạc cao su xung quanh tất cả các đỉnh.
Viết một thuật toán thân lồi trong 2D không phải là terribly khó khăn và có một số thư viện mà làm điều đó như qhull

(Câu trả lời đó cũng được đưa ra trong câu hỏi bạn bạn liên kết đến mà dường như là một trường hợp đặc biệt của bạn question)

+1

Sẽ không phải là một lồi lồi sẽ loại trừ một số điểm vì nó sẽ chỉ theo dõi một đa giác lồi? Tôi đã thêm một hình ảnh vào câu trả lời để làm rõ hình dạng. –

+1

Nó sẽ như thế nào nhưng làm thế nào bạn có thể cho biết cạnh để phân chia để đặt hai cạnh thêm? – shoosh

0

Đây là một câu hỏi cũ, có thể bị bỏ rơi, nhưng nó khiến tôi suy nghĩ về nó. Bạn không tìm kiếm một lồi lồi, bạn muốn duy trì hình dạng đa giác, nhưng chỉ cần loại bỏ các điểm nằm giữa "cạnh" dọc theo một dòng.

Giải pháp có thể là bước qua các điểm lân cận và tính độ dốc tuyến tính đầu tiên và thứ hai, sau đó lưu giá trị độ dốc đó, tính độ dốc thứ hai và thứ ba, nếu độ dốc của pt1-pt2 bằng pt2-pt3 sau đó pt2 là dư thừa trong việc hình thành các dòng và do đó có thể được gỡ bỏ. Tiếp tục lặp lại cho đến khi bạn quay trở lại tại pt1.

Điều này sẽ đảm bảo hình dạng lõm của bạn được duy trì nhưng các điểm bổ sung không liên quan sẽ bị xóa.