ฉันว่าคุณอยู่ในเส้นทางที่ถูกต้อง แต่การหาอัลกอริธึมที่เหมาะสมและ / หรือมีประสิทธิภาพเป็นอีกเรื่อง: มันเป็นปัญหาที่ยาก อย่างไรก็ตามหากคุณสนใจด้านวิชาการการแก้ปัญหาที่ดีพออาจพอเพียง
ก่อนอื่นถ้าคุณไม่สนใจวิธีแก้ปัญหาของคุณเองCGALมีอัลกอริทึมสำหรับการสลายตัวของ polyhedra ที่มีอยู่แล้ว: http://doc.cgal.org/latest/Convex_decomposition_3/index.html
ตอนนี้สำหรับวิธีการ; เช่นปัญหามากมายในแบบ 3 มิติมักจะเป็นประโยชน์ในการพิจารณาปัญหา 2D ที่เข้าใจได้ง่ายขึ้น สำหรับ 2D งานคือการระบุจุดสะท้อนแสงและแยกรูปหลายเหลี่ยมออกเป็นสองโดยสร้างขอบใหม่ (และอาจเป็นจุดยอดใหม่) จากจุดยอดสะท้อนนั้นและดำเนินการต่อไปจนกว่าคุณจะไม่เหลือจุดยอดสะท้อน (และรูปหลายเหลี่ยมนูนทั้งหมด )
การสลายรูปหลายเหลี่ยมโดย J. Mark 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
โดยพื้นฐานแล้วจะทำการเปรียบเทียบพาร์ติชั่นที่เป็นไปได้ทั้งหมดและส่งคืนพาร์ทิชันที่มีเส้นทแยงมุมน้อยที่สุด ในแง่นี้มันค่อนข้างดุร้ายและเหมาะสมเช่นกัน
หากคุณต้องการการย่อยสลายแบบ "ดูดีกว่า" นั่นคือรูปแบบที่สร้างรูปร่างที่กระชับมากกว่าแทนที่จะเป็นรูปยาวคุณสามารถพิจารณารูปแบบนี้ที่ผลิตโดยMark Bayazitซึ่งเป็นโลภมาก (เร็วกว่ามาก) และดูดีกว่า โดยทั่วไปแล้วจะทำงานโดยพยายามเชื่อมต่อจุดสะท้อนกลับกับจุดที่ดีที่สุดซึ่งตรงกันข้ามกับจุดยอดสะท้อนทั่วไป:
หนึ่งในข้อบกพร่องคือมันไม่สนใจการย่อยสลายที่ "ดีกว่า" โดยการสร้างคะแนน Steiner (จุดที่ไม่มีอยู่บนขอบที่มีอยู่):
ปัญหาใน 3D สามารถคล้ายกัน; แทนที่จะเป็นจุดสะท้อนแสงคุณระบุ "ขอบบาก" การปฏิบัติที่ไร้เดียงสาคือการระบุรอยบากและทำการตัดระนาบบนรูปทรงหลายเหลี่ยมซ้ำ ๆ จนกระทั่งรูปทรงหลายเหลี่ยมนูนออกมา ลองดู"พาร์ทิชันนูนของโพลีเฮดรา: อัลกอริธึมที่เหมาะสมที่สุดที่ถูก จำกัด และแย่ที่สุด" โดย Bernard Chazelleสำหรับรายละเอียดเพิ่มเติม
โปรดทราบว่าวิธีการนี้อาจทำให้เกิดกรณีที่เลวร้ายที่สุดซึ่งมีเลขชี้กำลังจำนวนมากของโพลีเอท - ย่อย นี่เป็นเพราะคุณอาจมีกรณีเลวลงเช่นนี้:
แต่ถ้าคุณมีตาข่ายที่ไม่สำคัญ (คิดว่าเป็นพื้นผิวที่เป็นหลุม) คุณจะได้ผลลัพธ์ที่ไม่ดี มีความเป็นไปได้สูงมากที่คุณจะต้องทำสิ่งต่าง ๆ ให้เข้าใจง่ายมากถ้าคุณจำเป็นต้องใช้สิ่งนี้กับตาข่ายที่ซับซ้อน