2013-09-22 141 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