अक्ष संरेखित स्थानिक विभाजन: अंतरिक्ष को यादृच्छिक आयतों में विभाजित करें?


11

मैं 3 डी अंतरिक्ष को यादृच्छिक अक्ष संरेखित बॉक्स आकृतियों में विभाजित करने के लिए एक विधि की आवश्यकता है। अभी के लिए मैं वर्तमान में परीक्षण उद्देश्यों के लिए 2d स्थान को विभाजित कर रहा हूं। मेरे पास आया सबसे तात्कालिक दृष्टिकोण आकार (1, 1) की एक आयत को परिभाषित करना था और फिर अक्ष एक्स और वाई के बीच बारी-बारी से सभी मौजूदा आयतों को दो असमान आयतों में विभाजित करना था।

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

यहाँ समस्या स्पष्ट है। यह दृष्टिकोण लंबी स्ट्रेचिंग लाइनों (लाल रंग में चिह्नित) के परिणामस्वरूप होता है

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

मैं जो चाहूंगा वह कुछ और जैविक है (मैंने एक उदाहरण शामिल किया)

देखें, ऊपर से नीचे या दाएं से बाएं कोई लंबी सीधी रेखाएं नहीं।

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

एकमात्र बाधा यह है कि मैं आकार की बारीकियों को प्रभावित किए बिना आयत के न्यूनतम आकार को सीमित करना चाह सकता हूं। यानी अगर सबसे छोटी आयत 1 वर्ग सेंटीमीटर है तो सेकेंड्स में सबसे छोटा कमरा 2 वर्ग इकाइयों का नहीं होना चाहिए।

इसलिए आदर्श रूप से एल्गोरिथम को निम्नलिखित तीन बाधाओं को पूरा करना चाहिए:

  1. रेक्टैंगल्स शिशु रूप से छोटे नहीं होते हैं।
  2. रेक्ट साइज़ सबसे छोटे रेक्ट साइज़ का असतत गुणा नहीं है। यानी यदि छोटी से छोटी आयत 3 वर्ग इकाई है तो बड़ी से बड़ी जड़ें 6, 9, 12 और इसके बाद वाली चौकोर इकाई होने के लिए विवश नहीं होती हैं और इसके बजाय उस मामले के लिए 3.2 या 4.7 हो सकती हैं)।
  3. एल्गोरिथ्म बहुपद समय (तेजी से गणना करने की आवश्यकता) में चलता है।

जवाबों:


12

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

  1. बेतरतीब ढंग से अपने मानचित्र स्थान में विभिन्न बिंदुओं को रखें। गॉर्सियन वितरण का उपयोग करके या वोरोनि डायग्राम्स के लिए लॉयड छूट के अनुसार यादृच्छिक रूप से रखे गए बिंदुओं को एक दूसरे से दूर ले जाने के लिए, ग्रेसियन वितरण का उपयोग करके या उनके पुनरावृत्ति छूट एल्गोरिदम को लागू करके उनके वितरण को सामान्य करें । ये बिंदु आपके कमरे-से-केंद्र के केंद्रक का प्रतिनिधित्व करते हैं।
  2. (सभी कमरों के लिए समानांतर / रिपीट राउंड-रॉबिन) प्रत्येक बिंदु से, 4 वर्टीकल बाहर की ओर (एक आयताकार कमरा) विकसित करें, प्रति वैश्विक केंद्र से आगे बढ़ते हुए (आप प्रत्येक अक्ष में अलग-अलग कमरे अलग-अलग दर से बढ़ सकते हैं, बजाए इसके सभी, और देखें कि यह कैसे निकलता है - संभवतः अधिक कार्बनिक / विविध परिणाम के लिए)। कुछ बिंदु पर, आपकी कुछ आयतें एक-दूसरे के खिलाफ दबाव बनाने लगेंगी। उस बिंदु पर, उस अक्ष में वृद्धि को सीमित करें, सुनिश्चित करें कि दो कमरों के आसन्न किनारों को बिल्कुल छू रहे हैं, और आगे बढ़ें।
  3. चरण 2 को दोहराएं, हर कमरे को बढ़ते हुए, जब तक कि सभी विकास आसन्न कमरों या नक्शे की सीमा तक सीमित न हो जाए।
  4. यह अभी भी कुछ खाली स्थानों को छोड़ देगा। समस्या अब गैर-कब्जे वाले स्थानों से बाहर रहने और कमरे बनाने की है। वास्तव में, यदि आपका अंतर्निहित स्थान एक (पूर्णांक-अनुक्रमित) ग्रिड है (और प्रत्येक वृद्धि पुनरावृत्ति उस ग्रिड पर जाती है), तो इससे निपटना बहुत आसान है, क्योंकि आप कब्जे वाले और अप्रकाशित ग्रिड कोशिकाओं की सूची बनाए रख सकते हैं: एक बार जब आप अपने सभी कमरों में रखा और उगाया गया है, आसन्न कोशिकाओं के समूहों से युक्त असतत स्थानों के लिए अप्रकाशित सूची के माध्यम से खोज करें। कई अप्रयुक्त स्थानों में गैर-आयताकार आकार होंगे, आपको उस गैर-आयताकार अंतरिक्ष के भीतर से यादृच्छिक पर एक सेल लेने की आवश्यकता होगी, और इसे अपने अधिकतम आकार तक बढ़ाएं जैसे कि आपने चरण 2 में किया था। दोहराए गए गैर के भीतर -अंतरंग अंतरिक्ष, जब तक यह पूरी तरह से भर नहीं जाता है।
  5. चरण 4 को तब तक दोहराएं जब तक आपका नक्शा 100% कब्जे में न आ जाए।

यह अच्छी सलाह है। नुकसान यह है कि यह संभवतया मुझे असीम रूप से छोटी-छोटी आयतों से बचाने के लिए कुछ नहीं करता है। मुझे यह पता लगाने के लिए कुछ तरीके की आवश्यकता है कि कितनी छोटी और कितनी बड़ी परतें हैं। वर्तमान में मैं एक और विधि पर काम करने की प्रक्रिया में हूं। मैं परिणामों और अपडेट की तुलना करूंगा।
अट्टुरसाम

@ArthurWulfWhite तब आपका प्रश्न अंडर-निर्दिष्ट था और इसे अपडेट किया जाना चाहिए। आपके न्यूनतम कमरे का आकार आपके मानचित्र-सेल रिज़ॉल्यूशन द्वारा निर्धारित किया जाता है; इसलिए यदि आप उस मोटे अनाज को न्यूनतम कमरे के आकार को समायोजित करने के लिए पर्याप्त बनाते हैं, तो आप इसके बाद एक अस्थायी बिंदु के आधार पर कुल्हाड़ियों को समायोजित कर सकते हैं, जिससे अधिक कार्बनिक रूप वापस आ जाएगा।
इंजीनियर

तुम सही हो! मुझे लगा कि मैंने वह हिस्सा लिखा है। लेकिन मैंने नहीं किया। मैं इस गलती के लिए माफी मांगता हूं। हाँ, मैं ग्रिड आकार से अवगत हूँ। एक कमरा केवल उतना ही छोटा हो सकता है जितना कि ग्रिड अनुमति देता है।
अट्टुरसाम

ठीक है - आशा है कि आपको एक उपयुक्त समाधान मिलेगा। BTW का मतलब "ग्रिड-लाइनों को समायोजित करना" था, न कि "अक्षों को समायोजित करना"।
इंजीनियर

1
वास्तव में मैं कुछ ठीक वैसा ही कर रहा हूं जैसा आप उन अवधारणाओं के आधार पर करते हैं जो आपने मुझे सोचा था। मैं यहां भी परिणाम पोस्ट करूंगा।
अट्टुरसाम

2

जैसा कि आप देख सकते हैं, मैं इन कलाकृतियों की दुनिया से छुटकारा पाने में कामयाब रहा। विचार बहुत समान है।

  1. 2d स्थान को गैर-समान ग्रिड में विभाजित करें। यदि दो लाइनें बहुत करीब हैं, तो एक को हटा दें।
  2. यादृच्छिक में एक आयत चुनें, जांचें कि क्या इसे अक्ष-y (ऊंचाई में) में संशोधित किया गया है और यदि यह प्रत्यक्ष पड़ोसी अक्ष-y में संशोधित किया गया है। मैं दोनों को संशोधित नहीं किया गया था, उनके बीच खंड को फिर से जोड़ दिया है (एक दूसरे को कुछ स्थान दान करेगा)।
  3. अन्य अक्ष पर केवल इस बार चरण 2 में ही करें।
  4. जब तक संभव हो, तब तक प्रक्रिया को दोहराएं।

गैर-समान ग्रिड (1):

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

अक्ष x (2) पर बातचीत:

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

अक्ष y (3) पर बातचीत:

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

परिणाम (4):

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

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


यह शिथिलता से प्रेरित होकर @Nick Wiggill
AturSams

2
एक n आयत के समीपवर्ती समूहों को पहले एकल आयत में यादृच्छिक रूप से विलय समूहों द्वारा इस पर और सुधार किया जा सकता है। यह उपर्युक्त आउटपुट में अभी भी अंतर्निहित ग्रिड को मास्क करता है। इन बड़े आयतों के साथ अब इसके सभी किनारों पर सभी कोशिकाओं पर काम करना होगा।
DMGregory

ठीक। अभी भी एक महान कई कॉलिनियर सीमाएं हैं, मैं उन लोगों पर आगे काम करूंगा, लेकिन अच्छा है कि आपने अपना समाधान ढूंढ लिया है! सहायता के लिए खुशी है।
इंजीनियर

@ डीडीग्रेगरी मैं इस पर विचार करता था लेकिन मैं चाहता था कि छोटी आयतों और बड़ी परिधियों के बीच का अनुपात कुछ हद तक सुसंगत हो। यदि यह एक बनावट या एक स्तर होता है तो मैं निश्चित रूप से यह करूँगा (वास्तव में इसका एक पिछला उदाहरण है जो ऐसा करता है)।
AturSams

@NickWiggill मैं कॉलिनियर लाइनों को पूरी तरह से समाप्त कर सकता हूं। यह एल्गोरिथ्म को ट्विक करने की बात है। इसे और बेहतर बनाने का एक तरीका होना चाहिए (सबसे हालिया बदलाव के साथ अद्यतन)
अटरसैम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.