สร้างภูมิภาคที่เท่าเทียมกันในแผนที่ฐานสิบหก


13

ยกตัวอย่างเช่นแผนที่ฐานสิบหกขนาดใหญ่ (X โดย Y) ฉันจะแบ่งออกเป็นภูมิภาค N ของฐานสิบหกที่เชื่อมต่อกันเพื่อจำลองประเทศได้อย่างไร

เป้าหมายคือการสร้างแผนที่ฐานสิบหกที่ดูเหมือนแผนที่ชีวิตจริงกับประเทศที่มีรูปร่างแตกต่างกัน แต่มีขนาดเท่ากัน

คำตอบ:


13

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

  1. เรียงลำดับแผนที่ด้วย hexes ว่างเพื่อเริ่มต้น
  2. เลือกN hexes โดยการสุ่ม สิ่งเหล่านี้จะแสดงถึง "ศูนย์กลางของมวล" สำหรับแต่ละประเทศ
  3. แท็กแต่ละ hex ด้วยจุดศูนย์กลางตรงกลางซึ่งอยู่ใกล้ที่สุด ( Voronoi Diagram ) Country iคือชุดของ hexes ทั้งหมดที่อยู่ใกล้กับi'th center hex
  4. คำนวณศูนย์กลางมวลใหม่สำหรับแต่ละประเทศ
  5. ทำซ้ำขั้นตอนที่ 3 และ 4 หลาย ๆ ครั้งตามที่คุณต้องการทำให้ภูมิภาคที่สร้างราบรื่นขึ้น

คุณไม่ต้องวิ่งนานนักเพื่อสร้างแผนที่ที่สวยงาม ตัวอย่างนี้ต้องการการทำซ้ำสามครั้งเท่านั้น


ดีมากและ +1 สำหรับการเป็นตัวอย่างโดยเฉพาะ แต่ฉันกังวลเล็กน้อยว่านี่เป็นเรื่องธรรมดาเกินไป ! ที่กล่าวว่าผลลัพธ์จะดูงดงามโดยเฉพาะอย่างยิ่งในระดับนั้นและมันก็เป็นวิธีที่ดีในการเพาะวิธีอื่น ๆ
Steven Stadnicki

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

3

วิธีง่ายๆในการลอง

  1. สุ่มเลือกnเลขฐานสิบหก แต่ละคนจะเริ่มกลุ่ม
  2. สำหรับแต่ละกลุ่มพยายามที่จะขยายฐานสิบหกเริ่มต้นในทิศทางที่สุ่ม
  3. หากเลขฐานสิบหกทั้งหมดรอบฐานสิบหกที่เลือกไว้ครอบครองทำเครื่องหมายว่าแตะแล้วเปลี่ยนฐานสิบหก
  4. ทำซ้ำจนกว่าแต่ละกลุ่มจะมีความยาว 20 ฐานสิบหกหรือไม่มีพื้นที่ว่างที่จะขยาย (เคาะเป็นฐานสิบหกทั้งหมด)

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


นอกจากนี้ยังไม่เกี่ยวข้องกับปัญหานี้ แต่มีประโยชน์อย่างมากในการทำงานกับ hexes โปรดไปที่หน้านี้: http://www.redblobgames.com/grids/hexagons/#basics
มันรวมข้อมูลเลขฐานสิบหกทั้งหมดไว้ในที่เดียวด้วย ภาพที่ดี


ควรรวมถึงกลไกสำหรับกลุ่ม A เพื่อมอบโหนดให้กับกลุ่ม B หากกลุ่ม B เชื่อมโยงกลุ่ม A และไม่มีที่อื่นเลย ตราบใดที่กลุ่ม A มีพื้นที่ว่างที่จะขยายเข้าไปแทนที่โหนดที่หายไป จากนั้นไม่สำคัญว่าจะเริ่มจากตรงไหน ตั้งแต่นี้ทำหน้าที่เหมือน "ถอย"
MichaelHouse

ฉันคิดว่าบางทีการเริ่มต้นประเทศในแต่ละครั้งก่อตัวเป็นกลุ่มมุมก่อนจากนั้นคนขอบจะให้สิ่งที่ฉันต้องการ ฉันจะลองเมื่อฉันกลับถึงบ้าน
MadCatPT

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

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

@amitp หาก OP คาดว่าจะมีการพิจารณาปัจจัยเหล่านั้นเขาอาจจะกล่าวถึงพวกเขา ฉันไม่คิดว่าจะทำงานภายใน premisses ดั้งเดิม
petervaz

2

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

ฉันขอแนะนำให้เลือกจุดและย้ายออกไปจากด้านบนของหัวหยิบไพ่แบบสุ่มใน "ประเทศที่กำลังเติบโต" ซึ่งมีแผ่นต่อเนื่องที่ไม่ใช่ส่วนหนึ่งของประเทศ

รูปแบบกลยุทธ์สามารถใช้เพื่อเปลี่ยนอัลกอริทึมขึ้นอยู่กับประเภทของประเทศที่คุณต้องการ http://en.wikipedia.org/wiki/Strategy_pattern คุณต้องการประเทศที่มีชายฝั่งที่บางเฉียบเหมือนชิลีหรือไม่ หรือคุณต้องการบางสิ่งบางอย่างที่เป็นรอบมากขึ้นและมีอยู่?

คุณสมบัติกราฟอาจช่วยให้คุณปรับแต่งสิ่งที่คุณต้องการให้ "ประเทศ" ปลายทางมีลักษณะดังนี้: http://en.wikipedia.org/wiki/Eccentricity_(graph_theory)

ต้องการประเทศใหญ่หรือไม่ ปรับแต่งคุณสมบัติของกราฟและบังคับให้ประเทศที่สร้าง (ซึ่งเป็นเพียงกราฟ) เพื่อให้มีคุณสมบัติที่ให้ "รูปลักษณ์" ที่คุณต้องการ

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


2

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

วิธีการเริ่มต้นของฉันสำหรับปัญหานี้คือ 'วิวัฒนาการ' (แทนที่จะเป็น 'เติบโต') ภูมิภาคของคุณ:

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

ตอนนี้ตราบเท่าที่คุณต้องการเรียกใช้ pseudocode ต่อไปนี้:

Pick a random hex A from the boundary list;
Pick a random neighbor B of this hex from a different country;
if (A's country has more hexes than B's country has) {
  change hex A to belong to B's country;
} else if (B's country has more hexes than A's country has) {
  change hex B to belong to A's country;
} else {
  flip a coin to decide which to change;
}
if ( the changed hex's old country has become disconnected ) {
  undo and reject this move;
} else {
  update the boundary list around the changed hex and its neighbors;
}

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

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

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

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