रैंडम मैप जेनरेशन - रैंडम नोड्स को बिखरने / क्लस्टर करने की रणनीतियां


10

मैं अंतरिक्ष में एक सरल 4X रणनीति खेल कर रहा हूं जहां प्रत्येक नोड एक बिंदु-ब्याज (एक ग्रह, एक क्षुद्रग्रह और आदि) है।

बेतरतीब ढंग से एक नक्शा बनाने के लिए, मैं नीचे दिए गए चरणों का पालन करूंगा

  1. तय करें कि नक्शे में कितने प्रकार के नोड होंगे (शायद, कहते हैं, 5 पृथ्वी जैसे ग्रह, 10 बंजर ग्रह आदि)।

  2. मानचित्र पर प्रत्येक प्रकार के नोड रखें।

चरण 2 के लिए मैं प्रत्येक नोड प्रकार का एक समान प्रसार करना चाहता हूं। इसलिए उदाहरण के लिए, मैं पृथ्वी के सभी ग्रहों को रखकर शुरू करूंगा। यदि मैं स्थिति का निर्धारण करने के लिए बस एक रैंड (map.width, map.height) करता हूं, तो मैं सभी पृथ्वी जैसे ग्रहों को एक साथ जोड़ सकता हूं, जो उस क्षेत्र में शुरू होने वाले खिलाड़ी को लाभ देगा।

क्या कोई विधि हैं, जैसे कि विभिन्न ग्राफ़ फ़ंक्शंस या शोर फ़ंक्शन का उपयोग करना, जो (x, y) निर्देशांक का एक क्रम उत्पन्न कर सकते हैं जो एक दूसरे से फैले हुए हैं। इसी तरह, क्या निर्देशांक उत्पन्न करने के लिए कोई तरीका है जो एक दूसरे के करीब हैं?


1
कृपया स्वीकार किए गए उत्तर को चिह्नित करें, चाहे वह मेरा हो या किसी और का। धन्यवाद।
इंजीनियर 18

जवाबों:


8

आप जिस समस्या का सामना कर रहे हैं, वह यह है कि यादृच्छिक चयन भेदभाव नहीं करता है, और इसका मतलब यह हो सकता है कि यह आपको क्या करने की आवश्यकता के लिए कम से कम आदर्श फिट है। लेकिन, इसके आसपास काम करने का कम से कम एक आसान तरीका है:

  1. अपने स्थान को सेक्टरों में विभाजित करें (जैसे, यदि आपके पास 100 से 100 का क्षेत्र है, और आपको इनमें से 100 सौर मंडल उत्पन्न करने की आवश्यकता है, तो अपने क्षेत्र को 10 से 10 ग्रिड के क्षेत्रों में विभाजित करें)

  2. प्रत्येक सेक्टर के माध्यम से लूप करें और चरण 3 को दोहराएं (जो बदले में, चरण 4 को कई बार दोहराएगा)

  3. वर्तमान सौर प्रणाली के लिए ग्रहों की संख्या को यादृच्छिक रूप से निर्धारित करें (उदाहरण के लिए, 3 से 7 ग्रहों की श्रेणी के लिए, बस वर्तमान क्षेत्र में 0 से 4 तक एक यादृच्छिक संख्या प्राप्त करें, और 3 जोड़ें) (यदि आपके पास एक से अधिक सौर हैं एक क्षेत्र में प्रणाली, यह वह जगह है जहाँ आप एक और लूप स्थापित करेंगे)

  4. अपने लूप द्वारा पहचाने गए वर्तमान सौर मंडल के भीतर अपने ग्रहों को बेतरतीब ढंग से असाइन करें (आप ग्रहों के बीच न्यूनतम दूरी बढ़ाने के लिए यादृच्छिक संख्याओं का भी उपयोग कर सकते हैं); यह वह जगह है जहां आप ग्रहों के प्रकार तय करेंगे, जो विभिन्न प्रकार के वजन या जिस भी विधि का आप उपयोग करना चाहते हैं, के साथ यादृच्छिक रूप से निर्धारित किया जा सकता है

आप पड़ोसी क्षेत्रों के ग्रहों को एक-दूसरे के साथ सीधे संपर्क बनाने से रोकने के लिए प्रत्येक क्षेत्र के किनारे पर "सीमा के बाहर" क्षेत्र को परिभाषित करने की इच्छा कर सकते हैं (बस मामले में वे प्रभावी रूप से बेतरतीब ढंग से साइड-बाय-साइड थे), या। ..

एक और समाधान प्रत्येक सौर मंडल और / या प्रत्येक ग्रह के स्थान को तय करने के बिंदु पर हो सकता है, बस पड़ोसी क्षेत्रों के खिलाफ एक त्वरित निकटता की जांच चलाने और तदनुसार समायोजित करने के लिए (उदाहरण के लिए, न्यूनतम दूरी से किनारे से दूर एक यादृच्छिक दूरी) )।


आपका स्वागत है! और +1 ने आपकी समस्या को हल करने के बारे में कुछ अनुवर्ती पोस्ट करने के लिए। =)
रैंडॉल्फ रिचर्डसन

8

वितरण को सुनिश्चित करने का सबसे अच्छा तरीका यह है कि प्रत्येक नोड को एक प्रकार का भौतिक कण माना जाए। पहले एक स्थिर (फ्लोटिंग पॉइंट) एक्स प्लेन पर एक यादृच्छिक वितरण करें। विमान पर व्यक्तिगत कणों के प्रत्येक विशिष्ट जोड़े के बीच प्रतिकर्षण की शक्तियों को लागू करने से, आप पाएंगे कि वे धीरे-धीरे फैल गए हैं। एक मायने में यह टकराव के संकल्प की तरह है, केवल बोलने के लिए कोई वास्तविक संपर्क नहीं है। फिर उस प्लेन (इसे "rasterize") को एक पूर्णांक-अनुक्रमित ग्रिड में परिवर्तित करना एक साधारण मामला है। आप इसे एक पूर्णांक-अनुक्रमित ग्रिड से शुरू करने के लिए कर सकते हैं, लेकिन चीजों को "अच्छा" प्राप्त करना थोड़ा अधिक कठिन हो सकता है - यह इस बात पर निर्भर करता है कि आपके ग्रिड का रिज़ॉल्यूशन कितना उच्च है ... उच्चतर, बेहतर , इस मामले में।

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

जब आप विपरीत को सुनिश्चित करना चाहते हैं, यानी कि क्लस्टरिंग होता है, तो "मानक" या "गॉसियन" वितरण देखें। यही कारण है कि बेतरतीब ढंग से उत्पन्न स्टारफील्ड्स अक्सर नकली लगते हैं; वे अधिक प्राकृतिक वितरण मॉडल के बजाय शुद्ध यादृच्छिक वितरण का उपयोग करते हैं।


1
आप "भौतिकी" मॉडल से क्लस्टरिंग व्यवहार भी प्राप्त कर सकते हैं, आपको बस एक अलग नियम का उपयोग करना होगा, संभवतः आकर्षण और प्रतिकर्षण के मिश्रण का उपयोग करना। विकल्प अंतहीन हैं, सभी को एक सही मॉडल ढूंढना है।
आआआआआआआआआआआआ आआआआआआआआआआ

6

आप "ब्लू शोर" वितरण प्राप्त करने के लिए एक साधारण पॉइसन-डिस्क वितरण एल्गोरिथ्म का उपयोग कर सकते हैं । इससे विमान के उन बिंदुओं का पता चलता है जो लगभग एक दूसरे से अलग होते हैं। यह न केवल आपके 2D उदाहरण में, बल्कि 3D में भी और नॉन-यूक्लिडियन रिक्त स्थान में भी काम करता है, लेकिन गणना जल्दी से अस्पष्ट हो सकती है।

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

एक तेज और सुरुचिपूर्ण विकल्प2 डी पीढ़ी के शोर के लिए एल्गोरिदम, साथ ही इसके गुणों की एक छोटी चर्चा, यूनिवर्सिटी के डैनियल डनबर और ग्रेग हम्फिस द्वारा " फास्ट स्पिसन-डिस्क सैंपल जेनरेशन के लिए एक स्थानिक डेटा संरचना " में पाया जा सकता है। वर्जीनिया के।


2
कभी पोइसन-डिस्क वितरण के बारे में नहीं सुना था - अच्छा लिंक!
दस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.