1

for ループを使用して円のパターンを生成しようとしています。ただし、実行すると、9 番目の円のリングが非常にわずかであることを除いて、すべてが正常に見えます。その円の数字のプリントアウトを見ると、すべて問題ないように見えるので、何が問題なのかわかりません。ただし、そのリングの角度の値に 1 を追加すると。つまり、j (コメントアウトされたコード) はほとんど修正されます。

なぜこれが起こるのか考えてみてください。すべての数値を調べたところ、考慮していない数学エラーであるか、明らかな何かが欠けているとしか思えません。

ありがとう!

ocd トリガー警告

          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);
            }
          }
4

3 に答える 3

2

segmentをとして取得しfloatますが、 を使用しintて度数を計算します。

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

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

これが丸め誤差の原因です。

そして、それiよりも大きな値を取得しようとすると60、プログラムは決して終了しません。

于 2013-09-23T00:02:50.160 に答える
2

では、重要な順に 3 つ。そのうちの 2 つは、すでに言及されています。

1) s をきれいにしintます。変数iは である可能性がありますがint、他のものではなく (特にj、カウンターやインデックスではなく角度であるため)、すべての数学演算で数値が として扱われるようにする必要がありますdouble。定数をdoubles として指定するところまで行ってください (たとえば、 の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);
  }
}
于 2013-09-23T00:37:18.303 に答える
1

doublefloat の代わりに使用して、表現エラーを最小限に抑えます。

for ループを変更してエラーを減らします。

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

jこれにより、より正確である可能性が高いさまざまな値が得られます。

于 2013-09-23T00:17:03.177 に答える