อัลกอริทึม Simple Stupid Funnel ทำงานอย่างไร


14

การทำงานกับอัลกอริทึมช่องทางที่แสดงใน Digesting Duckฉันไม่แน่ใจว่าการตรวจจับของช่องทางทำงานอย่างไร

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

คำตอบ:


18

อัลกอริทึมเริ่มต้นด้วยเส้นทางที่คุณพบก่อนหน้านี้ในกรณีนี้รายการของรูปสามเหลี่ยม:

เส้นทาง

รหัสที่ด้านล่างของโพสต์บล็อกของ Mikko สร้างอาร์เรย์ของพอร์ทัลซึ่งเป็นรายการของส่วนของเส้นที่แสดงถึงส่วนของเส้นแบ่งระหว่างรูปหลายเหลี่ยมของเส้นทาง นี่คือ "พอร์ทัล" ที่ทางเดินที่ราบเรียบจะต้องผ่าน (หรือขอบรูปหลายเหลี่ยมจาก "ลองติดตามจุดกึ่งกลางขอบรูปหลายเหลี่ยม") โปรดทราบว่ารายการพอร์ทัลเริ่มต้นและสิ้นสุดด้วยส่วนของบรรทัดที่เสื่อมลงที่จุดเริ่มต้นและเป้าหมาย

รายการพอร์ทัลนี้จะแสดงเป็นส่วนของเส้นประสีเหลืองในรูปภาพของเขา

พอร์ทัล

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

ขั้นตอนวิธี

ซึ่งหมายความว่าการเคลื่อนที่ไปข้างหน้าแต่ละครั้งควรเลื่อนขอบช่องทางเข้าด้านในซึ่งสามารถตรวจสอบได้ด้วยผลิตภัณฑ์ข้ามของเวกเตอร์ที่แสดงถึงด้านเก่าและด้านใหม่ที่อาจเกิดขึ้น ( P × Qในภาพด้านล่างและดูtriarea2ในรหัสของ Mikko) หากการย้ายไปข้างหน้าสำหรับด้านใดด้านหนึ่งจะไม่กระชับช่องทางเราจะไม่อัปเดตด้านนั้นสำหรับการทำซ้ำปัจจุบันของพอร์ทัล (E)

ย้ายเข้าด้านใน

อีกกรณีที่ต้องจัดการคือเมื่อช่องทางเสื่อมลงในส่วนของเส้น ในการตรวจสอบอัลกอริทึมนี้จะตรวจสอบว่าด้านใดด้านหนึ่งอยู่ในด้าน "ผิด" โดยใช้ผลิตภัณฑ์ครอสอีกครั้งเวลาของเวกเตอร์ที่ทำโดยช่องทางยอดและจุดสิ้นสุดด้านขวาและซ้ายตามลำดับ ( R × Sใน ภาพด้านล่าง)

ช่องทางที่เสื่อมโทรม

หากเป็นกรณีนี้เวกเตอร์จาก funnel apex และจุดสิ้นสุดด้านที่ถูกต้องจะถูกเพิ่มไปยังเส้นทางที่ราบเรียบ ( Rในภาพด้านบน) และอัลกอริทึมจะเริ่มต้นใหม่ด้วยจุดสิ้นสุดเป็นจุดปลายใหม่ (FG) เว้นแต่ แน่นอนถ้าเป็นเป้าหมาย


2
@Rolfcore คำตอบชัดเจนไหม? ถ้าไม่จำเป็นต้องปรับปรุงส่วนไหน
Eric

ฉันคิดว่าเขาแค่ลืมที่จะยอมรับคำตอบอันนี้ดีมากและควรได้รับการโหวตอย่างจริงจัง ^^
GameDeveloper

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