การหาเส้นทาง 2D - การค้นหาเส้นทางที่ราบรื่น


10

ฉันพยายามที่จะใช้การบอกทางแบบง่าย ๆ แต่ผลลัพธ์ก็น่าพอใจน้อยกว่าที่ฉันตั้งใจจะทำ สิ่งที่เป็นหน่วยในเกมเช่น Starcraft 2 ย้ายไปทุกทิศทางในขณะที่หน่วยในกรณีของฉันย้ายได้มากที่สุด 8 ทิศทาง (Warcraft 1 สไตล์) เนื่องจาก 8 ทิศทางเหล่านี้ตรงไปยังโหนดที่มีอยู่ถัดไป (พวกเขาย้ายจากไทล์ . ฉันควรทำอย่างไรเพื่อให้ได้ผลลัพธ์เช่นเดียวกับ Starcraft 2 ลดขนาดของกระเบื้อง?

http://i.stack.imgur.com/lr19c.jpg

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


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

2
คุณแน่ใจหรือไม่ว่าเป็นเส้นทางที่คุณต้องการ หน่วยที่ใช้มันจะผ่านผนังบางส่วน ฉันทำให้เห็นได้ชัดเจนขึ้นในอีกตัวอย่าง: i.imgur.com/eh4ZR.pngและนี่คือสิ่งที่คุณอาจต้องการบรรลุ: i.imgur.com/vFQg4.png
Markus von Broady

คุณพูดถูกเส้นทางของฉันมีข้อบกพร่อง แต่มันก็มีไว้เพื่อวัตถุประสงค์ในการแสดงภาพมากขึ้นขอบคุณที่ชี้ให้เห็นวิธีที่ดีกว่า
Kooi Nam Ng

คุณจะต้องมีพิกัดที่เป็นเศษส่วนภายในไทล์เพื่อให้ได้สิ่งที่คุณต้องการ ไม่มีเส้นทางที่เป็นไปได้หากไม่มีสิ่งนี้จะทำงานได้ - การถือเศษส่วน แต่การไม่แสดงสิ่งเหล่านี้จะทำให้หน่วยของคุณเคลื่อนที่ตรง / แนวทแยง / ตรง / แนวทแยง
Loren Pechtel

@ LorenPechtel คุณผิดคุณสามารถทำให้เส้นทางราบรื่นหลังจากค้นหา มันค่อนข้างง่ายเมื่อคุณสร้างสองบรรทัดตามขนาดของหน่วยและตรวจสอบว่าพวกมันตัดกันกับแผ่นย่อยระหว่าง tile0 และ tileN โดยที่ tile1-tile (N-1) เป็นแผ่นที่คุณต้องการลบออกจากเส้นทาง
Markus von Broady

คำตอบ:


8

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

คุณสามารถทำได้คือสร้าง 'กราฟการมองเห็น' (จุดอื่น ๆ ที่สามารถมองเห็นได้จากแต่ละจุด) จากจุดยอดแล้วทำ A * บนกราฟ วิธีนี้ใช้งานได้เพราะเส้นทางที่สั้นที่สุดจะอยู่บนกราฟการมองเห็นเสมอ

การย่อขนาดของกระเบื้องอาจช่วยคุณได้

ทรัพยากร

อ่านเพิ่มเติม

แก้ไข:ฉันชอบความคิดเห็นของ @ MarkusvonBroady

"มันเกี่ยวกับการปรับให้เรียบของเส้นทางไม่ใช่การค้นหาเส้นทางที่พบในภาพดูโอเค"

ทรัพยากร

จาก @MarkusvonBroady

ฉันได้ทำการค้นหาค้นหาสิ่งต่อไปนี้ (สิ่งเหล่านี้อาจช่วยคุณได้)


1
ลิงก์ที่ยอดเยี่ยม +1 จากฉัน
lhk

2
@ MarkusvonBroady ขอบคุณสำหรับ -1 ฉันได้เรียนรู้จากคุณ ฉันไม่ต้องการจุด แต่ฉันยินดีที่จะเรียนรู้และแบ่งปันสิ่งที่ถูกต้อง ฉันเชื่อว่าด้วยการพูดคุยเราสามารถหาคนที่ใช่ :)
Md Mahbubur Rahman

@MarkusvonBroady คุณช่วยแบ่งปันทรัพยากรหลาย ๆ อย่างของอัลกอริธึมการทำให้เรียบของเส้นทางได้หรือไม่?
Md Mahbubur Rahman

ที่จริงฉันคิดว่าคำตอบนี้จะช่วย OP ฉันไม่คิดว่า OP กำลังขอการปรับให้เรียบจริง ๆ (การแก้ไขเส้นโค้งหรือสิ่งที่คล้ายกัน) แต่ตอนนี้อัลกอริทึมของเขากำลังค้นหาเส้นทางที่ไม่เหมาะสมอย่างน่ากลัวและต้องการให้ "เรียบ" เป็นเส้นตรง ซึ่ง A * จะได้พบกับเขาโดยธรรมชาติโดยไม่ต้องปรับให้เรียบ
Sean Middleditch

ฉันใช้ A * และฉันคิดว่าฉันพบเส้นทางที่ดีที่สุดแล้ว
Kooi Nam Ng

0

เริ่มต้นจากปลายด้านหนึ่งของเส้นทางดิบพูดว่าpath[0]คุณสามารถลบpath[1]หากส่วนที่เกิดขึ้นจากการเข้าร่วมจุดpath[0]และpath[2]ไม่ตัดผนังใด ๆ ดำเนินการต่อไปจนกระทั่งส่วนสุดท้ายจะให้เส้นทางที่ง่ายขึ้น

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

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