ค้นพบบนพื้นผิวดาวเคราะห์ที่ไม่เรียบ


16

คำถามของฉันคืออะไรจะเป็นวิธีที่ดีที่สุดในการค้นพบบนพื้นผิวดาวเคราะห์ที่ไม่เรียบ?


ข้อมูลพื้นฐาน

ฉันสร้างดาวเคราะห์ขึ้นจากการแมปการเคลื่อนที่ 6 ระนาบที่คาดการณ์ไว้ ตอนแรกเครื่องบินก่อตัวเป็นลูกบาศก์ก่อนที่จะถูกฉายเป็นรูปร่างทรงกลม

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

ฉันสงสัยว่าเป็นไปได้หรือไม่ที่จะใช้ "ใบหน้าลูกบาศก์ใบหน้ากลม" เป็นกริดและใช้อัลกอริธึม A * แบบง่าย ๆ เพื่อค้นหาเส้นทางที่ดีที่สุดที่เป็นไปได้ฉันต้องการให้นำความสูงของการกระจัดกระจายมาพิจารณาด้วย ภูเขาอื่น ๆ (ฉันคิดว่านี่จะเป็นเพียงการแก้ปัญหาด้วยอัลกอริทึม A *) ข้อพิจารณาอีกอย่างหนึ่งคือฉันได้บรรลุการเคลื่อนที่ของดาวเคราะห์โดยใช้ประโยชน์จากกลไกทางฟิสิกส์ของ Unity3d ใช้แรงโน้มถ่วงเข้าหาศูนย์กลางของดาวเคราะห์ วิธีแก้ปัญหาที่เสนอของฉันจะต้องใช้การเคลื่อนไหวของตัวแทนเพื่อควบคุมฟิสิกส์แรงโน้มถ่วงโดยอิสระหรือไม่

เพื่อช่วยให้ชัดเจนขึ้นคำถามของฉันนี่คือร่างกายดาวเคราะห์ปัจจุบันของฉัน:

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


2
คุณอาจสนใจวิดีโอนี้จากการทำลายล้างดาวเคราะห์ ดูเหมือนว่าพวกเขากำลังทำแบบเดียวกันกับที่คุณห่อหุ้มโลกจากลูกบาศก์และค้นหาเส้นทางรอบ ๆ มันไม่ได้เป็นคำตอบจริงๆ แต่คุณจะเห็นว่าพวกเขากำลังใช้ A * พร้อมกับกลยุทธ์อื่น ๆ เพื่อเพิ่มประสิทธิภาพการค้นหาเส้นทางรอบ ๆ ในทรงกลม การค้นหาเส้นทางเริ่มต้นที่เวลา24:30 น .
MichaelHouse

@ Byte56 ขอบคุณสำหรับลิงค์นี้เป็นวิธีการคิดต้นทุนที่น่าสนใจจริงๆแทบรอไม่ไหวที่จะเห็นเกมนั้นเมื่อเล่นจบแล้ว!
Caius Eugene

คำตอบ:


12

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

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

โดยพื้นฐานแล้วเราต้องการแมปไปจากสีแดงเป็นสีน้ำเงินเพื่อให้เหมือนกันบนทรงกลมเหมือนบนลูกบาศก์

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

เนื่องจาก A * มักจะนำเพื่อนบ้านไปยังโหนดปัจจุบันคุณจึงสามารถสร้างชุดฟังก์ชั่นสำหรับรับโหนดที่อยู่ติดกันได้อย่างง่ายดาย ตัวอย่างเช่นgetXPlus(), getXMinus(), getZPlus()และอื่น ๆ ฟังก์ชั่นเหล่านี้จะใช้โหนดปัจจุบันและส่งกลับโหนดในทิศทางที่ระบุโดยชื่อฟังก์ชั่น

เวลาส่วนใหญ่ฟังก์ชั่นเหล่านี้สามารถเพิ่มค่าและทำอย่างไรก็ตามบนขอบที่จะเปลี่ยน

คุณจะต้องการแมปพื้นผิวของคิวบ์ของคุณกับระบบพิกัด 2D อย่างไรก็ตามคุณทำเช่นนี้ขึ้นอยู่กับคุณพวกเขาไม่จำเป็นต้องเข้าแถวเพียงแค่ให้พิกัด X, Y แต่ละพื้นที่ในตาราง

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

ตัวอย่างเช่นการได้รับพิกัด XPlus ที่นี่จะเปลี่ยนทั้งพิกัด X และ Y เพราะเรากำลังย้ายไปยังพื้นที่กริดใหม่บนใบหน้าใหม่ เส้นสีเขียวแสดงถึงขอบระหว่างใบหน้าทั้งสอง

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

ตอนนี้เป็นเพียงพิกัดทั่วโลกมันอาจจะง่ายกว่าที่จะใช้ระบบพิกัดภายในด้วยมิติที่ 3 ที่แสดงถึงคิวบ์ใบหน้าที่คุณอยู่ในปัจจุบัน

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

ในที่สุดทั้งหมดนี้ก็ควรจะถูกแยกออกไปเพื่อที่คุณจะไม่รู้ด้วยซ้ำ


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

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

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

1
สิ่งสำคัญที่ต้องเข้าใจที่นี่คือ A * ไม่จำเป็นต้องทำงานบนเครื่องบิน มันทำงานบนกราฟ แม้ว่าภายในแต่ละคิวบ์ใบหน้าโหนดจะถูกจัดเรียงและเชื่อมต่อในกริด แต่ก็มีการเชื่อมต่อโหนดข้ามขอบของคิวบ์
jmegaffin

1
@ Byte56 ขอบคุณสำหรับคำตอบที่ดีฉันเริ่มใช้วิธีแก้ปัญหาแล้ว แต่ฉันได้พบสิ่งกีดขวางบนถนน บางทีฉันอาจเข้าใจผิด ฉันโพสต์คำถามไปที่ stackoverflow เนื่องจากฉันรู้สึกว่ามันเป็นปัญหาทางคณิตศาสตร์ / การเขียนโปรแกรมstackoverflow.com/questions/16089074/…
Caius Eugene
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.