एल-सिस्टम , जो मैं * बता सकता हूं, से व्याकरण जैसे प्रतिस्थापन नियमों का एक सेट है जिसे आप दिलचस्प, "जैविक" परिणाम प्राप्त करने के लिए पुनरावर्ती रूप से लागू कर सकते हैं।
पौधे वे हैं जहां एल-सिस्टम का उपयोग अक्सर किया जाता है, क्योंकि वे बहुत अधिक पुनरावर्ती विकास दिखाते हैं (यानी शाखा अधिक शाखाओं में बंट जाती है)। एक साधारण उदाहरण के लिए, मैं एक "लॉलीपॉप" पेड़ दिखाऊंगा जो 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 |
+--------------------+
ध्यान दें कि सड़कें एक दूसरे से कैसे जुड़ती हैं, जो अच्छा है। इस पर्याप्त समय को दोहराएं और आप कुछ इस तरह से समाप्त करेंगे ( एक संबंधित उत्तर को काट दिया गया ):
ध्यान दें कि बहुत सारे विवरण हैं जिन्हें मैंने कवर नहीं किया है, और यह परिणाम "स्पष्ट" उत्पन्न होता है - वास्तविक शहर कुछ अलग दिखते हैं। यही पीसीजी को मज़ेदार / कठिन बनाता है। ऐसी अंतहीन चीजें हैं जो आप अपने परिणामों को बनाने और सुधारने के लिए कर सकते हैं, लेकिन एल-सिस्टम से असंबंधित होने के कारण, मैं इस उत्तर को यहां छोड़ दूंगा; आशा है कि यह आपको आरंभ करने में मदद करता है।
* - मैंने औपचारिक रूप से एल-सिस्टम का अध्ययन नहीं किया है, हालांकि मैंने विशिष्ट प्रकार जैसे व्याकरण और पीसीजी वनस्पति का सामना किया है; कृपया मुझे सही करें अगर मुझे कोई परिभाषा या अवधारणा गलत मिलती है