Bresenham线描算法

时间:2012-12-06 16:52:18

标签: c++ c algorithm bresenham

Bresenham的浮点算法中有些东西让我烦恼。

算法如下:

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?我读过因为重新调整我们这样做了!它如何帮助我们?

2 个答案:

答案 0 :(得分:5)

累积错误。当它大于半个像素时,该行移过一个像素,然后必须再次校正错误整个像素。

如果您只是将错误归零,那么您只会取消部分错误,因此该行会过早地再次进行,并且将是错误的渐变。

在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的渐变;实际上,任何具有渐变&gt; = 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;
...

该行具有正确的渐变,因为该错误充当定点计算的小数部分。

答案 1 :(得分:0)

errorideal_y-current_y

当我们进入循环的下一次迭代时,我们增加了x而没有触及yerror=error+deltaerr是此操作后error的更新。

如果我们决定增加y,我们必须再次更新error,这就是error=error-1