0

ブレゼンハムの浮動小数点アルゴリズムには、私を苛立たせる何かがあります。

アルゴリズムは以下のとおりです。

void line(x0, x1, y0, y1)
{
  int deltax = x1 - x0;
  int deltay = y1 - y0;
  float error = 0;
  float deltaerr = Math.abs((float)deltay / (float)deltax);
  int y = y0

  for(int x=x0;x<=x1;x++)
  {
    SetPixel(x,y)
    error = error + deltaerr
    if (error >= 0.5)
    {
             y = y + 1
             error = error - 1.0
    }
  }
}

Y=0.6Xを描画したいとします。したがって、x = 0の最初のステップでは、エラーは0.6に設定され、ifステートメントとyが増加します。エラーは-0.4に設定されます。-0.4は次のステップでどのように役立ちますか?

だから私の問題はこのコード行にあります:

error = error - 1.0

エラーを1つ減らす必要があるのはなぜですか?再調整のためにこれを行うことを読みました!それはどのように私たちを助けることができますか?

4

2 に答える 2

5

誤差が蓄積されます。ピクセルの半分よりも大きい場合、線は 1 ピクセル上に移動し、エラーを再度ピクセル全体で修正する必要があります。

単純にエラーをゼロにした場合、エラーの一部だけが取り消されるため、線が時期尚早に再びステップし、間違った勾配になります。

y = 0.6x の例では、エラーを計算してゼロにすると、次のようになります。

error = 0;
plot pixel;
increment error. error = 0.6;
error > 0.5, so move over and reset error to 0;
plot pixel;
increment error. error = 0.6;
error > 0.5, so move over and reset error to 0;
plot pixel;
increment error. error = 0.6;
error > 0.5, so move over and reset error to 0;
...

したがって、線の勾配は実際には 1 です。実際、勾配 >= 0.5 の線はすべて同じ結果になりますが、これは明らかにあまり役に立ちません。

正しく行う場合:

error = 0;
plot pixel;
increment error. error = 0.6;
error > 0.5, so move over and subtract one; error = -0.4;
plot pixel;
increment error. error = 0.2;
plot pixel;
increment error. error = 0.8;
error > 0.5, so move over and subtract one; error = -0.2;
...

誤差が固定小数点計算の小数部として機能しているため、直線の勾配は正しくなります。

于 2012-12-06T17:05:43.340 に答える
0

errorideal_y-current_y

ループの次の反復に入ったとき、 にx触れずに増加しyました。この操作error=error+deltaerrの後の更新です。error

をインクリメントすることにした場合は、y再び を更新する必要があります。errorerror=error-1

于 2012-12-06T17:01:26.343 に答える