2013-09-22 97 views
1

我一直在嘗試使用for循環來生成一個圓圈模式。然而,當它運行的時候,除了第9圈這樣輕微的圈外,一切看起來都很好。看過那個圓圈的數字後,一切看起來都很好,所以我無法弄清楚什麼是錯誤的。但是,當我爲該環的角度值添加一個時。即j(註釋掉的代碼)它幾乎可以糾正。奇怪的浮點錯誤?

任何想法爲什麼會發生這種情況。看了所有的數字,我只能認爲這是我沒有考慮到的一些數學錯誤,或者我錯過了明顯的東西。

謝謝!

ocd trigger warning

  ellipse(325,325,15,15);  
      float div = 1; 
      for (int i = i; i < 25; i++) 
      { 
      div = i*6 
      float segment = 360/div; 
      float radius = (i*20); 
      for (int j = 0; j < 360; j+=segment) 
      { 
       //if (i==8) 
       //{ 
       //println("before " + j); 
       //j+=1; 
       //println("after " + j); 
       //} 
       float x = 325 + (radius*cos(radians(j))); 
       float y = 325 + (radius*sin(radians(j))); 
       ellipse(x, y, 15, 15); 
      } 
      } 
+2

更改所有花車雙打,全部更改詮釋師雙師。創建一個[sscce](http://sscce.org)讓我們*親自體驗*您的問題。 –

回答

2

好的,三件事,按重要性排序。其中兩個已經被提及。

1)清理int s。變量i可以是int,但是沒有其他人(尤其是j,因爲它是一個角度,而不是計數器或索引),並且您要確保所有數學運算將數字視爲double s。甚至可以指定常量爲double(例如,使用1d而不是1)。

2)避免累積錯誤。在您的內圈for循環中,您重複添加到j。壞。相反,根據您計算的圓圈直接計算角度。 3)使用double,不是float。你會得到更好的精度。

我會做這樣的......

ellipse(325,325,15,15);  
for (int i = i; i < 25; i++) 
{ 
    double div = i*6d; 
    double radius = (i*20d); 
    for (int j = 0; j < div; j++) 
    { 
    double theta = j * 360d/div; 
    double x = 325d + (radius*cos(radians(theta))); 
    double y = 325d + (radius*sin(radians(theta))); 
    ellipse(x, y, 15, 15); 
    } 
} 
+0

非常感謝! – user2457072

2

你得到segment作爲float,但你使用int計算度。

for (int j=0; j < 360; j+=segment) 

float x = 325 + (radius*cos(radians(j))); 

這是什麼原因造成的舍入誤差。

如果您讓i獲得大於60的值,程序將永不結束。

+0

非常感謝! – user2457072

1

使用double代替float來最小化表示錯誤。

更改for循環以減少錯誤。

for (int k = 0; k < div; k++) { 
    int j = k * 360/div; 

這會給你不同的值j這可能是更正確的。

+0

非常感謝! – user2457072