2013-12-15 81 views
-2

採用值的NaN我有這個類上的圖像序列的像素的工作原理雙後0/0

private int makeRSR(int x, int y) 
    { 
     double bRed = 0;double bGreen = 0; double bBlue = 0; 
     for(int k: sequence.keySet()) 
     { 
     BufferedImage img = sequence.get(k); 
     for(int i=0; i<iteration; i++){ 
      for(int j=0;j<spray_int; j++){ 
       int dist= ((int)(dis_int*Math.random())); 
       double theta=((int)(361*Math.random())) ; 
       double inc_x=dist * Math.cos((theta*(Math.PI/180))); 
       double inc_y=dist * Math.sin((theta*(Math.PI/180))); 
       int row=Math.abs((int)(inc_y+y)); 
       int column=Math.abs((int)(inc_x+x)); 
       if(row<1 || column<1 || row>altI-1 || column>largI-1){ 
        row=Math.abs((int) ((altI-1)*Math.random())); 
        column=Math.abs((int) ((largI-1)*Math.random())); 
       } 
       Color c = new Color(img.getRGB(column,row)); 
       red.add(c.getRed()); 
       green.add(c.getGreen()); 
       blue.add(c.getBlue()); 
      } 
      Color c = new Color(img.getRGB(x,y)); 
      red.add(c.getRed()); 
      green.add(c.getGreen()); 
      blue.add(c.getBlue()); 

      double maxR=max(red); 
      double maxG=max(green); 
      double maxB=max(blue); 

      bRed += ((((double)c.getRed())/(maxR))*255.00); 
      bGreen += ((((double)c.getGreen())/(maxG))*255.00); 
      bBlue += ((((double)c.getBlue())/(maxB))*255.00); 

      red.clear();green.clear();blue.clear(); 
     } 
    } 

    redValue=0;greenValue=0;blueValue=0; 
    redValue= (int) (bRed/(iteration*(sequence.size()))); 
    greenValue= (int) (bGreen/(iteration*(sequence.size()))); 
    blueValue=(int) (bBlue/(iteration*(sequence.size()))); 

    bRed=0.0;bGreen=0.0;bBlue=0.0; 

    return new Color(redValue,greenValue,blueValue).getRGB(); 
} 

的問題是,有時c.getRed()和MAXR都爲0(對於相同其他渠道),所以bRed失去其內容並且看重NaN,而且它永遠不會改變。是否有錯誤,我錯過了,還是必須通過添加檢查來防止0/0? 謝謝,再見

+2

一個簡單的方法來避免它來決定你想要發生什麼,併產生一個避免這種情況的等式。例如'bRed + = 255.0 * c.getRed()/(maxR + 1e-3);' –

+0

@PeterLawrey使用'if',然而,更清潔,恕我直言更簡單。 –

+0

@ Anony-Mousse'if'或'maxR == 0? 0.0:......'可以更清楚,尤其是如果你想要的行爲不容易適合方程式。 –

回答

2

由於0/0是一個未定義的數字,您需要決定如何處理它。

  1. 找出爲什麼你在當前和最大紅色值都得到0並防止它。師0的
  2. 結果集(或任意數量的你決定要獲得期望的結果),如果兩個c.getRed()maxR爲0
1

因爲被零除是一個錯誤,它會導致NaN,代表不是數字。涉及NaN的後續操作也將導致NaN,這就是爲什麼它的價值從未改變之後。

你應該明確檢查零分之前的分工,以防止零除。

相關問題