मैंने एक सिस्टम बनाया है जो आप 3 डी में हैं। मेरे पास एक छोटा सा वीडियो है जो यहां के सरल यांत्रिकी और यहां एक ब्लॉग पोस्ट को प्रदर्शित करता है ।
यहाँ मैं एक अदृश्य दीवार के पीछे दबाव यांत्रिकी से बना एक छोटा सा GIF है (उच्च गति पर खेला जाता है):
सिस्टम के कुछ फीचर्स का अंदाजा लगाने के लिए मुझे इसमें शामिल डेटा के बारे में बताएं। वर्तमान प्रणाली में, पानी के प्रत्येक ब्लॉक में 2 बाइट्स शामिल हैं:
//Data2 Data
//______________________________ _____________________________________
//|0 |0 |000 |000 | |0 |0 |000 |000 |
//|Extra|FlowOut|Active|Largest| |HasSource|IsSource|Direction|Height|
//------------------------------ -------------------------------------
Height
आपके दबाव के समान क्यूब में पानी की मात्रा है, लेकिन मेरे सिस्टम में सिर्फ 8 स्तर हैं।
Direction
दिशा प्रवाह है। यह तय करते समय कि पानी आगे कहां बहेगा, इसकी वर्तमान दिशा में जारी रहने की संभावना अधिक है। इसका उपयोग जरूरत पड़ने पर अपने स्रोत क्यूब तक एक प्रवाह को जल्दी से वापस करने के लिए भी किया जाता है।
IsSource
इंगित करता है कि क्या यह घन एक स्रोत घन है, जिसका अर्थ है कि यह कभी भी पानी से बाहर नहीं निकलता है। नदियों, झरनों, आदि के स्रोत के लिए उपयोग किया जाता है। ऊपर के जीआईएफ में बाईं ओर स्थित क्यूब एक स्रोत क्यूब है, उदाहरण के लिए।
HasSource
इंगित करता है कि क्या यह घन स्रोत क्यूब से जुड़ा है। जब एक स्रोत से जुड़ा होता है, तो क्यूब्स अन्य "फुलर" गैर-स्रोत क्यूब्स की मांग करने से पहले अधिक पानी के लिए स्रोत को टैप करने का प्रयास करेंगे।
Largest
इस क्यूब को बताता है कि इसके और इसके स्रोत क्यूब के बीच सबसे बड़ा प्रवाह क्या है। इसका मतलब है कि यदि पानी एक संकीर्ण खाई से बह रहा है, तो यह इस घन के प्रवाह को सीमित करता है।
Active
एक काउंटर है। जब इस घन में सक्रिय प्रवाह होता है, तो यह या उससे, सक्रिय हो जाता है। अन्यथा सक्रिय बेतरतीब ढंग से घटाया जाता है। एक बार सक्रिय हिट शून्य (जिसका अर्थ सक्रिय नहीं है), इस घन में पानी की मात्रा कम होने लगेगी। इस तरह के कृत्य वाष्पीकरण या जमीन में भिगोने जैसे कार्य करते हैं। ( यदि आपके पास प्रवाह है, तो आपको ईब होना चाहिए! )
FlowOut
इंगित करता है कि क्या यह घन एक घन से जुड़ा है जो दुनिया के किनारे पर है। एक बार जब दुनिया के किनारे पर एक रास्ता बनाया जाता है, तो पानी किसी भी अन्य जगह पर उस रास्ते को चुनता है।
Extra
भविष्य के उपयोग के लिए एक अतिरिक्त बिट है।
अब जब हम डेटा जानते हैं, तो एल्गोरिथ्म के एक उच्च स्तरीय अवलोकन को देखने की सुविधा देता है। सिस्टम का मूल विचार नीचे और बाहर बहने को प्राथमिकता देना है। जैसा कि मैंने वीडियो में बताया है, मैं नीचे से ऊपर तक काम करता हूं। पानी की प्रत्येक परत को y अक्ष में एक समय में एक स्तर पर संसाधित किया जाता है। प्रत्येक स्तर के लिए क्यूब्स को यादृच्छिक रूप से संसाधित किया जाता है, प्रत्येक क्यूब प्रत्येक स्रोत पर अपने स्रोत से पानी खींचने का प्रयास करेगा।
फ्लो क्यूब्स अपने प्रवाह की दिशा का पालन करके अपने स्रोत से पानी खींचते हैं जब तक कि वे स्रोत क्यूब या प्रवाह माता-पिता के साथ क्यूब तक नहीं पहुंचते। प्रत्येक क्यूब में प्रवाह की दिशा को संचय करना स्रोत से पथ का अनुसरण करना आसान बनाता है क्योंकि लिंक की गई सूची को पार करना आसान है।
एल्गोरिथ्म के लिए छद्म कोड निम्नानुसार है:
for i = 0 to topOfWorld //from the bottom to the top
while flowouts[i].hasitems() //while this layer has flow outs
flowout = removeRandom(flowouts[i]) //select one randomly
srcpath = getPathToParent(flowout) //get the path to its parent
//set cubes as active and update their "largest" value
//also removes flow from the source for this flow cycle
srcpath.setActiveAndFlux()
//now we deal with regular flow
for i = 0 to topOfWorld //from the bottom to the top
while activeflows[i].hasitems() //while this layer has water
flowcube = removeRandom(activeflows[i]) //select one randomly
//if the current cube is already full, try to distribute to immediate neighbors
flowamt = 0
if flowcube.isfull
flowamt = flowcube.settleToSurrounding
else
srcpath = getPathToParent(flowcube) //get the path to its parent
flowamt = srcpath.setActiveAndFlux()
flowcube.addflow(flowamt)
//if we didn't end up moving any flow this iteration, reduce the activity
//if activity is 0 already, use a small random chance of removing flow
if flowamt == 0
flowcube.reduceActive()
refillSourceCubes()
प्रवाह के विस्तार के लिए बुनियादी नियम जहां (प्राथमिकता के आधार पर):
- यदि नीचे के क्यूब में पानी कम है, तो नीचे प्रवाह करें
- यदि समान स्तर पर आसन्न क्यूब में पानी कम है, तो बाद में प्रवाह करें।
- यदि ऊपर के क्यूब में पानी कम है और स्रोत क्यूब ऊपर के क्यूब से अधिक है, तो प्रवाह करें।
मुझे पता है, यह बहुत उच्च स्तर है। लेकिन विस्तार से रास्ता पकड़े बिना अधिक विस्तार में जाना कठिन है ।
यह प्रणाली बहुत अच्छी तरह से काम करती है। मैं आसानी से पानी के गड्ढों को भर सकता हूं, जो बाहर की ओर बढ़ने के लिए अतिप्रवाह करता है। जैसा कि आप ऊपर gif में देखते हैं, मैं यू आकार की सुरंगों को भर सकता हूं। हालाँकि, जैसा कि मैंने कहा, सिस्टम अधूरा है और मैंने अभी तक सब कुछ काम नहीं किया है। मैंने लंबे समय में प्रवाह प्रणाली पर काम नहीं किया है (मैंने तय किया कि अल्फा के लिए इसकी आवश्यकता नहीं थी और मैं इसे होल्ड पर रखूंगा)। हालाँकि, जब मैं इसे पकड़ रहा था, तब मैं जिन मुद्दों से निपट रहा था:
ताल । जब पानी का एक बड़ा पूल हो जाता है, तो बच्चे से लेकर माता-पिता तक के संकेत किसी भी दिशा में प्रवाहित करने के लिए जो कुछ भी यादृच्छिक घन का चयन किया जाता है, के एक पागल गड़बड़ की तरह हैं। मूर्खतापूर्ण स्ट्रिंग के साथ बाथटब भरने की तरह। जब आप टब को खाली करना चाहते हैं, तो क्या आपको अपने स्रोत के पीछे मूर्खतापूर्ण स्ट्रिंग के मार्ग का पालन करना चाहिए? या आपको बस वही लेना चाहिए जो सबसे करीब है? तो ऐसी स्थितियों में जहां क्यूब्स एक बड़े पूल में हैं, उन्हें संभवतः अपने माता-पिता के प्रवाह की उपेक्षा करना चाहिए और जो कुछ भी उनके ऊपर है, उससे खींचें। मैं इसके लिए कुछ बुनियादी काम कोड के साथ आया था, लेकिन एक सुरुचिपूर्ण समाधान कभी नहीं था जिसके साथ मैं खुश हो सकता हूं।
कई माता-पिता । एक बच्चे की धारा को आसानी से एक से अधिक अभिभावकों द्वारा खिलाया जा सकता है। लेकिन एक एकल माता-पिता के लिए एक संकेतक होने वाले बच्चे की अनुमति नहीं होगी। यह प्रत्येक संभावित मूल दिशा के लिए थोड़ा सा अनुमति देने के लिए पर्याप्त बिट्स का उपयोग करके तय किया जा सकता है। और कई माता-पिता के मामले में एल्गोरिथ्म को बेतरतीब ढंग से चुनने के लिए एल्गोरिथ्म को बदलने की संभावना है। लेकिन, मुझे कभी भी यह देखने और परीक्षण करने के लिए नहीं मिला कि कौन से अन्य मुद्दे सामने आ सकते हैं।