ย่อยสลายตาข่ายเว้าเป็นชุดตาข่ายนูน


10

ฉันต้องการที่จะย่อยสลายเว้าตาข่ายเป็นชุดของตาข่ายนูนด้วยเหตุผล 2 ประการ:

  1. การแสดงผลที่โปร่งใส
  2. รูปร่างทางฟิสิกส์

มีอัลกอริทึมที่ใช้ชุดของรูปสามเหลี่ยม (เว้า) เป็นอินพุทและเอาท์พุทจำนวนของชุดของรูปสามเหลี่ยม (นูน) หรือไม่? ฉันต้องการที่จะไม่เติมช่องว่างระหว่างส่วนต่างๆของตาข่ายเดิม

ฉันเจอความคิดเล็ก ๆ อยู่แล้ว: หาขอบเว้าทั้งหมดแล้วแยกตาข่ายไปตามห่วงของขอบ ฉันกำลังติดตามใช่ไหม? ฉันจะใช้สิ่งนี้ได้อย่างไร


ตาข่าย "เว้า / นูน" คืออะไร ถ้า mesh หมายถึงเครือข่ายรูปสามเหลี่ยมแสดงว่าเป็นเพียงชุดของรูปสามเหลี่ยมซึ่งนูนออกมา หรือคุณกำลังพูดถึงปริมาณของวัตถุ 3 มิติ? อาจเป็นโพลี
Ivan Kuckir

@IvanKuckir Meshes หรือ polyhedra สามารถเป็นส่วนเว้า / นูนได้เช่นกันและความหมายก็เหมือนกันมาก ตัวอย่างเช่นไม่มีเส้นตรงตัดกันภายในของรูปทรงหลายเหลี่ยมมากกว่าหนึ่งครั้ง
congusbongus

คำตอบ:


11

ฉันว่าคุณอยู่ในเส้นทางที่ถูกต้อง แต่การหาอัลกอริธึมที่เหมาะสมและ / หรือมีประสิทธิภาพเป็นอีกเรื่อง: มันเป็นปัญหาที่ยาก อย่างไรก็ตามหากคุณสนใจด้านวิชาการการแก้ปัญหาที่ดีพออาจพอเพียง

ก่อนอื่นถ้าคุณไม่สนใจวิธีแก้ปัญหาของคุณเอง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ซึ่งเป็นโลภมาก (เร็วกว่ามาก) และดูดีกว่า โดยทั่วไปแล้วจะทำงานโดยพยายามเชื่อมต่อจุดสะท้อนกลับกับจุดที่ดีที่สุดซึ่งตรงกันข้ามกับจุดยอดสะท้อนทั่วไป:

จุดสุดยอดใหม่ของ Bayazit bayazit เชื่อมต่อกับอีกจุดสุดยอดการสะท้อนกลับ

หนึ่งในข้อบกพร่องคือมันไม่สนใจการย่อยสลายที่ "ดีกว่า" โดยการสร้างคะแนน Steiner (จุดที่ไม่มีอยู่บนขอบที่มีอยู่):

การสลายตัวโคลเวอร์โดยใช้สองจุดสทิ

ปัญหาใน 3D สามารถคล้ายกัน; แทนที่จะเป็นจุดสะท้อนแสงคุณระบุ "ขอบบาก" การปฏิบัติที่ไร้เดียงสาคือการระบุรอยบากและทำการตัดระนาบบนรูปทรงหลายเหลี่ยมซ้ำ ๆ จนกระทั่งรูปทรงหลายเหลี่ยมนูนออกมา ลองดู"พาร์ทิชันนูนของโพลีเฮดรา: อัลกอริธึมที่เหมาะสมที่สุดที่ถูก จำกัด และแย่ที่สุด" โดย Bernard Chazelleสำหรับรายละเอียดเพิ่มเติม

รูปทรงหลายเหลี่ยมพร้อมรอย

โปรดทราบว่าวิธีการนี้อาจทำให้เกิดกรณีที่เลวร้ายที่สุดซึ่งมีเลขชี้กำลังจำนวนมากของโพลีเอท - ย่อย นี่เป็นเพราะคุณอาจมีกรณีเลวลงเช่นนี้:

รูปทรงหลายเหลี่ยมที่มีรอยบาก

แต่ถ้าคุณมีตาข่ายที่ไม่สำคัญ (คิดว่าเป็นพื้นผิวที่เป็นหลุม) คุณจะได้ผลลัพธ์ที่ไม่ดี มีความเป็นไปได้สูงมากที่คุณจะต้องทำสิ่งต่าง ๆ ให้เข้าใจง่ายมากถ้าคุณจำเป็นต้องใช้สิ่งนี้กับตาข่ายที่ซับซ้อน


6

การคำนวณการสลายตัวแบบนูนที่แน่นอนของพื้นผิว S เป็นปัญหา NP-hard และมักจะสร้างกลุ่มจำนวนมาก ในการเอาชนะข้อ จำกัด เหล่านี้ข้อ จำกัด ที่แน่นอนอาจจะผ่อนคลายและการสลายตัวโดยประมาณของ S จะถูกคำนวณแทน ที่นี่เป้าหมายคือการกำหนดพาร์ติชันของสามเหลี่ยมตาข่ายที่มีจำนวนน้อยที่สุดของกลุ่มในขณะที่ให้แน่ใจว่าแต่ละกลุ่มมี concavity ต่ำกว่าเกณฑ์ที่ผู้ใช้กำหนด

การสลายตัวของนูนที่แน่นอนกับการสลายตัวโดยประมาณที่แน่นอน

ลองดูห้องสมุดที่มีการสลายตัวโดยประมาณดังต่อไปนี้: https://code.google.com/p/v-hacd/ http://sourceforge.net/projects/hacd/


0

นี่คือรหัสบางอย่างที่สามารถช่วยคุณได้ มันอยู่ใน java ดังนั้นคุณจะต้องแปลงเป็น c ++

นี่เป็นอีกบทความที่สามารถช่วยคุณได้


1
สวัสดีพวกกบฏที่สวมหน้ากากคำตอบเฉพาะการเชื่อมโยงเท่านั้นไม่ได้รับการสนับสนุนที่นี่ หาก URL เปลี่ยนแปลงตลอดเวลาหรือทรัพยากรไม่พร้อมใช้งานก็สามารถออกจากคำตอบที่ขึ้นอยู่กับลิงก์ทั้งหมดที่ไม่มีการแก้ปัญหาสำหรับผู้ใช้ในอนาคต เป็นเรื่องดีที่จะให้ลิงก์สำหรับเครดิตและการอ่านเพิ่มเติมตราบใดที่คำตอบของคุณยังคงยืนอยู่ได้และให้แนวทางในการแก้ปัญหาก่อนที่ผู้อ่านจะคลิกลึก โปรดพิจารณาการแก้ไขคำตอบนี้เพื่อให้ครอบคลุมอย่างน้อยคร่าวๆว่าโซลูชันที่คุณลิงก์ไปทำงานนั้นเป็นอย่างไร
DMGregory

@DMGregory โปรดลบคำตอบที่ฉันทำไม่ได้

คำตอบไม่จำเป็นต้องถูกลบ เพียงแค่แก้ไขเพื่อให้มีข้อมูลเพิ่มเติมสามารถทำให้เป็นคำตอบที่ยอดเยี่ยม
DMGregory

@DMGregory แต่จะซ้ำกับคำตอบอื่นในโพสต์นี้ ฉันจะแก้ไขคำตอบอื่น ๆ แล้วใส่ข้อมูลของฉันที่นั่น

ฉันคิดว่าคุณรู้สึกว่ามีสิ่งใหม่ที่จะเพิ่มเมื่อคุณแบ่งปันคำตอบนี้ตั้งแต่แรก ฉันไม่สงสัยเลยว่าคุณสามารถอธิบายรหัสที่คุณเชื่อมโยงในแบบที่ไม่ใช่สำเนาของคำตอบที่มีอยู่ หากคุณต้องการที่จะลบมันลิงค์สำหรับการทำเช่นนั้นจะมีให้คุณใช้งานในเวอร์ชันเดสก์ท็อปของเว็บไซต์
DMGregory
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.