此功能的目标是根据像素在绘画界面中填充对象。网格是可以在其中添加形状并可以单击填充按钮的画布窗口,以便可以单击给定的形状并将其填充。我的算法的工作方式是在屏幕上的某一点单击并获得相应的颜色-> Paint pc = mesh [x] [y]。或者,mesh [x] [y] =绘画;用我们想要的颜色绘制点。
我首先将边界设为我的第一个if语句,这样当我通过递归增加和减少y和x时,我不会超出范围。以下if语句检查我们要填充其他颜色的形状内单击的第一种颜色是否等于该时刻的该颜色。这使我们可以在不结束形状的情况下停在形状末端。
我有四个递归调用,顺序无关紧要。 到执行这四个递归调用时,形状将被边到边探索(沿负和正x和y方向)。
我正在尝试使用堆栈将其转换为迭代。我将像递归激活堆栈一样使用此堆栈。我未能将此递归实现转换为迭代实现的失败尝试在第一段代码下面。
** 更具体地说,我在使用迭代和堆栈来处理每个递归调用时遇到了麻烦。我知道我会将x和y之类的内容(放置在对象迭代中)压入堆栈中。我知道以后我会弹出这些对象中的每一个,以便稍后在其中抓取元素。我相信我将通过画出我要抓住的每个x和y来填充此形状的新颜色。 **
这是我创建的递归函数。
public void Fill(int x, int y, Paint[][]mesh, Paint pc)
{
if(x >= 0 && y >= 0 && x < mesh.length && y < mesh.length)
{
if(pc.equals(mesh[x][y]))
{
mesh[x][y] = paint;
Fill(x,y-1,mesh,pc);
Fill(x,y+1,mesh,pc);
Fill(x+1,y,mesh,pc);
Fill(x-1,y,mesh,pc);
}
else if (!(pc.equals(mesh[x][y])))
{
//System.out.println("PC: " + pc + "vs. " + mesh[x][y]);
//System.out.println("DONE");
}
反复尝试;有指导吗?我不认为这是翻译的尾随递归。
public void iterateFill(int x, int y, Paint[][]mesh, Paint pc) {
Stack<iterate> ChgPix = new Stack<iterate>();
iterate itStack = new iterate(x, y);
ChgPix.push(itStack); //push itstack onto chgpi
while (!ChgPix.isEmpty() && pc.equals(mesh[x][y])) // keep in bounds
{
if (pc.equals(mesh[x][y+1]) && pc.equals(mesh[x][y-1]) && pc.equals(mesh[x+1][y]) && pc.equals(mesh[x-1][y]) ) {
ChgPix.push(new iterate(x, y+1));
y = y +1;
ChgPix.push(new iterate(x, y-1));
y = y-1;
System.out.println(itStack.x + itStack.y);
ChgPix.push(new iterate(x+1, y));
x = x+1;
System.out.println(itStack.x + itStack.y);
ChgPix.push(new iterate(x-1, y));
x = x-1;
System.out.println(itStack.x + itStack.y);