2013-03-06 38 views
0

我想爲我的程序使用我擁有的線類製作填充工具。我的填充桶會記錄所有需要繪製的線條,以便填充一個區域,例如:使用行創建填充工具工具

http://i.imgur.com/Cywh8xU.png - 在此圖像中,我點擊的點是紅色圓圈,比每行會找到2點起點和終點)。我顯然沒有畫出所有的線條,但這是我擁有的基本概念。

我遇到的問題是圖像最終看起來像這樣,我不明白爲什麼。 http://i.imgur.com/IXHgEf2.jpg

這裏是我發現所有的線,所以遠代碼:

公共類FillBucket {

private BufferedImage image; 
private Fill currentFill; 
private Line currentLine; 

private Queue<Point> pointsToVisit; 

@Override 
public void mousePressed(Point point) { 
    super.mousePressed(point); 

    if(pointIsOnCanvas(point)) { 
     image = new BufferedImage(getCanvas().getPreferredSize().width, getCanvas().getPreferredSize().height, BufferedImage.TYPE_INT_RGB); 
     Graphics2D g2 = (Graphics2D) image.getGraphics(); 
     getCanvas().paint(g2); 

     currentFill = new Fill(getColor()); 
     pointsToVisit = new LinkedList<>(); 
     createPoints(point, image.getRGB(point.x, point.y)); 

     getCanvas().addDrawable(currentFill); 
     getCanvas().repaint(); 
    } 
} 

private void createPoints(Point clickedPoint, int clickedColor) { 
    pointsToVisit.add(clickedPoint); 

    while(!pointsToVisit.isEmpty()) { 
     Point testPoint = pointsToVisit.poll(); 

     if(testPoint.x > 0 && testPoint.x < image.getWidth() && testPoint.y > 0 && testPoint.y < image.getHeight() 
       && image.getRGB(testPoint.x, testPoint.y) == clickedColor) { 
      while(testPoint.x > 0 && image.getRGB(testPoint.x, testPoint.y) == clickedColor) { 
       testPoint.x--; 
      } 
      currentLine = new Line(getColor(), 5); 
      currentLine.addPoint(new Point(testPoint)); 
      while(testPoint.x < image.getWidth() && image.getRGB(testPoint.x, testPoint.y) == clickedColor) { 
       pointsToVisit.add(new Point(testPoint.x, testPoint.y+1)); 
       pointsToVisit.add(new Point(testPoint.x, testPoint.y-1)); 

       image.setRGB(testPoint.x, testPoint.y, getColor().getRGB()); 
       testPoint.x++; 
      } 
      currentLine.addPoint(new Point(testPoint)); 
      currentFill.addLine(currentLine); 
     } 
    } 
} 

}

這裏是我行類的基本知識:

public class Line { 
private List<Point> points; 
private int width; 

/** 
* Create a Line 
* @param color - The color of the line 
* @param width - The width of the line 
*/ 
public Line(Color color, int width){ 
    points = new LinkedList<>(); 
    setColor(color); 
    setWidth(width); 
} 

/** 
* Add a Point to the Line 
* @param p - The Point to add to the Line 
*/ 
public void addPoint(Point p) { 
    points.add(p); 
} 

@Override 
public void draw(Graphics2D g2) { 
    super.draw(g2); 
    g2.setStroke(new BasicStroke(getWidth(), BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); 
    for(int i=1; i<points.size(); i++) 
     g2.drawLine(points.get(i-1).x, points.get(i-1).y, points.get(i).x, points.get(i).y); 
} 

}

這裏是我的填充類:

public class Fill{ 

List<Line> lines; 

/** 
* Create a Fill 
* @param color - The Color of the Fill 
*/ 
public Fill(Color color){ 
    lines = new LinkedList<>(); 
    setColor(color); 
} 

/** 
* Add a Line to the Fill 
* @param l - The Line to add 
*/ 
public void addLine(Line l) { 
    lines.add(l); 
} 

@Override 
public void draw(Graphics2D g2) { 
    super.draw(g2); 
    for(Line l: lines) { 
     l.draw(g2); 
    } 
} 

任何幫助,將不勝感激,謝謝。

+0

http://i.imgur.com/iA7XStz.jpg我無法發佈另一個鏈接,但這是另一個當我點擊已存在的行時發生的事例。 – 2013-03-06 05:29:32

回答

1

你需要改變你的createPoints(...)功能看起來像這樣:

private void createPoints(Point clickedPoint, int clickedColor) { 
    pointsToVisit.add(clickedPoint); 

    while(!pointsToVisit.isEmpty()) { 
     Point testPoint = pointsToVisit.poll(); 

     if(testPoint.x >= 0 && testPoint.x < image.getWidth() && testPoint.y >= 0 && testPoint.y < image.getHeight() 
      && image.getRGB(testPoint.x, testPoint.y) == clickedColor) { 
      while(testPoint.x > 0 && image.getRGB(testPoint.x-1, testPoint.y) == clickedColor) { 
       testPoint.x--; 
      } 
      currentLine = new Line(getColor(), 5); 
      currentLine.addPoint(new Point(testPoint)); 

      pointsToVisit.add(new Point(testPoint.x, testPoint.y+1)); 
      pointsToVisit.add(new Point(testPoint.x, testPoint.y-1)); 

      image.setRGB(testPoint.x, testPoint.y, getColor().getRGB()); 

      while(testPoint.x < image.getWidth()-1 && image.getRGB(testPoint.x+1, testPoint.y) == clickedColor) { 
       pointsToVisit.add(new Point(testPoint.x, testPoint.y+1)); 
       pointsToVisit.add(new Point(testPoint.x, testPoint.y-1)); 

       image.setRGB(testPoint.x, testPoint.y, getColor().getRGB()); 
       testPoint.x++; 
      } 
      currentLine.addPoint(new Point(testPoint)); 
      currentFill.addLine(currentLine); 
     } 
    } 
} 

(我撒了幾個= -signs到您的if條件允許你點擊到圖像的左上角還,和一對夫婦的+1 S和-1 s轉換您while條件而定)

基本上下面描述的bug,會發生什麼是你第一次後,while循環,你要麼在圖像的左邊緣,其中如果一切正常,或者testPoint指向第一個不等於clickedColor的像素,則第二個while循環立即終止。

順便說一句:如果您點擊已經設置爲填充顏色的點(即,如果clickedColor == getColor()),則您的代碼可能會鎖定。

+0

謝謝,這個工作很好。 – 2013-03-06 16:37:43