ยกตัวอย่างเช่นแผนที่ฐานสิบหกขนาดใหญ่ (X โดย Y) ฉันจะแบ่งออกเป็นภูมิภาค N ของฐานสิบหกที่เชื่อมต่อกันเพื่อจำลองประเทศได้อย่างไร
เป้าหมายคือการสร้างแผนที่ฐานสิบหกที่ดูเหมือนแผนที่ชีวิตจริงกับประเทศที่มีรูปร่างแตกต่างกัน แต่มีขนาดเท่ากัน
ยกตัวอย่างเช่นแผนที่ฐานสิบหกขนาดใหญ่ (X โดย Y) ฉันจะแบ่งออกเป็นภูมิภาค N ของฐานสิบหกที่เชื่อมต่อกันเพื่อจำลองประเทศได้อย่างไร
เป้าหมายคือการสร้างแผนที่ฐานสิบหกที่ดูเหมือนแผนที่ชีวิตจริงกับประเทศที่มีรูปร่างแตกต่างกัน แต่มีขนาดเท่ากัน
คำตอบ:
คุณลองอัลกอริทึมของลอยด์แล้วหรือยัง? ขั้นตอนนั้นค่อนข้างง่ายและจะสร้างขอบเขตการค้นหาที่ค่อนข้างปกติ (ขึ้นอยู่กับจำนวนการวนซ้ำที่คุณเรียกใช้)
คุณไม่ต้องวิ่งนานนักเพื่อสร้างแผนที่ที่สวยงาม ตัวอย่างนี้ต้องการการทำซ้ำสามครั้งเท่านั้น
วิธีง่ายๆในการลอง
n
เลขฐานสิบหก แต่ละคนจะเริ่มกลุ่มฉันไม่ได้ทดสอบ แต่สิ่งนี้ควรสร้าง Islands และค่อนข้างจะหลีกเลี่ยงการจัดฟันที่ยาวมาก ๆ นอกจากนี้ส่วนใหญ่จะมีพรมแดนเพื่อนบ้าน แต่ไม่จำเป็นต้องแต่ละคนจะอยู่ในสัมผัสของอื่น ๆ n
ที่มีความหนาแน่นจะขึ้นอยู่กับค่าของ
บางกลุ่มอาจมีมุมของผู้อื่นและถึงขนาดน้อยกว่า 20 ขนาดคุณสามารถรับรองพื้นที่ปลูกโดยวางไข่ hexes เริ่มต้นในระยะห่างขั้นต่ำของกันและกัน
ทดสอบและปรับแต่งตามต้องการ
นอกจากนี้ยังไม่เกี่ยวข้องกับปัญหานี้ แต่มีประโยชน์อย่างมากในการทำงานกับ hexes โปรดไปที่หน้านี้: http://www.redblobgames.com/grids/hexagons/#basics
มันรวมข้อมูลเลขฐานสิบหกทั้งหมดไว้ในที่เดียวด้วย ภาพที่ดี
ฉันคิดว่าโครงสร้างกราฟบางประเภทจะทำให้สิ่งนี้เป็นจริงได้ สร้างขอบระหว่างโหนด Hex ทั้งสองโดยพื้นฐานหากอยู่ติดกันเพื่อจำลองแผนที่ทั้งหมด อย่างไรก็ตามฉันไม่แน่ใจว่าอัลกอริทึมที่แน่นอนสำหรับการสร้าง "ประเทศ" ในแผนที่นั้น ขึ้นอยู่กับว่าคุณต้องการให้ประเทศ "มอง" คุณจะต้องใช้อัลกอริทึมที่แตกต่างกัน
ฉันขอแนะนำให้เลือกจุดและย้ายออกไปจากด้านบนของหัวหยิบไพ่แบบสุ่มใน "ประเทศที่กำลังเติบโต" ซึ่งมีแผ่นต่อเนื่องที่ไม่ใช่ส่วนหนึ่งของประเทศ
รูปแบบกลยุทธ์สามารถใช้เพื่อเปลี่ยนอัลกอริทึมขึ้นอยู่กับประเภทของประเทศที่คุณต้องการ http://en.wikipedia.org/wiki/Strategy_pattern คุณต้องการประเทศที่มีชายฝั่งที่บางเฉียบเหมือนชิลีหรือไม่ หรือคุณต้องการบางสิ่งบางอย่างที่เป็นรอบมากขึ้นและมีอยู่?
คุณสมบัติกราฟอาจช่วยให้คุณปรับแต่งสิ่งที่คุณต้องการให้ "ประเทศ" ปลายทางมีลักษณะดังนี้: http://en.wikipedia.org/wiki/Eccentricity_(graph_theory)
ต้องการประเทศใหญ่หรือไม่ ปรับแต่งคุณสมบัติของกราฟและบังคับให้ประเทศที่สร้าง (ซึ่งเป็นเพียงกราฟ) เพื่อให้มีคุณสมบัติที่ให้ "รูปลักษณ์" ที่คุณต้องการ
สุดท้าย แต่ไม่ท้ายสุดกราฟจะมีประโยชน์อย่างมากสำหรับการกำหนดขอบเขตระหว่างประเทศ คุณสามารถสร้างกราฟที่มีการเชื่อมต่อระหว่างสองโหนดหากประเทศติดกัน สิ่งนี้อาจมีประโยชน์สำหรับการแบ่งพาร์ติชันบางประเภทในเกมของคุณและจะช่วยให้คุณสามารถปรับบางสิ่งบางอย่างให้เหมาะสมยิ่งขึ้นในการพัฒนา
หมายเหตุเล็ก ๆ หนึ่ง: คุณบอกว่า 'ดูเหมือนแผนที่ชีวิตจริงกับประเทศที่มีรูปร่างแตกต่างกัน แต่มีขนาดเท่ากัน) แต่ประเทศ' ของจริง 'มีขนาดแตกต่างกันอย่างมากแม้ในบางภูมิภาค - แม้แต่ประเทศ' ใหญ่ 'ในยุโรปอาจแตกต่างกันอย่างมาก ด้วยเช่นฝรั่งเศสมีขนาดใหญ่กว่าสองเท่าของอิตาลี จากที่กล่าวมามีพื้นที่การเล่นเกมที่เห็นได้ชัดเพื่อพยายามและรักษาขนาดโดยประมาณ - โปรดทราบว่าการเปลี่ยนแปลงเล็กน้อยที่นี่น่าจะเป็นสิ่งที่ดี !
วิธีการเริ่มต้นของฉันสำหรับปัญหานี้คือ 'วิวัฒนาการ' (แทนที่จะเป็น 'เติบโต') ภูมิภาคของคุณ:
ตอนนี้ตราบเท่าที่คุณต้องการเรียกใช้ 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 ที่เปลี่ยนแปลงจะยังคงอยู่ในขอบเขตเสมอและคุณสามารถตรวจสอบเพื่อนบ้านทั้งหกเพื่อดูว่ามีรายการใดกลายเป็นเซลล์เขตแดนหรือไม่เพราะเพื่อนบ้านอยู่ใน ประเทศอื่น) หรือหยุดเป็นเซลล์เขตแดน (เนื่องจากเพื่อนบ้านอยู่ในประเทศเดียวกันในขณะนี้) แก้ไขขอบเขตที่ต้องการ
สำหรับการปรับแต่งวิธีการนี้คุณยังสามารถกำหนดเงื่อนไขให้ฐานสิบหกเพื่อเปลี่ยนบิตแบบสุ่ม - แทนที่จะ 'สมดุล' ทั้งสองประเทศเสมอคุณสามารถทำการแลกเปลี่ยนด้วยความน่าจะเป็นที่แน่นอนและค่อย ๆ ลดความน่าจะเป็น เวลา (คล้ายกับกระบวนการทำความเย็นในอัลกอริทึมแบบจำลองการอบอ่อน ) เพื่อเริ่มบังคับให้ขนาดเท่ากัน
โปรดทราบว่าสิ่งนี้จะไม่รับประกันว่าพื้นที่ทั้งหมดจะมีขนาดเท่ากัน (ซึ่งเป็นไปไม่ได้ยกเว้นที่ไม่มีการแบ่งขนาดกริดของคุณอย่างสมบูรณ์) และมันจะไม่รับประกันว่าทุกประเทศจะอยู่ในฐานสิบหกของกันและกัน มันควรจะรับประกัน (ใช้สำหรับการทำซ้ำพอ) ว่าแต่ละประเทศจะไม่เกินหนึ่งหกเหลี่ยมขนาดใหญ่หรือขนาดเล็กกว่าแต่ละเพื่อนบ้านทันทีแม้ว่า