एल-सिस्टम का उपयोग शहरों को प्रक्रियात्मक रूप से उत्पन्न करने के लिए


10

मैं वर्तमान में एक ऐप बना रहा हूं जो प्रक्रियागत रूप से उत्पन्न सामग्री पर बहुत अधिक ध्यान केंद्रित करता है। अब तक, मैंने सिम्पलेक्स शोर का उपयोग करके भूभाग की प्रक्रियात्मक पीढ़ी और मानचित्र के आकार को सफलतापूर्वक लागू किया है। मैं वास्तव में प्रसन्न हूं कि यह कैसा दिखता है। अब मैं शहरों के लिए भी यही करने की कोशिश कर रहा हूं। मुझे बस सड़कों और इमारतों का 2 डी लेआउट तैयार करना होगा। मैंने इसे देखा है और ऐसा लगता है कि ज्यादातर लोग एल-सिस्टम का उपयोग करने का सुझाव देते हैं। हालाँकि मैं उनके चारों ओर अपना सिर लपेटने के लिए प्रतीत नहीं हो सकता। मुझे अवधारणा मिलती है, लेकिन कोड में कार्यान्वयन नहीं। क्या किसी के पास प्रक्रियात्मक रूप से निर्मित शहरों के लिए एल-सिस्टम का कोई कोड उदाहरण है, या शहरों को संभालने के अन्य तरीकों पर सुझाव हैं?




जिस तरह से मैंने कुछ ऐसा ही किया था वह चौराहों का प्रतिनिधित्व करने वाले नोड्स का एक ग्रिड बनाने के लिए था, फिर आसन्न नोड्स को यादृच्छिक रूप से कनेक्ट करें। एक भूलभुलैया की तरह लेआउट के लिए बनाता है, लेकिन सड़कों पर सभी जुड़े हुए नहीं हैं, इसलिए वास्तव में इसे नेविगेट करना संभव नहीं है।
15:13 पर user137

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

जवाबों:


20

एल-सिस्टम , जो मैं * बता सकता हूं, से व्याकरण जैसे प्रतिस्थापन नियमों का एक सेट है जिसे आप दिलचस्प, "जैविक" परिणाम प्राप्त करने के लिए पुनरावर्ती रूप से लागू कर सकते हैं।

पौधे वे हैं जहां एल-सिस्टम का उपयोग अक्सर किया जाता है, क्योंकि वे बहुत अधिक पुनरावर्ती विकास दिखाते हैं (यानी शाखा अधिक शाखाओं में बंट जाती है)। एक साधारण उदाहरण के लिए, मैं एक "लॉलीपॉप" पेड़ दिखाऊंगा जो L-System के उपयोग से उत्पन्न होता है:

variables : | o              (these are the things that will grow)
start  : o
         |                   (this is what we start with)
rules  : (o  o   o)         (these are the substitution rules that we apply
               \ /            one step at a time)

इसलिए पीढ़ी 1 में, हमारे पास बस शुरुआत है:

o
|

पीढ़ी 2 में, हम प्रत्येक नियम का पालन करते हैं और मौजूदा भागों को नियमों के अनुसार प्रतिस्थापित करते हैं। हम "गेंदों" को "दो-छड़ें और गेंदों" से बदलते हैं:

o   o
 \ /
  |

पीढ़ी 3:

o o   o o
 \|   |/
   \ /
    |

जल्द ही हमारे पास एक सुंदर (भद्दा) बड़ा पेड़ होगा!

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

रिकर्सिवली:

tree = start
grow(tree, start)

func grow(tree, part)
    if this part of the tree is big enough
        stop
    if part is 'o'
        replace part with 'o\/o'
        grow(tree, the left 'o')
        grow(tree, the right 'o')

iteratively:

tree = start
for a number of iterations
    for each part in tree
        if part is 'o':
            replace with 'o\/o'

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

variables: block_vertical block_horizontal road_vertical road_horizontal
start: block_vertical
rules: (block_vertical  block_horizontal road_vertical block_horizontal)
       (block_horizontal  block_vertical road_horizontal block_vertical)

यह एक मिनट में समझ में आएगा।

जनरेशन 1:

+--------------------+
|                    |
|                    |
|                    |
|        V           |
|                    |
|                    |
|                    |
+--------------------+

एक एकल, उबाऊ ऊर्ध्वाधर ब्लॉक। (V ऊर्ध्वाधर के लिए खड़ा है।)

जनरेशन 2: हम वर्टिकल ब्लॉक को हॉरिजॉन्टल ब्लॉक के साथ बीच में वर्टिकल रोड से रिप्लेस करते हैं

+--------------------+
|       r            |
|       r            |
|       r            |
|   H   r      H     |
|       r            |
|       r            |
|       r            |
+--------------------+

सड़क के लिए खड़ा है! मैं बेतरतीब ढंग से विभाजन को समाप्त कर चुका हूं, हम पीसीजी में नियमित भागों को उबाऊ नहीं करना चाहते हैं।

पीढ़ी 3: हम क्षैतिज ब्लॉकों को क्षैतिज सड़कों के साथ विभाजित किए गए ऊर्ध्वाधर ब्लॉकों से बदलते हैं। मौजूदा सड़कें रहती हैं; उनके लिए कोई नियम नहीं हैं।

+--------------------+
|   V   r            |
|       r            |
|rrrrrrrr            |
|       r      V     |
|   V   r            |
|       rrrrrrrrrrrrr|
|       r      V     |
+--------------------+

ध्यान दें कि सड़कें एक दूसरे से कैसे जुड़ती हैं, जो अच्छा है। इस पर्याप्त समय को दोहराएं और आप कुछ इस तरह से समाप्त करेंगे ( एक संबंधित उत्तर को काट दिया गया ):

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

ध्यान दें कि बहुत सारे विवरण हैं जिन्हें मैंने कवर नहीं किया है, और यह परिणाम "स्पष्ट" उत्पन्न होता है - वास्तविक शहर कुछ अलग दिखते हैं। यही पीसीजी को मज़ेदार / कठिन बनाता है। ऐसी अंतहीन चीजें हैं जो आप अपने परिणामों को बनाने और सुधारने के लिए कर सकते हैं, लेकिन एल-सिस्टम से असंबंधित होने के कारण, मैं इस उत्तर को यहां छोड़ दूंगा; आशा है कि यह आपको आरंभ करने में मदद करता है।

* - मैंने औपचारिक रूप से एल-सिस्टम का अध्ययन नहीं किया है, हालांकि मैंने विशिष्ट प्रकार जैसे व्याकरण और पीसीजी वनस्पति का सामना किया है; कृपया मुझे सही करें अगर मुझे कोई परिभाषा या अवधारणा गलत मिलती है


1

@congusbongus उत्तर उत्कृष्ट है, मुझे कुछ चीजें जोड़ने दें।

ब्लॉक को उन सभी सड़कों के अनुसार निर्माण क्षेत्रों में विभाजित करने की आवश्यकता है जो उन्हें सीमा देते हैं। जब आपके पास चारों ओर सड़क है, तो समग्र पैटर्न एक अंगूठी है। इस लिंक को उदाहरण के लिए देखें: http://oldurbanist.blogspot.fr/2012/01/city-blocks-spaces-in-between.html

(घनत्व के आधार पर, रिंग सेंटर में कोई स्थान नहीं हो सकता है, कॉव्लून देखें)।

एक बार जब आप ब्लॉक कर लेते हैं, तो आपको इमारतों को बनाने की आवश्यकता होती है। वे थोड़े पेचीदा हैं और एक दो पास पीढ़ी की आवश्यकता है। वे आंशिक रूप से अन्योन्याश्रित हैं: आपके जनरेटर को एक खिड़की नहीं बनानी चाहिए जो अगली इमारत की तरफ की दीवार के सामने हो।

और इससे जीवन को जोड़ने के लिए, आप इस इलाके की तरह वातावरण के साथ पीढ़ी को प्रभावित करना चाह सकते हैं या आर्थिक नक्शा: सड़कें (सैन फ्रांसिस्को को छोड़कर) बड़ी पहाड़ियों के चारों ओर जाने के बजाय सीधे जाती हैं और घरों के प्रकार भारी हैं वे जिस शहर में हैं, उससे प्रभावित हैं।

मज़े करो।

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