การสร้างถนน / แม่น้ำบนแผนที่ตาราง 2d


12

นี่เป็นคำถามที่มือใหม่ แต่ที่นี่มันไป:

แผนที่ของฉันเป็นตาราง 2d และฉันต้องการสร้างถนนและแม่น้ำ เส้นทางจากจุดเริ่มต้นไปยังจุดสิ้นสุดต้องไม่เป็นเส้นทางที่ดีที่สุดในจำนวนไพ่ แต่ควรมีการสุ่มในระดับหนึ่ง (รอบ)

มีอัลกอริธึมมาตรฐานสำหรับสิ่งนี้หรือไม่?

ไชโย!

UPDATE:

นี่คือผลลัพธ์ของการเล่นกับน้ำหนักบนกริดและใช้อัลกอริธึมพา ธ สั้นที่สุด (Bellman-Ford) โดยใช้ไลบรารี jgrapht ฉันไปกับคำตอบของ Donutz หลังจากทั้งหมด

http://pastebin.com/AGQGK5ik


มีสิ่งกีดขวางบนแผนที่หรือไม่?
MichaelHouse

ยังไม่มีแม่น้ำจะเป็นอุปสรรคแรกที่จะวาง
Markos Fragkakis

คำตอบ:


18

คุณสามารถสร้างเส้นทางที่ดีที่สุดโดยใช้ A * จากนั้นบิดเบือนมันด้วยการเปลี่ยนตำแหน่งกึ่งกลาง

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

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

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

อีกวิธีหนึ่งก็คือการสร้างเสียงเพอร์ลินหลังจากหาเส้นทางที่ดีที่สุดแล้วเลื่อนจุดของคุณตามเสียงที่สร้างขึ้น ตัวอย่างเช่นการใช้เสียงนี้:

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

จากนั้นแสดงด้วยเส้นทางที่เหมาะสมในสีแดงและเส้นทางที่เลื่อนเป็นสีน้ำเงิน:

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

ขอให้สังเกตว่าเส้นทางที่ถูกเลื่อน "ปรับ" เข้าสู่บริเวณที่มืดกว่าของเสียงได้อย่างไร เช่นเดียวกับที่แม่น้ำอาจไหลผ่านหุบเขา

ประโยชน์อย่างหนึ่งของตัวเลือกสัญญาณรบกวน Perlin คือคุณสามารถแยกแยะอุปสรรคและหลีกเลี่ยงสิ่งเหล่านี้ซึ่งเป็นส่วนหนึ่งของอัลกอริทึม


1
คุณจะทำอย่างไรจุดนี้ขยับฐานกับเสียง?
ข่อย

1
ขึ้นอยู่กับว่าคุณเก็บเสียงและสายที่สร้างไว้อย่างไร คุณสามารถค้นหาเสียงรบกวนที่ใกล้ที่สุด / ต่ำสุดที่ตั้งฉากกับเส้นที่กึ่งกลางก่อนจากนั้นที่จุดกึ่งกลางระหว่างจุดกึ่งกลางและจุดสิ้นสุดและอื่น ๆ
MichaelHouse

3

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


2

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

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


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