प्रक्रियात्मक ... कमरा जनरेटर के साथ घर


74

मैं कुछ एल्गोरिदम और लेखों को प्रक्रियात्मक रूप से कालकोठरी बनाने के बारे में देख रहा हूं । समस्या यह है, मैं कमरों के साथ एक घर बनाने की कोशिश कर रहा हूं, और वे मेरी आवश्यकताओं के अनुरूप नहीं लगते हैं।

एक के लिए, कालकोठरी में गलियारे हैं, जहां घरों में हॉल हैं। और शुरू में वे एक ही लग सकते हैं, एक हॉल उस क्षेत्र से अधिक कुछ नहीं है जो एक कमरा नहीं है, जबकि एक गलियारा विशेष रूप से एक क्षेत्र को दूसरे से जोड़ने के लिए डिज़ाइन किया गया है।

एक घर के साथ एक और महत्वपूर्ण अंतर यह है कि आपके पास एक विशिष्ट चौड़ाई और ऊंचाई है, और आपको कमरे और हॉल के साथ पूरी चीज़ को भरना है, जबकि एक तहखाने के साथ, खाली जगह है।

मुझे लगता है कि एक घर में हॉल एक कालकोठरी गलियारे (दूसरे कमरों में आपको मिलता है) और कालकोठरी में एक खाली जगह के बीच कुछ है (यह स्पष्ट रूप से कोड में परिभाषित नहीं है)।

विशेष रूप से, आवश्यकताएं हैं:

  • पूर्वनिर्धारित कमरों का एक सेट है
    मैं मक्खी पर दीवारों और दरवाजे नहीं बना सकता।
  • कमरों को घुमाया जा सकता है, लेकिन
    फिर से आकार नहीं लिया जा सकता है , क्योंकि मेरे पास कमरों का पूर्वनिर्धारित सेट है, मैं केवल उन्हें घुमा सकता हूं, उनका आकार नहीं बदल सकता।
  • घर के आयाम सेट हैं और पूरी तरह से कमरे (या हॉल) से भरे हुए हैं
    I यानी मैं उपलब्ध कमरों के साथ 14x20 का घर भरना चाहता हूं ताकि यह सुनिश्चित हो सके कि कोई खाली जगह नहीं है।

इसे कुछ और स्पष्ट करने के लिए यहां कुछ चित्र दिए गए हैं:

ठेठ कालकोठरी जनरेटर कोई गलियारे वाला कालकोठरी घर का जनरेटर परिणाम

जैसा कि आप देख सकते हैं, घर में, "खाली जगह" अभी भी चलने योग्य है और यह आपको एक कमरे से दूसरे कमरे में मिलती है।

तो, यह सब कहा जा रहा है, शायद एक घर बस गलियारों के साथ वास्तव में कसकर भरा हुआ तहखाने है। या यह एक कालकोठरी की तुलना में कुछ आसान है। शायद वहाँ कुछ है और मुझे यह नहीं मिला क्योंकि मैं वास्तव में नहीं जानता कि क्या खोजना है।

यह वह जगह है जहां मैं आपकी मदद करना चाहता हूं: क्या आप मुझे इस एल्गोरिदम को डिजाइन करने के बारे में संकेत दे सकते हैं? क्या कदम उठाएंगे इस पर कोई विचार? यदि आपने एक कालकोठरी जनरेटर बनाया है, तो आप इसे मेरी आवश्यकताओं के अनुसार कैसे संशोधित करेंगे? आप जैसे चाहें विशिष्ट या सामान्य हो सकते हैं। मैं सचमुच आपका दिमाग चुन रहा हूं।


2
एक अजीब सिफारिश: मैं दृढ़ता से क्रिस्टोफर अलेक्जेंडर की पुस्तकों की जाँच करने की सलाह देता हूं द टाइमलेस वे ऑफ़ बिल्डिंग एंड ए पैटर्न लैंग्वेज , आर्किटेक्चर बुक्स जो एक (सॉफ्टवेयर) पैटर्न की धारणा के लिए मूल आधार का गठन करती हैं; वे अनिवार्य रूप से इमारतों और रहने वाले स्थानों के लिए एक स्पष्ट भाषा का वर्णन करते हैं जिन्हें एक शीर्ष-डाउन प्रक्रियात्मक निर्माण विधि में बदल दिया जा सकता है।
स्टीवन स्टैडनिक

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

@pek कृपया अपने समाधान के लिए एक उत्तर बनाएं, इसे प्रश्न में न डालें।
MichaelHouse

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

साभार @pek क्रेडिट प्राप्त करने के बारे में चिंता न करें, यह योग्य है और यह साइट पर आने वाले लोगों के लिए समाधान देखने के लिए उपयोगी है (और यह देखने के लिए कि यह कहाँ सबसे अच्छा है)।
MichaelHouse

जवाबों:


50

मुझे लगता है कि यह बाइनरी या टर्नरी स्पेस विभाजन का उपयोग करने के लिए अच्छा मामला है।

पहले पास पर, घर के स्थान को हॉल और {कमरों के ब्लॉक} में विभाजित करें। अगला बड़ा हिस्सा लें, इसे {हॉल और चंक} या {2 चंक्स और उनके बीच हॉल} में विभाजित करें। हर कदम पर, स्लाइसिंग दिशा को 90 डिग्री तक घुमाएं। बंद करो जब {कोई और बड़ा हिस्सा नहीं छोड़ा} या {कुल हॉल क्षेत्र सीमा तक पहुँच गया}।

दूसरी पास पर, शेष चनों को कमरों में विभाजित करें। अगला बड़ा हिस्सा लें और इसे विभाजित करें। कुछ बड़े कमरों के लिए, यादृच्छिक पर कुछ नहीं-बड़ा हिस्सा अलग करना छोड़ें।

यदि कोई हॉल बहुत पुराने हॉल का सामना कर रहा है, तो वहां दीवार (या दरवाजे के साथ दीवार) रखें।

सीधे या अन्य पहले से जुड़े कमरों के माध्यम से हॉल के साथ कमरे कनेक्ट करें।

उदाहरण के लिए, आप मेरे मैन्युअल रूप से तैयार किए गए परिणाम या C ++ - समान रूप से आंशिक रूप से किया गया छद्म कोड देख सकते हैं । अंतिम शॉट:

अंतिम गोली


यही कारण है कि मेरे अनुसंधान का परिणाम है, अंतरिक्ष विभाजन में। कोड के साथ आपके उदाहरण ने मुझे बहुत अच्छी शुरुआत दी। मैं वर्तमान में एल्गोरिदम पर पढ़ रहा हूं। एक सवाल हालांकि: मेरी आवश्यकताओं में से एक यह है कि कमरे पूर्वनिर्धारित हैं (यानी एक दरवाजे के साथ 2x2 कमरे हैं, 1x1 दो दरवाजे हैं, लेकिन तीन दरवाजों के साथ कोई 2x2 नहीं है), इसलिए मैं विभाजन शुरू नहीं कर सकता हूं और फिर यह तय करूंगा कि मैं दरवाजे कहां लगाऊंगा । मुझे लगता है कि विभाजन करते समय मुझे अपनी सीमाओं को ध्यान में रखना होगा। क्या आपके पास इस बारे में कोई सुझाव है कि मैं इस बारे में कैसे जाऊंगा? किसी भी मामले में, आपके उत्तर और प्रयास के लिए बहुत-बहुत धन्यवाद!
पीके २

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

हाँ, मैं उम्मीद कर रहा था कि मुझे कुछ याद आ रहा है। मेरा पहला दृष्टिकोण ए * का उपयोग करके यह पता लगाने के लिए था कि किसी दिए गए स्थान में कमरों को कैसे फिट किया जाए, लेकिन हॉल के लिए तर्क की कमी थी। अब मैं सोच रहा हूं कि मैं बसपा का उपयोग हॉल बनाने के लिए कर सकता हूं, और फिर ए * का उपयोग ब्लॉकों के लिए कर सकता हूं। मैं जिस चीज के बारे में ज्यादातर चिंतित हूं वह यह है कि यह बहुत महंगा हो सकता है और हमेशा इसका परिणाम नहीं होता है। लेकिन मुझे पहले इसका परीक्षण करना होगा। शायद यह उतना बुरा नहीं होगा?
pek

2
@pek मुझे कुछ उपयोगी लगा, यदि आप अभी भी रुचि रखते हैं। को देखो यह भी गूगल L-system
शैडो इन रेन

24

आप इस तथ्य से लाभ उठा सकते हैं कि आपका वांछित डिज़ाइन गलियारों से घिरे आयताकार कमरों में कमरों को बंद कर देता है। इसे ध्यान में रखते हुए, मैं यह करूंगा:

  1. गलियारों और "बड़े रिक्त स्थान" को कमरों के लिए डिज़ाइन करें
  2. कमरों के साथ प्रत्येक "बड़े स्थान" में भरें

2 कदम

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


15

तो, यहाँ है कि मैंने इस समस्या को कैसे हल किया। लेकिन सबसे पहले, मैं अपने उत्तर में @Shadows In Rain और @egarcia दोनों को धन्यवाद देना चाहूंगा। उन्होंने मुझे एक अच्छी दिशा दी जिससे मुझे कुछ परिणाम मिले।

मैंने बेसिक घर बनाने के लिए शैडोज़ इन रेन के स्पेस पार्टिशनिंग का उपयोग किया और फिर कमरे के साथ क्षेत्र को भरने के लिए एगारिया की सलाह का पालन किया।

90% कोड शैडोज़ के बाद से अंतरिक्ष विभाजन बहुत सीधा था। "कमरों में भरें" भाग थोड़ा अधिक चुनौतीपूर्ण था। मैंने एक छद्म एआई प्लानिंग सिस्टम का उपयोग करने का निर्णय लिया जो ए * का उपयोग करता है ताकि कमरों को उचित रूप से स्थित किया जा सके। सिर्फ ए * के बजाय योजना का उपयोग करने के बारे में अच्छी बात यह है कि पूर्व शर्त खोज स्थान को महत्वपूर्ण रूप से काटने में मदद करती है।

परिणाम के साथ कुछ स्क्रीनशॉट यहां दिए गए हैं:

मंजिल योजना पीढ़ी चरण मंजिल योजना पीढ़ी चरण

कक्ष प्लेसमेंट चरण कक्ष प्लेसमेंट चरण

अब दरवाजे जोड़ने के साथ!
अब दरवाजे जोड़ने के साथ!


11

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

उनका काम निम्नलिखित सरलीकृत मान्यताओं के आसपास तैयार किया गया था:

  • केवल अपार्टमेंट इमारतों के साथ काम कर रहा है
  • कोई विभाजित स्तर नहीं
  • इमारतों के आकार को सीमित (लिफाफा) बहुभुज होना चाहिए
  • लिफाफे में कोई छेद नहीं
  • समान या रैखिक रूप से बदलते लिफाफे की मोटाई (IE कोई घंटा आकार)
  • केवल उन इमारतों से निपटना चाहिए जिन्हें गलियारों की आवश्यकता है

यहां उनकी प्रक्रिया का संक्षिप्त विवरण दिया गया है:

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

    • कमरे के आकार को प्रभावित करने के लिए बीज वजन का उपयोग किया जाता है। बीज दरवाजे और खिड़कियों पर जोड़े जाते हैं। अतिरिक्त बीज जोड़े जाते हैं, आम तौर पर प्रति वांछित कमरे में एक; जबकि स्पष्ट रूप से नहीं कहा गया है, ऐसा लगता है जैसे बीज अपार्टमेंट की बाहरी दीवारों के साथ रखा गया हो।
    • सबसे दूर के बिंदु से शुरू होकर, दिए गए बीज और अन्य सभी बिंदुओं के बीच की रेखा की गणना की जाती है और फिर अंत बिंदुओं के संबंधित भार के सापेक्ष एक दूरी को द्विगुणित किया जाता है (ईजी अगर A और B का वजन 1 & 4 है, तो द्विभाजन बिंदु होगा A से B तक के रास्ते का 1/4)। बाइसेक्टिंग लाइनों का संग्रह, बाहरी दीवार के साथ फिर बीज के लिए सेल बनाता है।
    • इसके बाद, एक एस-स्पेस वॉल कंकाल (पेपोनिस एट अल 1997 के अनुसार) बाहरी दीवार सुविधाओं (खिड़कियों या दरवाजों) के पड़ोसी जोड़े के बीच मध्य बिंदुओं से लंबवत रूप से उत्पन्न लाइनों के साथ क्षेत्र को विभाजित करके बनाया गया है।
    • अंत में, दीवारों को एस-स्पेस कंकाल से चुना जाता है जो 'वोरोनोई सेल की दीवारों के समान संभव है।'

3
क्या आप चित्र शामिल कर सकते हैं? वह महान होगा। मैंने पेपर को स्किम किया और उनके द्वारा बनाए गए कमरे एक वास्तुशिल्प पीओवी से अच्छे दिखे।
कॉंगसबोंगस

बहुत दिलचस्प विधि, मुझे किसी भी विचार के लिए खुद को अधिक बारीकी से जांचना होगा जो मैं इसे दूर करने में सक्षम हो सकता हूं।
ड्रेको

मैं यहाँ काम से आराम करने के लिए आया था ... मेरे शोध का विषय आश्चर्यचकित करता है। मैं अपने स्वयं के अनुसंधान के आधार पर एक उत्तर लिखने के लिए बहुत आलसी हूं (मैंने अभी तक केवल नंगे पैर की हड्डियों को डिजाइन किया है, इसलिए यह वैसे भी इसके लायक नहीं है) या समस्या के बारे में दानिल नेगी के दृष्टिकोण का वर्णन करता है, इसलिए मैं यहां सिर्फ यह लिखूंगा। autodeskresearch.com/publications/…
फेलिप गुटिरेज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.