2015-04-28 6 views
6

मुझे ब्लैक सीमाओं के अंदर एक छवि के रंग पिक्सल के लिए बाढ़ भरने वाले एल्गोरिदम लिखने की आवश्यकता है। मैंने लिखा गया है इतने पर कुछ पोस्ट यहाँ के आधार पर निम्न:जावा फ्लड समस्या

private Queue<Point> queue = new LinkedList<Point>(); 
private int pickedColorInt = 0; 

private void floodFill(Pixmap pixmap, int x, int y){ 
    //set to true for fields that have been checked 
    boolean[][] painted = new boolean[pixmap.getWidth()][pixmap.getHeight()]; 

    //skip black pixels when coloring 
    int blackColor = Color.rgba8888(Color.BLACK); 

    queue.clear(); 
    queue.add(new Point(x, y)); 

    while(!queue.isEmpty()){ 
     Point temp = queue.remove(); 
     int temp_x = temp.getX(); 
     int temp_y = temp.getY(); 

     //only do stuff if point is within pixmap's bounds 
     if(temp_x >= 0 && temp_x < pixmap.getWidth() && temp_y >= 0 && temp_y < pixmap.getHeight()) { 
      //color of current point 
      int pixel = pixmap.getPixel(temp_x, temp_y); 
      if (!painted[temp_x][temp_y] && pixel != blackColor) { 
       painted[temp_x][temp_y] = true; 
       pixmap.drawPixel(temp_x, temp_y, pickedColorInt); 

       queue.add(new Point(temp_x + 1, temp_y)); 
       queue.add(new Point(temp_x - 1, temp_y)); 
       queue.add(new Point(temp_x, temp_y + 1)); 
       queue.add(new Point(temp_x, temp_y - 1)); 

      } 
     } 
    } 
} 

यह अपेक्षा के अनुरूप काम नहीं करता है। उदाहरण के लिए, निम्नलिखित परीक्षण छवि पर: enter image description here

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

+3

मुझे लगता है कि आप सही पैरामीटर में * नहीं * गुजर रहे हैं। ऐसा लगता है जैसे आपका वाई समन्वय गलत है, क्योंकि आप जिस कुछ समन्वय प्रणाली का उपयोग कर रहे हैं वह वाई-अप है और दूसरा वाई-डाउन है। Y y = pixmap.getHeight() - y' को उलटा करने के लिए अपनी विधि की शुरुआत में कोशिश करें। – noone

+0

वाह, जिसने मेरे दिमाग को भी पार नहीं किया। यह एक libGDX प्रोजेक्ट है जहां उदाहरण के लिए दृश्य निर्देशांक, sprites, आयत और इसी तरह की वस्तुओं में निचले बाएं में एक (0, 0) समन्वय होता है। लेकिन मुझे लगता है कि पिक्समैप (0, 0) के लिए शीर्ष बाएं का उपयोग करता है। धन्यवाद! –

+0

क्या इससे आपकी समस्या हल हो गई? अगर ऐसा होता है, तो मैं इसे एक उत्तर के रूप में लिखूंगा, इसलिए यह अनुत्तरित नहीं दिखाई देगा। – noone

उत्तर

2

आपका एल्गोरिदम सही है, केवल आपके इनपुट पैरामीटर नहीं हैं।

यादृच्छिक आयताकारों को रिक्त किया जाएगा जहां मैंने क्लिक किया है। उदाहरण के लिए, बैंगनी आयताकार के नीचे कहीं भी क्लिक करना बैंगनी आयत को दोहराएगा। बैंगनी आयताकार के अंदर क्लिक करने से हरे आयत को याद किया जाता है।

यदि आप तस्वीर को देखते हैं, तो रंगीन आयत वास्तव में यादृच्छिक नहीं हैं। वास्तविक समस्या एक गलत वाई-समन्वय है। विशेष रूप से आपका वाई-समन्वय उलटा हुआ है।

ऐसा इसलिए है क्योंकि अधिकांश समय लिबजीडीएक्स निचले बाएं, वाई-अप समन्वय प्रणाली का उपयोग करता है, लेकिन Pixmap के मामले में यह शीर्ष-बाएं वाई-डाउन है।

इसके लिए एक साधारण फिक्स केवल y = pixmap.getHeight() - y कर वाई-वैल्यू को उलटा करना है।

+0

धन्यवाद @noone मैंने इस लाइब्रेरी पर इस समाधान का उपयोग किया है: https://github.com/Gornova/StrategyGameUtils – Vokail

संबंधित मुद्दे