スタックオーバーフロー

塗りつぶす面積を計算させるのにリカーシブコールを使っていたら。
500段くらいでスタックがあふれた・・・
面積の計算の仕方を変えるか。

現状:
ある点x,yを起点とた場合、


private int fillSub(Byte[] map, int x, int y) {
int fill = 0;

if (map[x + y * mWidth] == IS_CUTTING && map[x + y * mWidth] == IS_CUT) {
return 0;
}
map[x + y * mWidth] = IS_CUTTING;
fill++;
if (x - 1 > 0) {
loop1: for (int i = x - 1; i >= 0; i--) {
if (map[i + y * mWidth] == IS_MAP) {
map[i + y * mWidth] = IS_CUTTING;
fill++;
if (y - 1 > 0) {
fill += fillSub(map, i, y - 1);
}
if (y + 1 < mHeight) {
fill += fillSub(map, i, y + 1);
}
} else {
break loop1;
}
}
}
if (x + 1 < mWidth) {
loop2: for (int i = x + 1; i <= mWidth - 1; i++) {
if (map[i + y * mWidth] == IS_MAP) {
map[i + y * mWidth] = IS_CUTTING;
fill++;
if (y - 1 > 0) {
fill += fillSub(map, i, y - 1);
}
if (y + 1 < mHeight) {
fill += fillSub(map, i, y + 1);
}
} else {
break loop2;
}
}
}

return fill;
}

としていたのを
x0,y, x,y0 などを配列にして、その配列回数分 recursive Call を繰り返すという方式にしてみた。

private int fillSub(Byte[] map, int x, int y) {
Log.d(Defines.TAG, "fillSub mLoop=" + mLoop + " x,y=" + x + "," + y);
int fill = 0;

ArrayList fillPoints = new ArrayList();

if (map[x + y * mWidth] == IS_CUTTING && map[x + y * mWidth] == IS_CUT) {
return 0;
}
map[x + y * mWidth] = IS_CUTTING;
fill++;
if (x - 1 > 0) {
loop1: for (int i = x - 1; i >= 0; i--) {
if (map[i + y * mWidth] == IS_MAP) {
map[i + y * mWidth] = IS_CUTTING;
fill++;
if (y - 1 > 0) {
if (map[i + (y - 1) * mWidth] == IS_MAP) {
fillPoints.add(new Point(i, y - 1));
}
}
if (y + 1 < mHeight) {
if (map[i + (y + 1) * mWidth] == IS_MAP) {
fillPoints.add(new Point(i, y + 1));
}
}
} else {
break loop1;
}
}
}
if (x + 1 < mWidth) {
loop2: for (int i = x + 1; i <= mWidth - 1; i++) {
if (map[i + y * mWidth] == IS_MAP) {
map[i + y * mWidth] = IS_CUTTING;
fill++;
if (y - 1 > 0) {
if (map[i + (y - 1) * mWidth] == IS_MAP) {
fillPoints.add(new Point(i, y - 1));
}
}
if (y + 1 < mHeight) {
if (map[i + (y + 1) * mWidth] == IS_MAP) {
fillPoints.add(new Point(i, y + 1));
}
}
} else {
break loop2;
}
}
}

Point p = null;
for (int i = 0; i < fillPoints.size(); i++) {
p = fillPoints.get(i);
if (map[p.x + p.y * mWidth] == IS_MAP) {
mLoop++;
fill += fillSub(map, p.x, p.y);
mLoop--;
}
}

return fill;
}

しかしこれでもスタックオーバーフロー・・・