2016-07-11 5 views
2

scatterメソッドは元の画像を取り込み、そのピクセルを散布します。 メソッド "randomSelect"ではなく、複数行のコードを使用するとプログラムがうまく動作します。プログラムは無限ループになるようです "randomSelect"メソッドを使用するとイメージは変わりません。"randomSelect"メソッドを使用して複数行のコードを置き換えたときにプログラムが機能しないのはなぜですか?

void scatter(GBufferedImage &img, Grid<int> original, int row, int col) { 
    int degree; 
    while (true) { 
     degree = getInteger("Enter degree of scatter [1-100]: "); 
     if (degree >=1 && degree <= 100) break; 
    } 

    Grid<int> newImg(row, col); 


    for (int i = 0; i < row; i++) { 
     for (int j = 0; j < col; j++) { 

     /* int newRow = -1; 
      int newCol = -1; 
      while (!original.inBounds(newRow, newCol)) { 
       newRow = randomInteger(max(i - degree, 0), min(i + degree,original.numRows())); 
       newCol = randomInteger(max(j - degree, 0), min(j + degree,original.numRows())); 
      } 
      newImg[i][j] = original[newRow][newCol]; */ // work properly 

     newImg[i][j] = randomSelect(original, i , j, degree); // do not work 

     } 
    } 

    img.fromGrid(newImg); 
} 



int randomSelect(Grid<int> original, int i, int j, int degree) {  // do not work 
    int newRow = -1; 
    int newCol = -1; 
    while (!original.inBounds(newRow, newCol)) { 
     newRow = randomInteger(max(i - degree, 0), min(i + degree,original.numRows())); 
     newCol = randomInteger(max(j - degree, 0), min(j + degree,original.numRows())); 
    } 

    return original[newRow][newCol]; 
} 
+1

おそらく、参照することにより'グリッド original'を通過したいです。 –

+0

それは動作します。しかし、なぜ私はオリジナルのコピーを渡すことができないのですか? –

答えて

2

あなたが参照としてオリジナル渡す必要があります: `グリッド &original`:

int randomSelect(Grid<int>& original, int i, int j, int degree) {  // will work 
+0

それは動作します。しかし、なぜ私はオリジナルのコピーを渡すことができないのですか? –

+0

@ZuweiShuiグリッドのコピーコンストラクタが実装されているかどうか、またどのように実装されているかはわかりません。それにもかかわらず、参照を渡す方が効率的です。 –

+0

私のプログラムの理由は無限ループに入り、元のコピーを渡すと画像が変化しないようですが、効率が悪いです。そうですか? –

関連する問題