private boolean[][] computeMainOutline(boolean[][] outline) {
int pixelValue[][] = new int [width][height];
for(int x = 0; x < width; x++)
for(int y = 0; y < height; y++)
if(pixelValue[x][y] == 0) {
ArrayList<Point2D.Double> path = new ArrayList<>();
findPath(x, y, outline, pixelValue, path);
}
return new boolean[1][1]; // to avoid compilation error
}
private void findPath(int x, int y, boolean[][] outline, int pixelValue [][], ArrayList<Point2D.Double> path) {
path.add(new Point2D.Double(x, y));
if(x > 0 && outline[x - 1][y] == true) // check right
findPath(x - 1, y, outline, pixelValue, path);
if(x < width && outline[x + 1][y] == true) // check left
findPath(x + 1, y, outline, pixelValue, path);
if(y < height && outline[x][y + 1] == true) // check up
findPath(x, y + 1, outline, pixelValue, path);
if(y > 0 && outline[x][y - 1] == true) // check down
findPath(x, y - 1, outline, pixelValue, path);
}
上述方法給出StackOverflowError
,我不知道爲什麼。遞歸堆棧溢出和奇數對象參考Java
方法computeMainOutline
遍歷整個outline
數組和pixelValue
數組,這兩個數組的大小相同。如果沒有爲特定座標計算「值」,那麼findPath
函數將遞歸地計算路徑。路徑基本上是多少個「真」數組元素彼此相鄰。計算值的方法沒有添加,但我的第一個問題是找到路徑。
此外,如果我在path.add(new Point2D.Double(x, y));
之後立即打印path.add(new Point2D.Double(x, y));
打印path.size()
內部的遞歸方法,大小順序不一致它可能會打印(1,2,3,4,2,3,4),爲什麼?
UPDATE
更正像這樣,但它仍然會引發一個堆棧溢出...
private boolean[][] computeMainOutline(boolean[][] outline) {
int pixelValue[][] = new int [width][height];
boolean visited[][] = new boolean[width][height];
for(int x = 0; x < width; x++)
for(int y = 0; y < height; y++)
if(visited[x][y] == false) {
ArrayList<Point2D.Double> path = new ArrayList<>();
findPath(x, y, outline, pixelValue, path, visited);
}
return new boolean[1][1]; // to avoid compilation error
}
private void findPath(int x, int y, boolean[][] outline, int pixelValue [][], ArrayList<Point2D.Double> path, boolean visited [][]) {
path.add(new Point2D.Double(x, y));
visited[x][y] = true;
if(x > 0 && visited[x - 1][y] == false && outline[x - 1][y] == true) // check right
findPath(x - 1, y, outline, pixelValue, path, visited);
if(x < width - 1 &&visited[x + 1][y] == false && outline[x + 1][y] == true) // check left
findPath(x + 1, y, outline, pixelValue, path, visited);
if(y < height - 1 && visited[x][y + 1] == false && outline[x][y + 1] == true) // check up
findPath(x, y + 1, outline, pixelValue, path, visited);
if(y > 0 && visited[x][y - 1] == false && outline[x][y - 1] == true) // check down
findPath(x, y - 1, outline, pixelValue, path, visited);
}
如果你不標記已經訪問過的大綱元素'findPath'會無限地重複,因爲你將被添加到路徑相同的點 – csharpfolk