निर्धारित करें कि ग्रिड पर टाइल्स का एक सेट एक संलग्न आकार बनाता है


10

एक ग्रिड पर टाइल्स के एक सेट को देखते हुए, मैं यह निर्धारित करना चाहता हूं:

  • यदि टाइल एक संलग्न आकृति बनाते हैं
  • यदि आप बोर्ड के किनारों की गणना करते हैं तो टाइल एक संलग्न आकृति बनाते हैं
  • यदि पिछली दोनों कथनों में से कोई भी सत्य है, तो संलग्न टाइल के अंदर अतिरिक्त टाइलें गिरती हैं, जो प्रारंभिक टाइलों के रूप में होती हैं।

खिलाड़ी एक टाइल पर नीचे दबाकर शुरू करेगा, फिर उसी रंग की टाइलों की श्रृंखला बनाने के लिए अपनी उंगली को अन्य टाइलों तक खींचेगा। मैं जाँच करूँगा कि मैं यह देखने जाऊँगा कि अगली टाइल वैध है या नहीं। पूर्व। खिलाड़ी द्वारा लाल टाइल पर शुरू होता है, अपने ही अगली मान्य कदम एक बगल लाल टाइल (विकर्ण है कर गिनती)। जब उपयोगकर्ता अपनी उंगली उठाता है, तो मुझे उपरोक्त 3 वस्तुओं की जांच करने में सक्षम होना चाहिए।

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

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

ग्रिड की इस श्रृंखला के साथ मैं क्या कर सकता हूं ताकि यह पता लगाया जा सके कि वे संलग्न आकृति बनाते हैं या नहीं? और एक बार मुझे पता है कि मेरे पास एक संलग्न आंकड़ा है, तो सभी टाइलों की एक अतिरिक्त सूची प्राप्त करने का सबसे अच्छा तरीका क्या है जो इसकी सीमा के अंदर आते हैं?

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

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

ऊपर मैंने इस परीक्षण के 4 संभावित परिणाम होने की उम्मीद की तस्वीरों को खींचा है।

  1. श्रृंखला एक संलग्न आंकड़ा नहीं बनाती है।

  2. श्रृंखला एक संलग्न आंकड़ा बनाती है।

  3. यदि आप आकृति के किनारे (या एक किनारे से अधिक) के रूप में बोर्ड के किनारों की गणना करते हैं, तो श्रृंखला एक संलग्न आंकड़ा बनाती है।

  4. श्रृंखला एक संलग्न आकृति बनाती है, लेकिन अतिरिक्त डेटा बिंदु हैं (उपयोगकर्ता द्वारा श्रृंखला के भाग के रूप में मान्य रूप से चुने गए हैं) जो उस आकृति का हिस्सा नहीं हैं जो बनाया गया है।

केस 4 सबसे मुश्किल है, क्योंकि आपको संलग्न आकृति और इसके अंदर आने वाले टुकड़ों को खोजने के लिए "अतिरिक्त" चेन लिंक निकालना होगा (लेकिन "अनविज्ञेय" क्षेत्र के आसपास नहीं)।

इसलिए ... किसी को भी इसे हल करने का एक अच्छा तरीका है, या मेरे लिए सिर्फ एक शुरुआती बिंदु है? मैं इस बिंदु पर हलकों में जा रहा हूं और आंखों के दूसरे सेट का उपयोग कर सकता हूं।


1
आंकड़ा -8, या पेंटाग्राम जैसे पथों को इंटरसेक्ट करने के बारे में क्या ? क्या आप गैर-शून्य या सम-विषम भरण नियम मानेंगे ?
एको

केस 4 केस 3 के साथ भी विलीन हो सकता है: अतिरिक्त जानकारी के साथ बोर्ड के किनारों का उपयोग करके संलग्न
चार्जिंगपून

यदि आपके पास एक ऊर्ध्वाधर रेखा है जो आपके बोर्ड के केंद्र को ऊपरी किनारे से नीचे तक चला रही है, तो बोर्ड का कौन सा पक्ष 'संलग्न' है?
स्टीवन स्टैडनिक

मुझे लगता है कि हमें यह मान लेना चाहिए कि सबसे छोटी जगह अभी के लिए संलग्न है। जब तक ओपी निर्दिष्ट नहीं करता है।
टॉम 'ब्लू' पिडॉक

जवाबों:


3

1. टाइल्स के एक लूप का पता लगाना

समस्या एक ग्राफ में एक चक्र (लूप) का पता लगाने के लिए अनुकरणीय लगती है, यहां या यहां देखें

  • Vउस ग्राफ़ के नोड्स का सेट G=(V, E)टाइल हैं,
  • e = (v1, v2)यदि टाइलें प्रत्यक्ष या विकर्ण पड़ोसी हैं, तो दो अलग-अलग नोड्स के बीच एक किनारे मौजूद है

2. स्क्रीन बॉर्डर केस को हैंडल करना

स्क्रीन बॉर्डर में उन काल्पनिक टाइलों का समावेश होता है, जो दृश्य टाइलों के स्क्रीन के चारों ओर एक टाइल की चौड़ी रिम बनाती हैं।

आपके विनिर्देशन के अनुसार स्क्रीन बॉर्डर का हिस्सा एक बंद लूप का एक अंतर्निहित हिस्सा बनेगा। बस एक बंद लूप का पता लगाने के लिए, इस नियम के माध्यम से कनेक्शन को सम्मानित करके ग्राफ Gको ग्राफ में विस्तारित करना पर्याप्त होगा G':

  • एक और धार किसी भी दो अलग-अलग नोड्स के बीच मौजूद होती है, यदि दो टाइलें प्रत्येक स्क्रीन की सीमा के पास सीधे स्थित हों

इस प्रकार टाइलें (0,0) और (1,0) एक बंद लूप का हिस्सा होंगी, साथ में "बॉर्डर टाइल्स" (-1,0), (-1, -1), (0, -1) , (1 1)।

3. एक लूपेड क्षेत्र का आंतरिक भाग

उपयोगकर्ता आर्थर वुल्फ व्हाइट ने जो सुझाव दिया है, मैं उसके बारे में एक सहज दिशा में जाऊंगा :

टाइल्स के सेट को सीमित करना है जिसे हमें लूप टाइल्स के बाउंडिंग बॉक्स द्वारा जांचना है।

फिर बाउंडिंग बॉक्स के भीतर सभी टाइलों का चयन करने के लिए बाढ़ भराव का उपयोग करके जो बाहरी या बंद लूप में आंतरिक हैं। यह केवल उन दो मामलों में से एक हो सकता है। जिसे हमें बाद में पता लगाना है।

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

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

ffbb == extbb

यदि हम एक आंतरिक टाइल के साथ शुरू करते हैं, तो इसे एक विशिष्ट छोटे बाउंडिंग बॉक्स का उत्पादन करना चाहिए, क्योंकि लूप टाइल्स को दोनों बाउंडिंग बॉक्स के बीच में सैंडविच करना होगा।

ffbb < extbb

बाढ़ भराव के लिए प्रारंभिक प्रारंभिक टाइल कोई भी टाइल हो सकती है extbbजिसके भीतर एक मुक्त टाइल है। शायद एक बेतरतीब ढंग से चुनना सबसे अच्छा तरीका है।

अगर मुझे पहले पता होता है कि इंटीरियर बाहरी से छोटा है, तो मैं लूप पॉइंट्स के द्रव्यमान के केंद्र के आसपास शुरू करूंगा जो कई क्षेत्रों के लिए इंटीरियर में है (काउंटर उदाहरण: C आकार का क्षेत्र), अन्यथा की सीमा पर extbb। लेकिन मुझे नहीं पता कि इसका अनुमान कैसे लगाया जाए।

अंतिम टिप्पणी

सामान्य तौर पर मैं कहूंगा कि कुछ टाइल से शुरू होने वाला और चलने वाली टाइलों की एक सूची को ध्यान में रखते हुए एक चक्र का पता लगाने के लिए पर्याप्त होगा, लेकिन उस स्क्रीन सीमा की स्थिति अधिक जटिल ग्राफ प्राप्त कर सकती है, इसलिए आपको ग्राफ एल्गोरिथ्म के साथ सुरक्षित पक्ष पर होना चाहिए ।

नीचे एक उदाहरण है जहां आंतरिक जुड़ा नहीं है, दूसरी तरफ चक्र का पता लगाने के लिए उस मामले में दो छोरों को ढूंढना चाहिए, एक को छोड़ देना चाहिए।

कुछ मामले


1

आप इसे इसके द्वारा हल कर सकते हैं:

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

एक, पुनरावृति श्रृंखला पर सभी टाइल से अधिक करने के लिए और पाते हैं उनके minX, minY, maxXऔर maxYऔर अपने सीमांकन बॉक्स या AABB है।

दो तुच्छ है।

फ़्रेम पर इरेटिंग करना सरल है, बस यह सुनिश्चित करें कि ग्रिड के बाहर बाढ़-भराव न हो। आप विकिपीडिया में बाढ़-भराव के बारे में जान सकते हैं ।

नंबर चार के लिए आप केवल श्रृंखला से सटे टाइल्स की जाँच करके शुरू कर सकते हैं। आप किसी भी टाइल से बाढ़-भराव कर सकते हैं जो आपको अधिक टाइल का पता लगाने के लिए चिह्नित नहीं है।


0

आपका अंतर्ज्ञान सही है, यह मानते हुए कि श्रृंखला समाप्त होती है जैसे ही उपयोगकर्ता एक टाइल का चयन करने की कोशिश करता है जिसे उन्होंने पहले ही चुना है। उस स्थिति में, सामान्य रूप से आकृति आपके चित्र (4) में एक लासो की तरह दिखती है। यदि वे स्वाइपिंग रख सकते हैं, तो वे कई लूप खींच सकते हैं, और चीजें अधिक जटिल हो जाती हैं। आप जो करना चाहते हैं, वह पॉइंट-इन-बहुभुज प्रश्न का उत्तर है।

सबसे पहले, हमें समस्या को परिभाषित करने की आवश्यकता है। मैं यह मानने जा रहा हूं कि स्थिति ऐसी दिखती है (2), अर्थात किसी भी पूंछ को छीन लिया गया है, और अंत वापस शुरू से जोड़ता है, ताकि प्रत्येक टाइल में श्रृंखला में "पूर्ववर्ती" और बिल्कुल एक "उत्तराधिकारी" हो। (जहां टाइल X के उत्तराधिकारी का पूर्ववर्ती हमेशा टाइल X होता है)। इसके अलावा, यदि आप लंबे समय तक "उत्तराधिकारियों" का पालन करते हैं, तो आप अंततः उस स्थान पर वापस आ जाते हैं जहां आपने शुरुआत की थी। आप यह पता लगाने के लिए कि क्या वास्तव में लूप किसी भी बिंदु पर वापस पार हो जाता है, गुरगुरादेन के सुझाव का उपयोग कर सकते हैं। यह मानते हुए कि जब आप उपयोगकर्ता के इनपुट को समाप्त करते हैं, तो यह एक पंक्ति में नोड्स की कुछ श्रृंखला की तरह दिखेगा, इसके बाद लूप होगा। आप लूप पाने के लिए लाइन को स्ट्रिप कर सकते हैं।

अब हम, प्रत्येक पंक्ति के लिए निम्न कार्य करते हैं:

  1. बाएं किनारे पर शुरू करें, और प्रत्येक टाइल के लिए एक बूलियन का ट्रैक रखें जो बताता है कि हम IN या OUT हैं। शुरु होना।
  2. यदि वर्तमान टाइल श्रृंखला का हिस्सा है, तो उत्तराधिकारी और पूर्ववर्ती (जो आसन्न होना चाहिए) दोनों को देखें। यदि या तो सख्ती से ऊपर है (यानी उत्तर, उत्तर पूर्व, या वर्तमान टाइल के उत्तर पश्चिम में), वर्तमान टाइल की स्थिति को टाइल के बाईं ओर स्थित करें। अन्यथा, इसे बाईं ओर टाइल के समान सेट करें। गोटो ४।
  3. यदि वर्तमान टाइल श्रृंखला का हिस्सा नहीं है, तो टाइल को इसके बाईं ओर शीर्षक की स्थिति पर सेट करें। गोटो ४।
  4. एक से दाईं ओर की टाइल अब वर्तमान टाइल है। गोटो २।

अब सभी टाइलें लें, जो IN हैं, सीमा पर टाइलों में जोड़ें (एक पूंछ सहित यदि आपने इसे पहले छीन लिया था या नहीं, आपकी पसंद), और उस क्षेत्र को कॉल करें।

यदि आप उपयोगकर्ता को सीमाओं का उपयोग करने की अनुमति देना चाहते हैं, तो याद रखें कि यह परिभाषित नहीं करता है और बोर्ड पर IN / OUT नहीं है, लेकिन बस इसे दो भागों में विभाजित करता है। आप छोटे क्षेत्र का चयन कर सकते हैं, उदाहरण के लिए, या उपयोगकर्ता को दो आसन्न पक्षों (यानी, बाएं और नीचे का उपयोग करने की आवश्यकता होती है, लेकिन ऊपर / नीचे या बाएं / दाएं नहीं)।

एक अनुकूलन यह है कि आपको केवल उन पंक्तियों को करने की आवश्यकता है जिनकी कोई सीमा है (यदि आप पक्षों का उपयोग नहीं कर सकते हैं)। मुझे लगता है कि आपका बोर्ड इतना छोटा है कि हर टाइल पर पुनरावृत्ति करना और बहुत सरल गणना करना एक मुद्दा नहीं है, यहां तक ​​कि सबसे कमजोर मोबाइल सिस्टम पर भी। (आपको उन्हें प्रस्तुत करना होगा, आखिरकार, जो किसी कार्य का अधिक जटिल है)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.