ขณะนี้ฉันมีเกาะที่มีลักษณะเช่นนี้:
และฉันต้องการแบ่งขั้นตอนออกเป็นส่วน ๆ ตามภูมิภาคดังนี้:
ขั้นตอนวิธีใดที่ฉันกำลังมองหา คุณมีคำแนะนำเกี่ยวกับวิธีการสร้างภูมิภาคที่เชื่อมโยงกันเหมือนในภาพด้านล่าง ความช่วยเหลือของคุณได้รับการชื่นชม
ขณะนี้ฉันมีเกาะที่มีลักษณะเช่นนี้:
และฉันต้องการแบ่งขั้นตอนออกเป็นส่วน ๆ ตามภูมิภาคดังนี้:
ขั้นตอนวิธีใดที่ฉันกำลังมองหา คุณมีคำแนะนำเกี่ยวกับวิธีการสร้างภูมิภาคที่เชื่อมโยงกันเหมือนในภาพด้านล่าง ความช่วยเหลือของคุณได้รับการชื่นชม
คำตอบ:
ในโลกแห่งความเป็นจริงชายแดนของจังหวัดเหล่านั้นมักจะมีลักษณะทางธรณีวิทยาเช่นแม่น้ำ
ดังนั้นอาจเป็นวิธีที่ดีในการสร้างแบบจำลองธรณีวิทยาของเกาะและทำให้เขตแดนหลุดออกจากนี้
Red Blob Games มีบทความดีๆเกี่ยวกับเรื่องนี้พร้อมผลลัพธ์ที่ดูดี
วิธีการของเขาดูเหมือนจะเกี่ยวข้องกับการใช้Voronoi tessellationและกำหนดแม่น้ำให้เป็นขอบเขตระหว่างเซลล์
ตรวจสอบบทความอื่น ๆ ในเว็บไซต์ของเขาเขาได้ทำมากของการเขียนเกี่ยวกับเรื่องของการสร้างแผนที่
ฉันจะแก้ปัญหานี้ด้วยไดอะแกรม Voronoi สองรอบ:
บัตรแรกจะใช้การกระจายคะแนนแบบเบาบาง (เช่นระยะห่างระหว่างจุดควรมีขนาดค่อนข้างใหญ่) เพื่อแบ่งเกาะออกเป็นส่วน ๆ (ดูหมายเหตุด้านล่างเกี่ยวกับการสร้างจุด) ถัดไปสร้างไดอะแกรม Voronoi ตามจุดเหล่านี้ สิ่งนี้จะแบ่งเกาะออกเป็นภูมิภาคเหลี่ยมรอบแต่ละจุดดังที่แสดงด้านล่าง:
ตอนนี้เกาะแบ่งออกเป็นภูมิภาคแล้วขั้นตอนต่อไปคือ 'ขอบเขต' ระหว่างพวกเขา ในการทำเช่นนั้นให้สร้างเลเยอร์ใหม่ของจุดโดยใช้การกระจายจุดแบบกะทัดรัดมากขึ้น (เช่นระยะห่างระหว่างจุดควรมีขนาดเล็ก) และใช้จุดเหล่านี้อีกครั้งเพื่อสร้างไดอะแกรม Voronoi อีกรูปแบบหนึ่ง ถัดไปสำหรับแต่ละพื้นที่เล็ก ๆ ให้กำหนดพื้นที่ขนาดใหญ่โดยตรวจสอบจุด 'เมล็ด' สิ่งนี้จะส่งผลให้เกิดรอยหยักระหว่างเขตการปกครองที่ใหญ่กว่า นี่เป็นภาพระยะใกล้ของสิ่งที่ดูเหมือนกับแผนภาพ Voronoi ทั้งสอง:
และนี่คือพื้นที่เดียวกันที่แสดงเฉพาะขอบเขตสุดท้าย:
เกี่ยวกับการสร้างจุดฉันชอบใช้ แจกแจงแบบปัวซองเพื่อให้การกระจายของคะแนนค่อนข้างดี ตัวเลือกทั่วไปอื่น ๆ คือการได้รับการกระจายอย่างเท่าเทียมกันคือการใช้อัลกอริทึมของ Lloydกับชุดของคะแนนสุ่ม 'ปกติ' รหัสของ LLoyd นั้นง่ายกว่าในการเขียนโค้ด แต่สามารถลองผิดลองถูกเพื่อดูว่าต้องใช้จำนวนการส่งผ่านเท่าใดเพื่อให้ได้ผลลัพธ์ที่ต้องการ
ปัญหาหนึ่งที่อาจเกิดขึ้นกับวิธีนี้คือการแบ่งพาร์ติชันพาสครั้งแรกอาจสร้างพื้นที่เล็ก ๆ หากคุณไม่ต้องการให้พวกเขาอยู่ในผลลัพธ์สุดท้ายของคุณฉันก็แค่รวมพวกมันเข้ากับภูมิภาคที่อยู่ติดกันแบบสุ่ม
ภาพประกอบที่ฉันให้นั้นเป็นภาพแรสเตอร์ แต่เทคนิคนี้ก็ใช้งานได้กับการแสดงรูปหลายเหลี่ยม / เวกเตอร์เช่นกัน
MineCraft ทำสิ่งนี้ได้เป็นอย่างดีและอัลกอริธึมการสร้างของโลกได้รับการวิเคราะห์และจัดทำเอกสารอย่างละเอียด
มีคำอธิบายต่าง ๆ ของอัลกอริทึมโดยหนึ่งในนั้นมีอยู่ที่นี่: https://github.com/UnknownShadow200/ClassiCube/wiki/Minecraft-Classic-map-generation-algorithm
หลักของอัลกอริทึมเป็นกำเนิดเสียง Perlin วิธีนี้จะควบคุมระดับความสูงโดยตรง (มากหรือน้อยในขณะที่ขั้นตอนต่อมาในการแกะสลักถ้ำสามารถเปลี่ยนพื้นผิวได้เช่นกัน) เช่นเดียวกับการสร้างชีวมวล บางอย่างเช่นเครื่องกำเนิดไฟฟ้าชีวมวลอาจเป็นสิ่งที่คุณต้องการใช้เพื่อสร้างพื้นที่ของคุณ
(เวอร์ชั่นเก่า) บันทึกไว้โดยทั่วไปจะทำงานโดยใช้เครื่องกำเนิดสัญญาณรบกวน Perlin สองแบบหนึ่งแบบสำหรับ "อุณหภูมิ" หนึ่งแบบสำหรับการเร่งรัด "หนึ่งครั้งสำหรับ" การตกตะกอน "จากนั้นเลือก biome จากทั้งสอง ตัวแปรตัวเอง (อุณหภูมิและปริมาณน้ำฝน) ไม่ได้ใช้จริงในเกม ตัวอย่างทะเลทรายไม่มีฝนตก แต่เกมนี้ตัดสินจากคุณสมบัติ "ทะเลทราย" ไม่ใช่จากค่าเร่งรัดดั้งเดิม
มีเครื่องมือออนไลน์ต่างๆเพื่อสร้างแผนที่นิเวศน์วิทยาจากเมล็ดสุ่มเป็นหนึ่งในนั้นคือmineatlas.com ฉันเดาว่าภายในพวกเขาใช้เซิร์ฟเวอร์จาวาซึ่งใช้คลาสภายในของ MineCraft ฉันไม่รู้ว่าซอร์สโค้ดใด ๆ ของพวกเขาสามารถใช้ได้โดยตรงหรือไม่
อัลกอริทึมทั่วไปที่ใช้ตัวอย่างเช่นโดยAzgaar ( ซอร์สโค้ด ) ประมาณนี้:
หากคุณสนใจที่จะทำสิ่งนี้ในรูปแบบเวกเตอร์แทนที่จะใช้วิธีแรสเตอร์ฉันได้เขียนบล็อกโพสต์เมื่อนานมาแล้วเกี่ยวกับสิ่งนี้
http://blog.particracy.com/worlds-and-their-geography/
ความคิดคือคุณเริ่มต้นด้วยตาข่าย (ตามปกติโวโรโนอิ) และขยายขอบเขตจากจุดที่มีเมล็ดแบบสุ่มซึ่งมีระยะห่างพอสมควร
เป็นคำถามที่สนุกมาก :) วิธีนี้เป็นวิธีที่มีพื้นฐานมาจากเซลล์ Vornoi แต่การวัดระยะทางไม่ได้ค่อนข้าง Euclidian (ฉันใช้พลัง 1.5 แทน 2.0) และมีการสุ่มสร้างขึ้นมาบ้าง มันอาจกระโดดข้ามน้ำที่ไม่เหมาะ
ภูมิภาคใกล้เคียงสามารถรวมเข้าด้วยกันเพื่อให้ได้รูปร่างที่น่าสนใจยิ่งขึ้นที่นี่ฉันใช้เพื่อนบ้าน N ที่ใกล้ที่สุดเพื่อกำหนดสิ่งนี้
หากคุณสนใจฉันสามารถเข้าไปดูรายละเอียดเพิ่มเติมและแบ่งปันรหัสหลาม