สร้างภูมิภาคบนเกาะตามขั้นตอน


29

ขณะนี้ฉันมีเกาะที่มีลักษณะเช่นนี้:

เกาะ

และฉันต้องการแบ่งขั้นตอนออกเป็นส่วน ๆ ตามภูมิภาคดังนี้:

เกาะกับภูมิภาค

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


คุณได้ภาพเกาะนั่นมาตั้งแต่แรกได้อย่างไร? คุณสร้างมันขึ้นมาและถ้าเป็นเช่นนั้นคุณประสบความสำเร็จได้อย่างไร
Vaillancourt

ฉันได้รับจากเครื่องสร้างแผนที่ออนไลน์
domisum

ขออภัยในความล่าช้าในการอัปเดตคำตอบของฉัน - ใช้เวลานานกว่าจะกลับบ้านกว่าที่วางแผนไว้เดิม ฉันเพิ่มภาพประกอบและลิงก์
Pikalek

หากคุณได้จากเครื่องกำเนิดไฟฟ้าออนไลน์คุณควรมีลักษณะที่Azgaar ของแฟนตาซีแผนที่ปั่นไฟ มันมีภูมิภาคและชื่อพร้อมพารามิเตอร์ที่ปรับแต่งได้และ WB.SE พูดว่าสวัสดี มันเป็น github ดังนั้นคุณอาจตรวจสอบรหัสของพวกเขาได้
Anoplexian - Reinstate Monica

คำตอบ:


40

ในโลกแห่งความเป็นจริงชายแดนของจังหวัดเหล่านั้นมักจะมีลักษณะทางธรณีวิทยาเช่นแม่น้ำ

ดังนั้นอาจเป็นวิธีที่ดีในการสร้างแบบจำลองธรณีวิทยาของเกาะและทำให้เขตแดนหลุดออกจากนี้

Red Blob Games มีบทความดีๆเกี่ยวกับเรื่องนี้พร้อมผลลัพธ์ที่ดูดี

วิธีการของเขาดูเหมือนจะเกี่ยวข้องกับการใช้Voronoi tessellationและกำหนดแม่น้ำให้เป็นขอบเขตระหว่างเซลล์

ตรวจสอบบทความอื่น ๆ ในเว็บไซต์ของเขาเขาได้ทำมากของการเขียนเกี่ยวกับเรื่องของการสร้างแผนที่

เกาะ


3
โปรดทราบว่าในโลกแห่งความเป็นจริงหน่วยงานทางการเมืองหรือการปกครองบางครั้งก็มีหน่วยงานตามอำเภอใจโดยทั่วไปมักจะเป็นเส้นตรง
Pablo H

2
@PabloH จุดที่ดีแม้ว่าเส้นขอบที่ดูเหมือนจะเป็นปรากฏการณ์ยุคอาณานิคมหลังโพสต์สื่อ แต่เนื่องจากเราไม่ทราบว่าการตั้งค่าของปัญหา OPs มันอาจจะเกี่ยวข้อง
ยาม

27

ฉันจะแก้ปัญหานี้ด้วยไดอะแกรม Voronoi สองรอบ:

First Pass: การแบ่งพาร์ติชั่น

บัตรแรกจะใช้การกระจายคะแนนแบบเบาบาง (เช่นระยะห่างระหว่างจุดควรมีขนาดค่อนข้างใหญ่) เพื่อแบ่งเกาะออกเป็นส่วน ๆ (ดูหมายเหตุด้านล่างเกี่ยวกับการสร้างจุด) ถัดไปสร้างไดอะแกรม Voronoi ตามจุดเหล่านี้ สิ่งนี้จะแบ่งเกาะออกเป็นภูมิภาคเหลี่ยมรอบแต่ละจุดดังที่แสดงด้านล่าง:

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

รอบที่สอง: การสุ่มเส้นขอบ

ตอนนี้เกาะแบ่งออกเป็นภูมิภาคแล้วขั้นตอนต่อไปคือ 'ขอบเขต' ระหว่างพวกเขา ในการทำเช่นนั้นให้สร้างเลเยอร์ใหม่ของจุดโดยใช้การกระจายจุดแบบกะทัดรัดมากขึ้น (เช่นระยะห่างระหว่างจุดควรมีขนาดเล็ก) และใช้จุดเหล่านี้อีกครั้งเพื่อสร้างไดอะแกรม Voronoi อีกรูปแบบหนึ่ง ถัดไปสำหรับแต่ละพื้นที่เล็ก ๆ ให้กำหนดพื้นที่ขนาดใหญ่โดยตรวจสอบจุด 'เมล็ด' สิ่งนี้จะส่งผลให้เกิดรอยหยักระหว่างเขตการปกครองที่ใหญ่กว่า นี่เป็นภาพระยะใกล้ของสิ่งที่ดูเหมือนกับแผนภาพ Voronoi ทั้งสอง:

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

และนี่คือพื้นที่เดียวกันที่แสดงเฉพาะขอบเขตสุดท้าย:

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

ความคิดเห็นเกี่ยวกับ Point Generation

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

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

หมายเหตุสุดท้าย

ภาพประกอบที่ฉันให้นั้นเป็นภาพแรสเตอร์ แต่เทคนิคนี้ก็ใช้งานได้กับการแสดงรูปหลายเหลี่ยม / เวกเตอร์เช่นกัน


1
สำหรับแผนชั้นแบบขั้นตอนนี่คือสิ่งที่ฉันทำทำแผนภาพ Voronoi จากจุดภายในภูมิภาค (เกาะ) สร้างตาราง (ไม่จำเป็นต้องเป็นรูปสี่เหลี่ยมผืนผ้าสำหรับกรณีของคุณตารางที่ผิดรูป) ซึ่งล้อมรอบพื้นที่เดียวกัน จากนั้นคำนวณจุดตัดบูลีนของกริดและโวโรโนอิคำนวณพื้นที่และกำหนดให้กับทรีข้อมูล (รายการของรายการ, แถวขรุขระ ฯลฯ ... โครงสร้างข้อมูลใดก็ตามที่คุณต้องการ) ตาม 0.6 เปอร์เซ็นต์ของเซลล์กริดที่เล็กที่สุด คุณจะได้รับเซลล์ที่หายไปบางส่วน แต่คุณสามารถเปรียบเทียบกริดที่ถูกคัดออกของคุณกับต้นฉบับเพื่อค้นหาและกำหนดใหม่ให้กับต้นไม้ของคุณ
เฟลิเป้กูเตียเรซ

คุณเพิ่มรูปภาพ! นี่คือสิ่งที่ฉันกำลังทำเพื่อวัตถุประสงค์ที่แตกต่าง
Felipe Gutierrez

4

MineCraft ทำสิ่งนี้ได้เป็นอย่างดีและอัลกอริธึมการสร้างของโลกได้รับการวิเคราะห์และจัดทำเอกสารอย่างละเอียด

มีคำอธิบายต่าง ๆ ของอัลกอริทึมโดยหนึ่งในนั้นมีอยู่ที่นี่: https://github.com/UnknownShadow200/ClassiCube/wiki/Minecraft-Classic-map-generation-algorithm

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

(เวอร์ชั่นเก่า) บันทึกไว้โดยทั่วไปจะทำงานโดยใช้เครื่องกำเนิดสัญญาณรบกวน Perlin สองแบบหนึ่งแบบสำหรับ "อุณหภูมิ" หนึ่งแบบสำหรับการเร่งรัด "หนึ่งครั้งสำหรับ" การตกตะกอน "จากนั้นเลือก biome จากทั้งสอง ตัวแปรตัวเอง (อุณหภูมิและปริมาณน้ำฝน) ไม่ได้ใช้จริงในเกม ตัวอย่างทะเลทรายไม่มีฝนตก แต่เกมนี้ตัดสินจากคุณสมบัติ "ทะเลทราย" ไม่ใช่จากค่าเร่งรัดดั้งเดิม

มีเครื่องมือออนไลน์ต่างๆเพื่อสร้างแผนที่นิเวศน์วิทยาจากเมล็ดสุ่มเป็นหนึ่งในนั้นคือmineatlas.com ฉันเดาว่าภายในพวกเขาใช้เซิร์ฟเวอร์จาวาซึ่งใช้คลาสภายในของ MineCraft ฉันไม่รู้ว่าซอร์สโค้ดใด ๆ ของพวกเขาสามารถใช้ได้โดยตรงหรือไม่


4

อัลกอริทึมทั่วไปที่ใช้ตัวอย่างเช่นโดยAzgaar ( ซอร์สโค้ด ) ประมาณนี้:

  1. แบ่งทวีปของคุณออกเป็นพื้นที่ขนาดเล็กเช่นผ่าน delauny triangulation หรือเซลล์ voronoi
  2. กำหนดที่ตั้ง "เริ่มต้น" (สุ่มหรืออย่างอื่น) สำหรับวัฒนธรรมอาณาจักรศาสนาหรือสิ่งอื่น ๆ ที่คุณต้องการจำลอง
  3. พิจารณา (เป็นแบบสุ่มหรืออย่างอื่น) "ปัจจัยการเจริญเติบโต" สำหรับแต่ละรายการ ยิ่งคุณมีปัจจัยการเจริญเติบโตที่ต่างกันมากเท่าไหร่แผนที่สุดท้ายของคุณก็จะยิ่งน้อยลงเท่านั้น
  4. ตอนนี้วนซ้ำทั่วอาณาจักรของคุณ (ฯลฯ ) และขึ้นอยู่กับปัจจัยการเติบโตทำให้พวกมันกระจายไปทั่วกระเบื้องเปล่าโดยรอบจนกว่าจะมีการเติมแผนที่ทั้งหมด
  5. คุณอาจต้องการปิดท้ายด้วยการยืดเส้นขอบเล็กน้อยโดยสลับเซลล์ที่มีเพื่อนบ้านเพียงคนเดียวในสีของพวกเขาและถูกล้อมรอบด้วยสีที่แตกต่างกันเป็นสีนั้น

3

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

http://blog.particracy.com/worlds-and-their-geography/

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


2

เป็นคำถามที่สนุกมาก :) วิธีนี้เป็นวิธีที่มีพื้นฐานมาจากเซลล์ Vornoi แต่การวัดระยะทางไม่ได้ค่อนข้าง Euclidian (ฉันใช้พลัง 1.5 แทน 2.0) และมีการสุ่มสร้างขึ้นมาบ้าง มันอาจกระโดดข้ามน้ำที่ไม่เหมาะ

ภูมิภาคใกล้เคียงสามารถรวมเข้าด้วยกันเพื่อให้ได้รูปร่างที่น่าสนใจยิ่งขึ้นที่นี่ฉันใช้เพื่อนบ้าน N ที่ใกล้ที่สุดเพื่อกำหนดสิ่งนี้

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

แผนที่ 1 แผนที่ 2

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