मुझे पंक्तियों और स्तंभों के साथ एक आयताकार गठन में बॉट मिला है। एक समस्या तब पैदा होती है जब एक बॉट को जोड़ा जाता है या गठन से हटा दिया जाता है। जब ऐसा होता है, तो बॉट्स को खुद को पुनर्व्यवस्थित करना पड़ता है ताकि आयताकार गठन अभी भी लगभग उसी पहलू अनुपात हो, और जितना संभव हो उतना आयताकार हो। यह कैसे करना है?
कुछ विचार:
जब एक बॉट को जोड़ा या हटाया जाता है, तो नई चौड़ाई और बॉट की कुल संख्या और वांछित निरंतर पहलू अनुपात का उपयोग करके उस पहलू की नई चौड़ाई और ऊंचाई की गणना करें जो उस पहलू अनुपात को सबसे करीब से फिट करता है। फिर किसी तरह नए आयामों को फिट करने के लिए बॉट्स को फेरबदल करें।
जब एक बॉट को हटा दिया जाता है, तो उस बॉट को स्थानांतरित करें जो इसके पीछे जगह में था, और तब तक जारी रखें जब तक आप गठन के अंत तक नहीं पहुंच जाते। फिर भी पीछे के रैंक को जितना संभव हो सके, किसी भी तरह से बैक रैंक में बॉटल्स को फेरबदल करके।
एक और विचार जो पूरी तरह से अलग है वह यह है कि जिस तरह से अणु संरचनाएं एक साथ रहती हैं, उसकी नकल करें। प्रत्येक बॉट को चार सबसे नज़दीकी बॉट को आकर्षित करके और बाकी को दोहरा कर चार अन्य बॉट से घिरा होना चाहते हैं। उलटा वर्ग कानून का उपयोग कर अलगाव सुनिश्चित करने के लिए बहुत करीब हैं (चार सहित) सभी बॉट को पीछे हटाना। आपको संपूर्ण संरचना को आकार देने के लिए एक अतिरिक्त बल की आवश्यकता होगी। लेकिन, यह बहुत कम्प्यूटेशनल रूप से महंगा लगता है।
अद्यतन करें : तो सरहम के उत्तर को देखते हुए, मैं एक अच्छा सामान्य कार्य करता हूं जो अच्छे आयाम देता है।
पहले मैंने नीचे चौड़ाई और ऊंचाई के लिए एक साथ समीकरण हल किया, और फिर जवाबों को गोल किया।
width/height=aspect ratio of your choice
width*height=number of bots
यह आपको आपके नंबर के बॉट्स के लिए उस अनुपात में निकटतम पूर्णांक आयत प्रदान करता है। निकटतम आयत आधा समय बहुत बड़ा होगा, और आधा समय बहुत छोटा होगा (बेशक कभी-कभी यह सही होगा लेकिन उन लोगों की परवाह कौन करता है)। उन मामलों में जहां आयत थोड़ा बहुत बड़ा है, कुछ भी करने की आवश्यकता नहीं है। बैक रैंक लगभग पूर्ण होने के बाद समाप्त हो जाएगी, जो आदर्श है। उन मामलों में जहां आयत थोड़ी बहुत छोटी है, आपको समस्याएँ आईं क्योंकि उस छोटे से अतिप्रवाह को अपने स्वयं के रैंक पर जाना होगा, इस पर केवल कुछ बॉट्स के साथ एक रैंक बनाई गई, जो सुंदर नहीं लगती है। ऐसे मामले भी हैं जहां अंतर बड़ा है(आधी से अधिक चौड़ाई), जिस स्थिति में अंतर को छोटा करने के लिए एक रैंक जोड़ें या घटाएं। फिर, जब आयत बहुत छोटा है, तो इसे थोड़ा बड़ा करने के लिए एक कॉलम जोड़ें। ऐसा करने के बाद ऐसा लगता है कि पिछली रैंक हमेशा कम से कम आधी होगी जितनी कि अन्य रैंक की तुलना में कई बॉट होंगे।
अपडेट करें
एक बार जब आपको आयाम मिल गए, तो उनकी तुलना वर्तमान आयामों से करें। यदि नए आयाम का मोर्चा बड़ा है, तो प्रत्येक रैंक के लिए, नीचे दिए गए रैंक से पॉप बॉट्स, और उन्हें वर्तमान रैंक पर धक्का दें जब तक कि उस रैंक पर बॉट्स की संख्या फ्रंटेज के बराबर न हो। उस एल्गोरिथ्म को जारी रखें जब तक कि आप पीछे के रैंक पर नहीं पहुंच जाते। इस एल्गोरिथ्म का उपयोग करते हुए, बॉट नए आयाम में कुशलतापूर्वक फिट होने के लिए आगे बढ़ेंगे। उसके बाद, मैं बस नए पुराने को पिछले रैंक पर धकेलता हूं। एल्गोरिदम उन मामलों के लिए थोड़ा अलग है जहां नया फ्रंटेज छोटा है, लेकिन आप इसका पता लगा सकते हैं!
आगे दो और समस्याएं हैं। विलोपन, और अधिक लचीली जोड़ विधि जहां नए बॉट आवश्यक रूप से बैक रैंक को नहीं सौंपे जाते हैं, लेकिन जिस भी स्थिति में वे जुड़ जाते हैं, उस समय उनके पास सबसे करीब है।