मैं कहूंगा कि आप सही रास्ते पर हैं, लेकिन एक इष्टतम और / या कुशल एल्गोरिथ्म के साथ आना एक और बात है: यह एक कठिन समस्या है। हालांकि, जब तक आपकी रुचि अकादमिक नहीं है, तब तक एक अच्छा-पर्याप्त समाधान पर्याप्त हो सकता है।
सबसे पहले, यदि आप अपने स्वयं के समाधान के साथ आने में रुचि नहीं रखते हैं, तो CGAL में पहले से ही उत्तल पॉलीहेडा अपघटन के लिए एक एल्गोरिथ्म है: http://doc.cgal.org/latest/Convex_decomposition_3/indit.html
अब विधि के लिए; 3 डी में कई समस्याओं की तरह, यह अक्सर 2 डी समस्या पर विचार करने के लिए सहायक होता है जिसे समझना आसान होता है। 2 डी के लिए, कार्य रिफ्लेक्स कोने की पहचान करना है, और उस रिफ्लेक्स वर्टेक्स से एक नया किनारा (और संभवतः नए कोने) बनाकर बहुभुज को दो भागों में विभाजित करना है, और तब तक जारी रखना है जब तक आप कोई रिफ्लेक्स वर्सेट्स (और इसलिए सभी-उत्तल पॉलीगोन नहीं छोड़ते हैं) )।
जे। मार्क Keil द्वारा बहुभुज अपघटन में निम्नलिखित एल्गोरिथ्म शामिल हैं (अयोग्य रूप में):
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
मूल रूप से यह सभी संभावित विभाजनों की तुलना करता है, और उत्पादित कम से कम विकर्णों के साथ एक लौटाता है। इस अर्थ में यह कुछ हद तक पाशविक-बल और इष्टतम भी है।
यदि आप चाहते हैं कि "अच्छे दिखने वाले" डिकम्पोजिशन हों, तो यह वह है जो लम्बी के बजाय अधिक कॉम्पैक्ट आकार का उत्पादन करता है, आप मार्क बायज़िट द्वारा निर्मित इस पर भी विचार कर सकते हैं , जो लालची है (इसलिए बहुत तेज़ है) और अच्छे दिखते हैं लेकिन कुछ कमियां हैं। यह मूल रूप से इसके विपरीत सबसे अच्छा एक के लिए रिफ्लेक्स कोने को जोड़ने की कोशिश करके काम करता है, आमतौर पर दूसरे रिफ्लेक्स वर्टेक्स के लिए:
कमियों में से एक यह है कि स्टीनर पॉइंट (एक मौजूदा किनारे पर मौजूद न होने वाले बिंदु ) बनाकर "बेहतर" डिकम्पोजिशन को अनदेखा करता है :
3 डी में समस्या समान हो सकती है; पलटा कोने के बजाय, आप "पायदान किनारों" की पहचान करते हैं। एक भोली कार्यान्वयन पायदान किनारों की पहचान करने के लिए होगा, और पॉलीहेड्रॉन पर प्लेन कट्स को तब तक बार-बार करें जब तक कि सभी पॉलीहेड्रे उत्तल न हों। की जाँच करें बर्नार्ड चाज़ेल द्वारा: "और एक निम्न सीमित बुरी से बुरी हालत इष्टतम एल्गोरिथ्म बहुकोणीय आकृति की उत्तल विभाजन" अधिक जानकारी के लिए।
ध्यान दें कि यह दृष्टिकोण सबसे खराब स्थिति पैदा कर सकता है, जो उप-पॉलीहेड्रा की एक घातीय संख्या है। ऐसा इसलिए है क्योंकि आप इस तरह के मामलों को कम कर सकते हैं:
लेकिन अगर आपके पास एक गैर-तुच्छ जाल है (धमाकेदार सतह), तो आपको वैसे भी खराब परिणाम मिलेंगे। यह बहुत संभावना है कि आप पहले से ही बहुत सरलीकरण करना चाहते हैं, अगर आपको कभी जटिल जाल के लिए इसका उपयोग करने की आवश्यकता है।