我想使用我所拥有的线类为我的程序制作一个填充桶工具。我的填充桶会记录为了填充区域而需要绘制的所有线条,例如:
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);
}
}
这是我的Fill课程:
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 :(得分: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);
}
}
}
(我在您的=
条件中添加了几个if
- 符号,以便您也可以点击图片的左上角,以及几个+1
和-1
进入while
条件以修复下面描述的错误
基本上,发生的事情是在你的第一个while循环之后你或者在图像的左边缘,在这种情况下一切正常,或者你的testPoint
指向第一个不等于clickedColor的像素此外,在这种情况下,你的第二个while循环立即终止。
BTW:如果你点击已经设置为填充颜色的点(例如clickedColor == getColor()
),你的代码可能会锁定。