S.A*_*hid 0 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
}
}
}
Run Code Online (Sandbox Code Playgroud)
假设我们想要绘制Y = 0.6X.所以在x = 0的第一步:错误将设置为0.6,我们将遇到if语句,y将增加.和错误将设置为-0.4.-0.4如何在下一步帮助我们?
所以我的问题是这行代码:
error = error - 1.0
Run Code Online (Sandbox Code Playgroud)
为什么我们应该将错误减少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;
...
Run Code Online (Sandbox Code Playgroud)
所以该线实际上具有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;
...
Run Code Online (Sandbox Code Playgroud)
该线具有正确的梯度,因为误差充当定点计算的小数部分.
归档时间: |
|
查看次数: |
568 次 |
最近记录: |