การทำงานกับอัลกอริทึมช่องทางที่แสดงใน Digesting Duckฉันไม่แน่ใจว่าการตรวจจับของช่องทางทำงานอย่างไร
บางคนสามารถอธิบายวิธีการให้ฉันอย่างชัดเจนหรือแนะนำวิธีการอื่นในการตรวจหาช่องทางและหากด้านข้างของช่องทางซ้อนทับกัน
การทำงานกับอัลกอริทึมช่องทางที่แสดงใน Digesting Duckฉันไม่แน่ใจว่าการตรวจจับของช่องทางทำงานอย่างไร
บางคนสามารถอธิบายวิธีการให้ฉันอย่างชัดเจนหรือแนะนำวิธีการอื่นในการตรวจหาช่องทางและหากด้านข้างของช่องทางซ้อนทับกัน
คำตอบ:
อัลกอริทึมเริ่มต้นด้วยเส้นทางที่คุณพบก่อนหน้านี้ในกรณีนี้รายการของรูปสามเหลี่ยม:
รหัสที่ด้านล่างของโพสต์บล็อกของ Mikko สร้างอาร์เรย์ของพอร์ทัลซึ่งเป็นรายการของส่วนของเส้นที่แสดงถึงส่วนของเส้นแบ่งระหว่างรูปหลายเหลี่ยมของเส้นทาง นี่คือ "พอร์ทัล" ที่ทางเดินที่ราบเรียบจะต้องผ่าน (หรือขอบรูปหลายเหลี่ยมจาก "ลองติดตามจุดกึ่งกลางขอบรูปหลายเหลี่ยม") โปรดทราบว่ารายการพอร์ทัลเริ่มต้นและสิ้นสุดด้วยส่วนของบรรทัดที่เสื่อมลงที่จุดเริ่มต้นและเป้าหมาย
รายการพอร์ทัลนี้จะแสดงเป็นส่วนของเส้นประสีเหลืองในรูปภาพของเขา
อัลกอริทึมเริ่มต้นด้วยช่องทางที่กว้างและดำเนินการโดยการย้ายด้านช่องทางไปข้างหน้าตามจุดด้านพอร์ทัล (จุดสิ้นสุดของส่วนของเส้น) ตราบใดที่กระชับช่องทาง (AD)
ซึ่งหมายความว่าการเคลื่อนที่ไปข้างหน้าแต่ละครั้งควรเลื่อนขอบช่องทางเข้าด้านในซึ่งสามารถตรวจสอบได้ด้วยผลิตภัณฑ์ข้ามของเวกเตอร์ที่แสดงถึงด้านเก่าและด้านใหม่ที่อาจเกิดขึ้น ( P × Qในภาพด้านล่างและดูtriarea2
ในรหัสของ Mikko) หากการย้ายไปข้างหน้าสำหรับด้านใดด้านหนึ่งจะไม่กระชับช่องทางเราจะไม่อัปเดตด้านนั้นสำหรับการทำซ้ำปัจจุบันของพอร์ทัล (E)
อีกกรณีที่ต้องจัดการคือเมื่อช่องทางเสื่อมลงในส่วนของเส้น ในการตรวจสอบอัลกอริทึมนี้จะตรวจสอบว่าด้านใดด้านหนึ่งอยู่ในด้าน "ผิด" โดยใช้ผลิตภัณฑ์ครอสอีกครั้งเวลาของเวกเตอร์ที่ทำโดยช่องทางยอดและจุดสิ้นสุดด้านขวาและซ้ายตามลำดับ ( R × Sใน ภาพด้านล่าง)
หากเป็นกรณีนี้เวกเตอร์จาก funnel apex และจุดสิ้นสุดด้านที่ถูกต้องจะถูกเพิ่มไปยังเส้นทางที่ราบเรียบ ( Rในภาพด้านบน) และอัลกอริทึมจะเริ่มต้นใหม่ด้วยจุดสิ้นสุดเป็นจุดปลายใหม่ (FG) เว้นแต่ แน่นอนถ้าเป็นเป้าหมาย