【问题标题】:Bresenham Lines Drawing AlogrithmBresenham 线描算法
【发布时间】:2012-12-06 16:52:17
【问题描述】:

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 ?我读过我们这样做是因为重新调整!它对我们有什么帮助?

【问题讨论】:

  • 你看过the real algorithm吗?因为你展示的只是部分正确
  • 那么为什么维基百科把它放在页面顶部?

标签: c++ c algorithm bresenham


【解决方案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;
...

该线具有正确的梯度,因为该误差充当了定点计算的小数部分。

【讨论】:

  • 感谢您的解释,但有没有理由选择 1 进行减法?为什么不是 0.5?
  • 在上面的解释中。误差表示像素的小数部分。当您移动超过 1 个像素时,您必须从误差中减去 1。
【解决方案2】:

errorideal_y-current_y

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

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

【讨论】:

  • 我已经注意到我们应该重新调整错误,我的问题是为什么 e=e-1 ,为什么不是 e=0 ?
  • 你的意思是 error=error+deltaerr 会将 error 设置为当前 x 的理想 y 吗?
  • 因为 Ideal_y 可能不是整数,而 current_y 始终是整数,所以修正后误差可能不为零
  • error=error+deltaerr 将错误设置为x++后的理想错误,error=error-1 将错误设置为y++后的理想错误
  • 因为 e 在减法后可能不为零。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
相关资源
最近更新 更多