2010-09-30 48 views
5

Tôi có một đa giác đơn giản (lồi hoặc lõm, nhưng không có lỗ) mà tôi cần phải cắt thành các phần với một đoạn đường thẳng. Tôi không chắc chắn làm thế nào để thực sự xác định có bao nhiêu đa giác kết quả sau khi lát, hoặc làm thế nào để nhóm các đỉnh.Làm thế nào để cắt một đa giác đơn giản với một dòng

Trường hợp lồi cơ bản luôn dẫn đến 2 đa giác phụ rất dễ dàng, nhưng làm cách nào để xử lý hình dạng lõm phức tạp? Lấy một hình đa giác "E" chẳng hạn. Một lát dọc có thể mang lại 4 đa giác. Làm thế nào tôi có thể xác định đỉnh nào tạo nên mỗi một trong những đa giác con đó?

Xác định Đa giác: Tôi có hai tùy chọn tại đây. Đa giác của tôi có thể là một danh sách có thứ tự các đỉnh, hoặc nó có thể là một mảng tam giác. Tôi thích một giải pháp sử dụng mảng tam giác. Nó sẽ được khá dễ dàng để lặp qua mỗi tam giác và cắt nó với dòng nếu họ giao nhau. Nhưng sau đó tôi không có ý tưởng làm thế nào để nhóm các tam giác vào các đa giác phụ mà kết quả.

Mã giả hoặc thậm chí là lời khuyên chung là tốt; triển khai C# là lý tưởng.

+1

Đây có phải là sự trợ giúp nào không? http://stackoverflow.com/questions/1775457/generate-new-polygons-from-a-cut-polygon-2d – fredley

Trả lời

2

Một thời gian sau, tôi đã đưa ra this answer cho một câu hỏi hơi khác.

Câu trả lời đó đưa ra cách thiết lập đường viền hình dạng, được phân tách hình tam giác của hình dạng đó.

Ý tưởng cơ bản là xem xét các cạnh của tất cả các hình tam giác dưới dạng vectơ hướng, và sau đó hủy bỏ các cạnh bằng nhau nhưng ngược lại.

Trong trường hợp của bạn, bạn sẽ có một loạt các hình tam giác đại diện cho hình dạng ban đầu. Bạn sẽ cắt các hình tam giác riêng lẻ bằng dòng. Sau đó, bạn sẽ tập hợp các hình tam giác thành các hình dạng bằng cách sử dụng phương pháp được nêu ở trên, với điều kiện rằng các cạnh cắt lát sẽ không hủy.

Có chi tiết và hình ảnh trong câu trả lời được đề cập ở trên. Tuy nhiên, để tóm tắt các bước sẽ

  1. Thực hiện tam giác chia

  2. Đối với mỗi tam giác kết quả, thêm ba cạnh hướng đến một bộ. Để xác định thứ tự theo chiều kim đồng hồ, hãy xem the the answers to this question.

  3. Đi qua cạnh thiết loại bỏ cặp cạnh đó là đều bình đẳng nhưng ngược lại (trừ khi họ là cạnh lát)

  4. Chọn một cạnh trong bộ này, sau đó tìm các cạnh có đuôi phù hợp với người đứng đầu cạnh đầu tiên. Sau đó lặp lại cho cạnh đó, cho đến khi bạn đến cạnh đầu. Loại bỏ từng cạnh khỏi cạnh được đặt khi bạn đến. Bất cứ khi nào bạn nhận được để bắt đầu cạnh bạn có một vòng khép kín đại diện cho một trong những đa giác kết quả.

  5. Thực hiện Bước 4 cho đến khi không còn cạnh nào.

Tất cả điều này đều cho phép bạn bắt đầu từ một tam giác đa giác của bạn. Nhưng như một trong những người bình luận cho câu hỏi ban đầu của bạn đã chỉ ra, bạn có thể muốn xem xét các lựa chọn thay thế được đưa ra tại Generate new polygons from a cut polygon (2D).

+0

Cách tiếp cận tốt đẹp. Tôi vẫn còn một chút thất bại về việc thực hiện nó mặc dù. Bạn có thể cung cấp một vài chi tiết cụ thể không? Logic vòng lặp chạy như thế nào? 1) Lấy hình tam giác ngẫu nhiên A và B. 2) So khớp mỗi bên A với B. 3) Nếu bất kỳ bên A + bất kỳ bên B = 0, loại bỏ các bên? Nhưng làm thế nào để loại bỏ một bên khi chúng ta đang đối phó với pionts? 4) Bây giờ tôi có một hình vuông C. Bây giờ tôi có lặp lại bằng cách lấy liên minh của hình vuông C với tam giác D ngẫu nhiên không? Và sau đó làm thế nào để tôi chuyển sang tiểu đa giác thứ hai? – Liquid

+0

@Liquid, bạn có ý nghĩa gì với logic vòng lặp? – brainjam

+0

Tôi phải thực sự viết một vòng lặp chạy qua mỗi tam giác trong mảng của tôi và làm cho tất cả các so sánh bạn đề xuất. Cuối cùng, tôi cần phải tách mảng tam giác đơn thành nhiều đa giác sau khi lát cắt. – Liquid

5

Tôi có thuật toán này trong thư viện PolyK. Đây là the demo. Nếu bạn hiểu Javascript, tôi chắc chắn nó sẽ dễ dàng để viết lại nó vào ngôn ngữ lập trình của bạn.

Các vấn đề liên quan