ฉันจะทดสอบสามเหลี่ยมภายในการทดสอบในตาข่ายรูปหลายเหลี่ยมได้อย่างไร


10

ป้อนคำอธิบายรูปภาพที่นี่ ฉันมี 3 จุดยอด(V1, V2, V3)สุ่มเลือกบนตาข่ายสามเหลี่ยมปกติ สำหรับจุดยอดทั้งสามนี้ฉันได้คำนวณระยะทางทางมาตรวิทยาและเส้นทาง (โดยใช้ Dijkstra) ในหมู่พวกเขาและสร้างพื้นผิวที่มีลักษณะคล้ายรูปสามเหลี่ยมดังแสดงในรูปด้านบน

ตอนนี้ฉันมีจุดยอดที่อยู่ในแต่ละเส้นทางและสามารถคำนวณระยะทางธรณีวิทยาจากจุดยอดที่กำหนด

สิ่งที่ฉันอยากทำคือการหาจุดยอดหรือสามเหลี่ยมที่อยู่ในพื้นที่สามเหลี่ยม ฉันจะทำสิ่งนี้ได้อย่างไร


2
สมมติว่าวิธี barycentric ทำในสิ่งที่ฉันคิดว่ามันจะค่อนข้างช้ากับชุดใหญ่ ลองนึกภาพชุดของจุดยอด 9 ล้านจุดโดยมีเพียง 9 จุดยอดในชุดที่ต้องการ เหตุใดจึงวนซ้ำทั้งชุดเมื่อ v1, v2 และ v3 ให้ข้อมูลทั้งหมดที่คุณต้องการ คำตอบการเติมน้ำท่วมจะเป็นทางออกที่ยืดหยุ่นเร็วที่สุด แม้ว่าจะไม่ยืดหยุ่น แต่ถ้าคุณคิดว่าคุณมีเส้นเหมือนที่คุณทำตอนนี้ในเรขาคณิตแล้ว scanline จะเป็นวิธีที่เร็วที่สุด
Andrew Wilson

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

3
การเติมน้ำท่วมด้วยกราฟจะเริ่มต้นที่โหนดเยี่ยมชมโหนดเพื่อนบ้านทั้งหมดหากตรงตามเงื่อนไขของขอบเขตและไม่ได้เข้าเยี่ยมชมทำเครื่องหมายเป็นเยี่ยมชมและทำซ้ำ (เรียกซ้ำ) Alteration: ทำเครื่องหมายทุก ๆ โหนดบนเส้นทางในฐานะที่เยี่ยมชมและเริ่มต้นจากโหนดภายในชุด จากนั้นใช้การตรวจสอบการเยี่ยมชมเป็นเงื่อนไขขอบเขต
Andrew Wilson

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

คำตอบ:


4

มีวิธีการอื่นที่ต้องอาศัยการเติมน้ำท่วม อันดับแรกจัดเรียงข้อมูลขอบของคุณลงในลูปที่ขอบกำลังก่อตัวเป็นทวนเข็มนาฬิกาทวนเข็มนาฬิกา จากนั้นเริ่มต้นที่จุดใดจุดหนึ่งบนลูปและเลือกขอบที่เข้าร่วมจุดนั้น ใช้ขอบขอบเขตขาออกและข้ามกับขอบขาออกอื่น ๆ หากมันชี้ไปในทิศทางของใบหน้าปกติแล้วจะมีขอบที่จะรวมหากไม่ทิ้ง จากขอบนี้ดำเนินการต่อไปจนกว่าคุณจะตีขอบขอบเขตซึ่งเป็นจุดที่คุณยุติการเติม ไปยังจุดสุดยอดของขอบเขตที่ยังไม่ได้ไปเยี่ยมชม


ฉันไม่คุ้นเคยกับอัลกอริธึมเติมน้ำท่วม คำอธิบายของคุณค่อนข้างซับซ้อนสำหรับฉัน คุณช่วยให้การอ้างอิงที่เหมาะสมเพื่อดู? ขอบคุณ
mkocabas

ฉันได้คำตอบด้วยการอ่าน ขอบคุณ
mkocabas

3

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

สำหรับตัวอย่างของคุณที่มี 3 คะแนน: ค้นหาจุดสุดยอดจุดตัดจากเซกเมนต์ v1, v2 และบรรทัดที่ v3 อยู่ (จุดยอดไปทางซ้ายบนของ v2) เราจะเรียกจุดสุดยอดนี้ v4

For every vertex pair a,b down v1,v4 and v1,v3 
    For every vertex from a to b
        Mark as in the set
For every vertex pair a,b down v3,v2 and v4,v3
    For every vertex from a to b
        Mark as in the set

ป้อนคำอธิบายรูปภาพที่นี่

มันเรียกว่า scanline เพราะ (ในภาพด้านบน) คุณลงเส้นสีแดงและสีเขียวพร้อมกันจากนั้นเส้นสีแดงและสีฟ้าจะสแกนเส้นในขณะที่คุณไป

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

สิ่งที่ตลกคือ scanline การทดสอบไบเซนทริก (ในกล่องสามเหลี่ยม) และการเติมน้ำท่วมเป็นวิธีการวาดรูปสามเหลี่ยมในการเรนเดอร์ 3 มิติ


2

ฉันคิดว่าคุณสามารถคำนวณพิกัด barycentric ที่มีขอบเขตพื้นผิวสำหรับแต่ละจุดบนพื้นผิวแล้วใช้มันเพื่อตรวจสอบภายในหรือภายนอกของสามเหลี่ยม

ฉันไม่มีอัลกอริทึมที่แน่นอนอยู่ในมือ แต่ฉันพบบทความต่อไปนี้ซึ่งดูเหมือนจะจัดการกับพิกัดประเภทนี้ได้อย่างแน่นอน

พิกัด Barycentric บนพื้นผิว


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