Tôi muốn nói rằng bạn đang đi đúng hướng, nhưng đưa ra một thuật toán tối ưu và / hoặc hiệu quả là một vấn đề khác: đó là một vấn đề khó khăn. Tuy nhiên, trừ khi sở thích của bạn là học thuật, một giải pháp đủ tốt có thể đủ.
Đầu tiên, nếu bạn không quan tâm đến việc đưa ra giải pháp của riêng mình, CGAL đã chứa thuật toán phân rã đa diện lồi: http://doc.cgal.org/latest/Convex_decysis_3/index.html
Bây giờ cho phương pháp; Giống như nhiều vấn đề trong 3D, thường hữu ích khi xem xét vấn đề 2D dễ hiểu hơn. Đối với 2D, nhiệm vụ là xác định các đỉnh phản xạ và chia đa giác thành hai bằng cách tạo một cạnh mới (và có thể là các đỉnh mới) từ đỉnh phản xạ đó và tiếp tục cho đến khi bạn không còn các đỉnh phản xạ (và do đó đa giác lồi ).
Phân tích đa giác của J. Mark Keil chứa thuật toán sau (ở dạng không được tối ưu hóa):
diags = decomp(poly)
min, tmp : EdgeList
ndiags : Integer
for each reflex vertex i
for every other vertex j
if i can see j
left = the polygon given by vertices i to j
right = the polygon given by vertices j to i
tmp = decomp(left) + decomp(right)
if(tmp.size < ndiags)
min = tmp
ndiags = tmp.size
min += the diagonal i to j
return min
Về cơ bản, nó so sánh triệt để tất cả các phân vùng có thể, và trả về một phân vùng có ít đường chéo nhất được tạo ra. Theo nghĩa này, nó có phần mạnh mẽ và tối ưu.
Nếu bạn muốn phân tách "đẹp hơn", đó là các phân tách tạo ra hình dạng nhỏ gọn hơn là hình thon dài, bạn cũng có thể xem xét phân tách này do Mark Bayazit sản xuất , tham lam (do đó nhanh hơn nhiều) và trông đẹp hơn nhưng có một vài khuyết điểm. Về cơ bản, nó hoạt động bằng cách cố gắng kết nối các đỉnh phản xạ với đỉnh tốt nhất đối diện với nó, điển hình là một đỉnh phản xạ khác:
Một trong những thiếu sót là nó bỏ qua các phân tách "tốt hơn" bằng cách tạo các điểm Steiner (các điểm không tồn tại trên một cạnh hiện có):
Vấn đề trong 3D có thể tương tự; thay vì các đỉnh phản xạ, bạn xác định "các cạnh notch". Việc thực hiện ngây thơ sẽ là xác định các cạnh notch và thực hiện cắt mặt phẳng trên khối đa diện nhiều lần cho đến khi tất cả các khối đa diện đều lồi. Kiểm tra "Phân vùng lồi của khối đa diện: Thuật toán tối ưu trường hợp thấp nhất và trường hợp xấu nhất" của Bernard Chazelle để biết thêm chi tiết.
Lưu ý rằng phương pháp này có thể tạo ra trường hợp xấu nhất theo số mũ đa diện. Điều này là do bạn có thể có những trường hợp thoái hóa như thế này:
Nhưng nếu bạn có một lưới không tầm thường (nghĩ bề mặt gập ghềnh), dù sao bạn cũng sẽ nhận được kết quả kém. Rất có khả năng bạn sẽ muốn thực hiện nhiều đơn giản hóa trước đó, nếu bạn cần sử dụng điều này cho các mắt lưới phức tạp.