द्वीप पर प्रक्रियात्मक रूप से क्षेत्र उत्पन्न करते हैं


29

वर्तमान में मेरे पास ऐसे द्वीप हैं जो इस तरह दिखते हैं:

द्वीप

और मैं इसे इस तरह से क्षेत्रों में उप-विभाजित करना चाहता हूं:

क्षेत्रों के साथ द्वीप

क्या एल्गोरिथ्म मैं क्या देख रहा हूँ? क्या आपके पास नीचे के चित्र की तरह सुसंगत क्षेत्र बनाने के बारे में सुझाव हैं। आपकी मदद की सराहना की है।


पहली बार में आपको उस द्वीप की छवि कैसे मिली? क्या आपने इसे उत्पन्न किया, और यदि हां, तो आपने इसे कैसे प्राप्त किया?
वेलनकोर्ट

मुझे यह एक ऑनलाइन मैप जनरेटर से मिला है।
डोमिसिन

मेरे उत्तर को अपडेट करने में देरी के लिए खेद है - मूल योजना की तुलना में घर आने में अधिक समय लगा। मैंने कुछ चित्र और लिंक जोड़े।
पिकालेक

यदि आपको यह एक ऑनलाइन जनरेटर से मिला है, तो आपको अज़गर के काल्पनिक मानचित्र जनरेटर को देखना चाहिए । इसमें कस्टमाइज़ेबल मापदंडों के साथ क्षेत्र और नाम हैं, और WB.SE हेलो कहता है। यह एक गीथब है, इसलिए आप उनके कोड की जांच करने में सक्षम हो सकते हैं।
एनोप्लेक्सियन -

जवाबों:


40

वास्तविक दुनिया में, वे प्रांतीय सीमाएं अक्सर नदियों की तरह भूगर्भीय सुविधाओं का अनुसरण कर रही होंगी।

तो शायद एक अच्छा दृष्टिकोण द्वीप के भूविज्ञान को मॉडल करना होगा और सीमाएं इस से बाहर गिरेंगी?

Red Blob Games के इस विषय पर कुछ अच्छे लेख हैं, जिनमें अच्छे परिणाम हैं।

उनका दृष्टिकोण वोरोनोई टेसेलेशन का उपयोग करना शामिल है , और नदियों को कोशिकाओं के बीच की सीमाओं के रूप में परिभाषित करता है।

अपनी साइट पर अन्य लेख देखें, उन्होंने मानचित्र निर्माण के विषय पर बहुत कुछ लिखा है ।

द्वीप


3
ध्यान दें कि वास्तविक दुनिया में, राजनीतिक या प्रशासनिक विभाजनों में कभी-कभी मनमाने विभाजन भी होते हैं, आमतौर पर सीधी रेखाएँ (जैसे अक्षांश / अनुदैर्ध्य रेखाएँ, पर्वत चोटियों के बीच की रेखाएँ आदि)।
पाब्लो एच

2
@ पाब्लोह अच्छी बात है, हालांकि सीधी सीमाएं बाद के मीडिया औपनिवेशिक युग की घटना लगती हैं। लेकिन जब से हम ओपी समस्या की सेटिंग नहीं जानते हैं, यह प्रासंगिक हो सकता है
संतरी

27

मैं वोरोनोई आरेख के दो पास के साथ इस समस्या को हल करूंगा:

प्रथम पास: क्षेत्र विभाजन

पहला पास कुछ हद तक अंकों के वितरण का उपयोग करेगा (यानी अंकों के बीच की दूरी अपेक्षाकृत बड़ी होनी चाहिए) ताकि द्वीप को क्षेत्रों में विभाजित किया जा सके (बिंदु पीढ़ी के बारे में नीचे नोट देखें)। अगला इन बिंदुओं के आधार पर एक वोरोनोई आरेख उत्पन्न करता है। यह द्वीप को नीचे दिखाए गए अनुसार प्रत्येक बिंदु के चारों ओर बहुभुज क्षेत्रों में विभाजित करेगा:

यहाँ छवि विवरण दर्ज करें

दूसरा पास: बॉर्डर रेंडमाइजेशन

अब जब द्वीप को क्षेत्रों में विभाजित कर दिया गया है, तो अगला कदम उनके बीच की सीमाओं को 'मोटा' करना है। ऐसा करने के लिए, अंकों की एक अधिक कॉम्पैक्ट वितरण का उपयोग करके बिंदुओं की एक नई परत उत्पन्न करें (यानी अंकों के बीच की दूरी छोटी होनी चाहिए) और फिर से इन बिंदुओं का उपयोग करके एक और वोरोनोई आरेख बनाएं। प्रत्येक छोटे क्षेत्र के लिए, इसके 'बीज' बिंदु की जाँच करके इसे बड़े क्षेत्र में असाइन करें। यह बड़े उपखंडों के बीच अधिक दांतेदार सीमाओं के परिणामस्वरूप होगा। यहां वोरोनोई आरेखों के साथ जैसा दिखता है, उसका करीब से जाना जाता है:

यहाँ छवि विवरण दर्ज करें

और यहाँ वही क्षेत्र है जो केवल अंतिम सीमा दिखा रहा है:

यहाँ छवि विवरण दर्ज करें

प्वाइंट जनरेशन पर टिप्पणियाँ

पॉइंट जनरेशन के बारे में, मुझे पॉइज़न डिस्क डिस्ट्रीब्यूशन का उपयोग करना पसंद है, ताकि पॉइंट्स का अपेक्षाकृत अच्छा और समान वितरण हो सके। अन्य समान विकल्प यह है कि समान रूप से समान वितरण प्राप्त करने के लिए 'नियमित' यादृच्छिक बिंदुओं के सेट पर लॉयड के एल्गोरिथ्म का उपयोग किया जाए । LLoyd को कोड करना आसान है, लेकिन वांछित परिणाम देने के लिए कितने पास आवश्यक हैं, यह निर्धारित करने के लिए कुछ परीक्षण और त्रुटि ले सकते हैं।

इस दृष्टिकोण के साथ एक संभावित समस्या यह है कि पहला पास विभाजन कुछ बहुत छोटे क्षेत्र उत्पन्न कर सकता है। यदि आप उन्हें अपने अंतिम परिणाम में नहीं चाहते हैं, तो मैं उन्हें एक यादृच्छिक आसन्न क्षेत्र के साथ मिला दूंगा।

अंतिम नोट्स

मेरे द्वारा प्रदान किए गए चित्र रेखापुंज चित्र होते हैं, लेकिन यह तकनीक बहुभुज / वेक्टर अभ्यावेदन के साथ भी काम करती है।


1
प्रक्रियात्मक मंजिल की योजना के लिए मैं यही करता हूं, क्षेत्र (द्वीप) के अंदर के बिंदुओं से एक वोरोनोई आरेख बनाता हूं, एक ग्रिड का निर्माण करता हूं (यह आपके आयताकार होने की जरूरत नहीं है, आपके मामले के लिए एक विकृत ग्रिड) जो उसी क्षेत्र को घेरता है। फिर ग्रिड और वोरोनोई के बूलियन चौराहों की गणना करें, क्षेत्रों की गणना करें और सबसे छोटे ग्रिड सेल के 0.6 प्रतिशत के अनुसार एक डेटा ट्री (सूची, दांतेदार सरणी, आदि ... जो भी डेटा संरचना पसंद करते हैं) को असाइन करें। आपको कुछ लापता कोशिकाएँ मिलेंगी, लेकिन आप अपने पेड़ को खोजने और पुन: सौंपने के लिए मूल के साथ अपनी कुटी हुई ग्रिड की तुलना कर सकते हैं।
फेलिप गुटिरेज

आपने चित्र जोड़े! यह बिल्कुल वही है जो मैं एक अलग उद्देश्य के लिए कर रहा हूं
फेलिप गुटिरेज

4

MineCraft यह अच्छी तरह से करता है, और इसकी विश्व पीढ़ी के एल्गोरिथ्म का विश्लेषण और अच्छी तरह से प्रलेखित किया गया है।

एल्गोरिथ्म के विभिन्न विवरण हैं, उनमें से एक यहाँ: https://github.com/UnognShadow200/ClassiCube/wiki/Minecraft-Classic-map-generation-algorithm

एल्गोरिथ्म का मूल एक पर्लिन शोर जनरेटर है । यह सीधे ऊंचाई को नियंत्रित करता है (कम या ज्यादा, गुफाओं को तराशने के बाद के चरण के रूप में अच्छी तरह से सतह को बदल सकता है), साथ ही साथ बायोम पीढ़ी भी। बायोम जनरेटर की तरह कुछ है जो आप अपने क्षेत्रों को बनाने के लिए उपयोग करना चाहते हैं।

(इसका एक पुराना संस्करण) प्रलेखित है , मूल रूप से यह दो अलग-अलग पेरलिन शोर जनरेटर का उपयोग करके काम करता है, "तापमान" के लिए एक, "वर्षा" के लिए एक, फिर उन दो में से बायोम का चयन करना। स्वयं चर (तापमान और वर्षा) वास्तव में खेल में बाद में उपयोग नहीं किए जाते हैं; उदाहरण के लिए, रेगिस्तान में बारिश नहीं होती है, लेकिन खेल इसे "रेगिस्तान" संपत्ति से निर्धारित करता है, मूल वर्षा मूल्य से नहीं।

यादृच्छिक बीज से एक बायोम मानचित्र बनाने के लिए विभिन्न ऑनलाइन उपकरण हैं, उनमें से एक है mineatlas.com । मुझे लगता है कि, आंतरिक रूप से, वे एक जावा सर्वर का उपयोग करते हैं जो कि माइनक्राफ्ट की आंतरिक कक्षाओं का उपयोग करता है; मुझे नहीं पता कि उनका कोई सोर्स कोड सीधे उपलब्ध है या नहीं।


4

एक विशिष्ट एल्गोरिथ्म का उपयोग किया जाता है, उदाहरण के लिए, अज़गर ( स्रोत कोड ) द्वारा। लगभग इस तरह है:

  1. अपने भूमाफिया को छोटे क्षेत्रों में विभाजित करें, जैसे डेलॉना ट्राइग्यूलेशन या वोरोनोई कोशिकाओं के माध्यम से।
  2. अपनी संस्कृतियों, स्थानों, धर्मों या जो भी आप अनुकरण करना चाहते हैं, उनके लिए स्थान (बेतरतीब ढंग से या अन्यथा) "शुरू" करें।
  3. निर्धारित करें (बेतरतीब ढंग से या अन्यथा) उनमें से प्रत्येक के लिए एक "विकास कारक"। आपके पास विकास के कारकों में जितना अधिक अंतर होगा, उतना ही कम आपका अंतिम नक्शा होगा।
  4. अब अपने स्थानों (इत्यादि) पर पुनरावृति करें और, विकास कारक के आधार पर, उन्हें पूरे नक्शे को भरने तक आसपास की, खाली टाइलों में फैला दें।
  5. आप शायद उन सीमाओं को थोड़ा सीधा करना चाहते हैं, जो उन कोशिकाओं को स्विच करके हैं जिनके पास अपने रंग में केवल एक पड़ोसी है और अन्यथा उस रंग से अलग है।

3

यदि आप रेखापुंज-आधारित दृष्टिकोणों के बजाय सदिश प्रारूप में ऐसा करने में रुचि रखते हैं, तो मैंने कुछ समय पहले एक ब्लॉग पोस्ट लिखी है, जो वास्तव में बहुत सटीक है।

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

विचार यह है कि आप एक जाल (आमतौर पर आधारित वोरोनोई) से शुरू करते हैं और क्षेत्रों को बेतरतीब ढंग से अंकुरित क्षेत्रों से बढ़ाते हैं जो पर्याप्त रूप से अलग होते हैं।


2

क्या मजेदार सवाल :) यह दृष्टिकोण वोर्नोई कोशिकाओं पर आधारित है, लेकिन दूरी मीट्रिक काफी यूक्लिडियन नहीं है (मैंने 2.0 की बजाय 1.5 की शक्ति का उपयोग किया) और इसमें कुछ यादृच्छिकता है। यह पानी पर कूद सकता है जो आदर्श नहीं है।

अधिक दिलचस्प आकार प्राप्त करने के लिए आसपास के क्षेत्रों को एक साथ मिलाया जा सकता है, यहां मैं इसे निर्धारित करने के लिए एन निकटतम पड़ोसियों का उपयोग करता हूं।

यदि आप रुचि रखते हैं तो मैं और अधिक विवरण में जा सकता हूं और पायथन कोड साझा कर सकता हूं।

नक्शा 1 नक्शा 2

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.