Doğru yolda olduğunuzu söyleyebilirim, ancak optimal ve / veya verimli bir algoritma bulmak başka bir konudur: bu zor bir sorundur. Ancak, ilginiz akademik değilse, yeterince iyi bir çözüm yeterli olabilir.
İlk olarak, kendi çözümünüzü bulmak istemiyorsanız , CGAL zaten dışbükey polihedra ayrışması için bir algoritma içerir: http://doc.cgal.org/latest/Convex_decomposition_3/index.html
Şimdi yöntem için; 3D'deki birçok problem gibi, anlaşılması daha kolay olan 2D problemini düşünmek genellikle yararlıdır. 2B için görev, refleks köşelerini tanımlamak ve bu refleks tepe noktasından yeni bir kenar (ve muhtemelen yeni köşeler) oluşturarak ve refleks köşeleri (ve dolayısıyla tüm dışbükey çokgenler) bırakılıncaya kadar devam ederek çokgeni ikiye bölmektir. ).
J. Mark Keil tarafından Poligon Ayrışması aşağıdaki algoritmayı içerir (optimize edilmemiş formda):
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
Temel olarak olası tüm bölümleri kapsamlı bir şekilde karşılaştırır ve üretilen en az köşegenleri olanı döndürür. Bu anlamda bir şekilde kaba kuvvet ve optimaldir.
"Daha hoş görünümlü" dekompozisyonlar istiyorsanız, yani uzun olanlardan ziyade daha kompakt şekiller üreten olanlar, Mark Bayazit tarafından üretilen , açgözlü (dolayısıyla daha hızlı) ve daha güzel görünen ancak birkaç eksikliğe sahip olanı da düşünebilirsiniz . Temel olarak refleks köşelerini, bunun tersi olan en iyi olana, tipik olarak başka bir refleks tepe noktasına bağlamaya çalışarak çalışır:
Eksikliklerden biri, Steiner noktaları (mevcut bir kenarda mevcut olmayan noktalar) oluşturarak "daha iyi" ayrışmaları görmezden gelmesidir :
3D'deki problem benzer olabilir; refleks köşeleri yerine "çentik kenarlarını" tanımlarsınız. Saf bir uygulama, çentik kenarlarını tanımlamak ve tüm polihedra dışbükey olana kadar tekrar tekrar polihedron üzerinde düzlemsel kesimler yapmak olacaktır. Daha fazla bilgi için Bernard Chazelle'nin "Çokyüzlü Dışbükey Bölmeleri: Bir Alt Sınır ve En Kötü Durum Optimal Algoritması" na göz atın .
Bu yaklaşımın en kötü durumda üstel sayıda alt-polihedra üretebileceğini unutmayın. Bunun nedeni şu gibi dejenere olmanız olabilir:
Ancak önemsiz olmayan bir ağınız varsa (engebeli yüzeyi düşünün), yine de kötü sonuçlar alırsınız. Karmaşık ağlar için kullanmanız gerekiyorsa, önceden çok fazla basitleştirme yapmak isteyeceksiniz.