2017-09-13 49 views
-1

我想知道第31行上loc位置的公式,但我無法弄清楚。任何人都可以指導我解決問題嗎?處理:由於嵌套循環而在陣列中定義位置時遇到的困難

PImage theImage; 
int cellSize = 6; // dimension of a cell where logic is applied 
int cols, rows; // number of rows and columns based on cellsize 
int col; // column in the cell 
int row; // row in the cell 
float edgeR; // (amount of red in the corners) 
float edgeB; // (amount of blue in the corners) 
float edgeG; // (amount of green in the corners) 
float middleR; // (amount of red in the center) 
float middleB; // (amount of blue in the center) 
float middleG; // (amount of green in the center) 

void setup() 
{ 
    size(1570,1112); // fits the image 
    theImage = loadImage("im.png"); // load the image 
    cols = width/cellSize ; // number of colums in the grid of the image 
    rows = height/cellSize ; // number of rows in the grid of the image 
} 

void draw() 
{ 
    background(0); 
    loadPixels(); 
    theImage.loadPixels(); // load every pixel of the image in an array 
    image(theImage,0,0); // display the image at pos 0 0 
    for (int i=0; i< rows;i++) { 
    for (int j = 0; j< cols;j++) { // loop matrix of cells   
     for (int x = i*cellSize; x<i*cellSize+cellSize;x++) { 
     for (int y = j*cellSize; y<j*cellSize+cellSize;y++) { // 
      loop every pixel of the cell 

      ---> int loc = (i*cellSize+x) + 
      (j*cellSize*width+y*cellSize*width); // grrrrr <----- 
       float r = red(theImage.pixels[loc]); // red value 
       float g = green(theImage.pixels[loc]); // green value 
       float b = blue(theImage.pixels[loc]); // blue value    
       if (x - i*cellSize <= cellSize /3) { // it is in a column 1 
      col = 1; 
      } 
      else if (x - i*cellSize >= cellSize*2/3) { // it is in a column 3 
      col = 3; 
      } 
      else { 
      col = 2; // it is in a column 2 
      } 
      if (y - j*cellSize <= cellSize /3) { // it is in row 1 
      row = 1; 
      } 

      else if (y - j*cellSize >= cellSize*2/3) { // it is in row 3 
      row = 3; 
      } 
      else { // in row 2 
      row = 2; 
      }      
      if (col == 1 & row ==1 || (col == 3 & row == 3) || (col == 1 & row == 3) || (col == 3 & row == 1)) { 
       edgeR = edgeR + r; // aggregate the edge color values 
       edgeG = edgeG + g; 
       edgeB = edgeB + b;    
      } 
     else { 
       middleR = middleR + r; // aggregate the center color values 
       middleG = middleG + g; 
       middleB = middleB + b; 

      // here some magic will be applied if there would be no ArrayIndexOutOfBoundsException: 1745840 error 

     }  
    }  
    } 
} 
} 
} 

當我運行代碼的輸出窗口凍結,我得到一個ArrayIndexOutOfBoundsException:1752120錯誤/如果我把調試就這還要不停地說:調試忙。

我敢肯定祿位置不正確,但我沒有一個知道如何解決公式。此外,嵌套for循環也可能是問題。

非常感謝您的幫助,非常感謝。

一切順利,

+0

四重嵌套循環...有什麼可能出錯! :)嚴肅地說,註釋掉除最外層循環以外的所有內容,並且放入一些調試打印語句來測試你期望的循環邊界。然後每次添加一個循環來診斷問題的真實位置。 – Jeremy

+0

謝謝Jeremy,但我的診斷是在第31行,我嘗試給r賦值,根據位置loc,因爲loc是計算loc的公式不正確,它會得到一個worong值並導致錯誤。或者你的意思是說這個診斷是不正確的? –

+1

要與下面的答案對話...從較小的圖像開始。比如5 x 5或10 x 10 ...可調試的東西。使用紙或excel來計算您的期望值的上限,然後驗證您的公式是否給您預期的結果。 – Jeremy

回答

-1

這是太多的代碼來問我們來調試你。

你需要break your problem down into smaller steps,並做一些debugging隔離您的問題。請注意,調試的第一步是用一張紙和一支鉛筆遍歷代碼,而不是調試器本身!

你必須能夠回答這些類型的問題:當你的錯誤是什麼每一個變量的值? i,j,xy有什麼值? loc有什麼價值? theImage.pixels有多少個索引?

請注意,我不是要求你告訴我這些問題的答案。你需要自己回答,所以你可以開始找出哪一行代碼不符合你的預期。

如果您仍然無法弄清楚,你需要縮小您的問題降到MCVE

而且,只是一個側面說明:你不應該寫這樣整個程序,然後只測試它,當它完成。你需要在更小的塊中工作,並確保塊在繼續前正常工作。在你的例子中,你可能已經開始了最外層的for循環,並確保迭代你期望的值。然後第二個for循環等。你應該也可能重構你的代碼,所以你沒有四重嵌套的for循環。

0

我改變

int loc = (i*cellSize+x) + 
     (j*cellSize*width+y*cellSize*width); 

int loc = x + y*width; 

然後它的作品。唯一的問題是,如果我使用一個大的圖像,我會得到ArrayIndexOutOfBoundsException,這可能是由超過數組中索引的最大數量引起的。謝謝你的協助!