सबसे अच्छा "बाल्टी-भरने" एल्गोरिथ्म क्या है?


16

मैं इमेज प्रोसेसिंग के लिए बहुत नया हूं, और मैं वर्तमान में एक पेंट-जैसे एप्लिकेशन पर काम कर रहा हूं, जिसमें बाल्टी भरने की सुविधा होगी। हालांकि, मुझे इस बात का कोई अंदाजा नहीं है कि बाल्टी भरने के लिए सबसे अच्छा एल्गोरिथ्म क्या है।

मैंने इस साइट से पाया एक उदाहरण लागू किया , हालांकि, यह अनंत लूप समस्याओं में भाग गया जब एक उपयोगकर्ता ने एक क्षेत्र को बाल्टी-भरने की कोशिश की जो पहले से ही एक ही रंग से बाल्टी-भर गया था।

मैं वर्तमान में बाएं, दाएं, ऊपर और फिर नीचे को भरकर उस समस्या के आसपास काम कर रहा हूं; हालाँकि, मैंने इसे ऐसा बनाया है कि एक बार पिक्सेल को बाईं ओर भरने के बाद, यह दाईं ओर नहीं भर सकता है, जिसका अर्थ है कि आकार:

उदाहरण

लाल डॉट पर बकेट टूल का उपयोग करने पर ठीक से नहीं भरा जा सकेगा।

इसलिए, मैं उम्मीद कर रहा हूं कि किसी को एक एल्गोरिथ्म या किसी एक के बारे में पता होना चाहिए जो इन सभी मुद्दों को हल करेगा।

अतिरिक्त जानकारी: इसे जावास्क्रिप्ट के रूप में पेंट टूल के रूप में लागू किया जाएगा। यह कैनवास तत्व का ऑनलाइन उपयोग किया जाएगा।


क्या यह वेक्टर या बिटमैप आधारित है? मैं छवि से बिटमैप मान रहा हूं, लेकिन अभी सुनिश्चित कर रहा हूं ..
डेमियन ब्रेख्त

1
मुझे लगता है कि आपने कुछ गलत तरीके से लागू किया है। मैंने दस्तावेज़ को स्किम किया और छवि उदाहरणों के अनुसार, यह ऊपर की तरह छवियों को भरना चाहिए। क्या आपने उसका कोड कॉपी या पेस्ट किया था, या आपने उसे फिर से लिखा था?
RLH

ग्राफ ट्रावेलल सोचो।
1

@RLH: मैंने अपने कोड को अपने सेट अप के साथ काम करने के लिए उसके कोड को कुछ बदलावों के साथ कॉपी और पेस्ट किया।
इवान

@ इवान: इससे पहले कि आप अपनी "अनंत लूप" समस्याओं को हल करने से पहले एक नए अहंकार की खोज शुरू न करें। यदि मौजूदा कार्यान्वयन के लिए भी इसे ठीक नहीं किया जा सकता है, तो आप निश्चित रूप से बहुत अधिक परेशानी में चलेंगे जब आप स्क्रैच से पूरी चीज को फिर से लिखने जा रहे हैं।
Doc Brown

जवाबों:


21

ऐसा लगता है कि आप वास्तव में एक बाढ़ भरण एल्गोरिथ्म नामक व्हाट्सएप की तलाश कर रहे हैं। यही कारण है कि आप इसके लिए उदाहरण के टन पाया havent हो सकता है। एल्गोरिथ्म के लिए विकिपीडिया पृष्ठ पर सूचीबद्ध कई बाढ़ भरण विधियां हैं । मैं अत्यधिक गैर-पुनरावर्ती, 'कतारबद्ध' तरीकों में से एक की सिफारिश करता हूं।


I highly recommend one of the non-recursive, 'queued' methods.- आप समझा सकते हैं क्यों?
एलिफायर

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

-1

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

कतारबद्ध विधि कुछ प्रोग्रामिंग अनुभव वाले किसी के लिए अत्यंत सहज होनी चाहिए।

यदि आपके रंग के समान रंग के आसपास के क्षेत्र को चित्रित करना एक चिंता का विषय है, तो आप एक:

  • पृष्ठभूमि के रंग के लिए जाँच करें।
  • उसी रंगीन स्थान के किनारे पर खोजें जिसे आपने क्लिक किया था।
  • घटनास्थल के आसपास के बिंदुओं को कतारबद्ध करें।
  • इस (इस मामले में) सफेद-डॉट भरी कतार का उपयोग करके सामान्य निष्पादन के साथ आगे बढ़ें।

यदि आप चाहें तो आप यहाँ मेरे (काफी शर्मनाक) कोड पर एक नज़र डाल सकते हैं ।

यह तेज़ होने से बहुत दूर है लेकिन यह ठीक काम करता है ...


क्यों घटता है? :( मुझे पता है कि विधि विशेष रूप से "तेज़" नहीं है, लेकिन यह काम करता है, और प्रस्तावित समाधान भी करता है :(
जुआन पाब्लो अल्वारेज़ अल्फारो

1
यह पोस्ट पढ़ना मुश्किल है (पाठ की दीवार)। क्या आप बेहतर आकार में आईएनजी को संपादित करेंगे ?
gnat

2
गंभीरता से? लोगों ने बड़े पैमाने पर मतदान किया क्योंकि इसे पढ़ना मुश्किल था? संपादित करने का विकल्प क्यों नहीं चुना? यह ऐसा नहीं है कि सामग्री समस्याग्रस्त है।
l46kok

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