gpt4 book ai didi

c++ - Bresenham 画线算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:35:04 24 4
gpt4 key购买 nike

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

最佳答案

错误是累积的。当它大于半个像素时,线将移动一个像素,然后必须再次纠正错误,再纠正一个完整的像素。

如果您简单地将错误归零,则只会抵消部分错误,因此该线会过早地再次步进,这将是错误的梯度。

在您的 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;
...

这条线有正确的梯度,因为错误是作为定点计算的小数部分。

关于c++ - Bresenham 画线算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13748531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com