我在理解 Bresenham 的线条绘制算法中的误差累积部分如何工作时遇到问题。
假设我们有x1
和x2
。让我们假设x1 < x2
,y1 < y2
和(x2 - x1) >= (y2 - y1)
为简单起见:
让我们从简单的画线开始。它看起来像:
void DrawLine(int x1, int y1, int x2, int y2)
{
float y = y1 + 0.5f;
float slope = (float)(y2 - y1) / (x2 - x1);
for (int x = x1; x <= x2; ++x)
{
PlotPixel(x, (int)y);
y += slope;
}
}
让我们让它更 Bresenham'ish,并将 y 的整数和浮点部分分开:
void DrawLine(int x1, int y1, int x2, int y2)
{
int yi = y1;
float yf = 0.5f;
float slope = (float)(y2 - y1) / (x2 - x1);
for (int x = x1; x <= x2; ++x)
{
PlotPixel(x, yi);
yf += slope;
if (yf >= 1.0f)
{
yf -= 1.0f;
++yi;
}
}
}
yf
在这一点上,我们可以将它们相乘slope
以2 * (x2 - x1)
使它们成为整数,不再需要浮点数。我明白那个。
我不完全理解的部分是:
if (yf >= 1.0f)
{
yf -= 1.0f;
++yi;
}
这实际上是如何工作的?为什么我们要与 1.0 进行比较然后递减呢?
我知道 Bresenham 的基本问题是:如果我们目前处于像素状态x, y
并且我们想要绘制下一个,我们应该选择x + 1, y
还是x + 1, y + 1
?- 我只是不明白那张支票是如何帮助我们回答这个问题的。
有些人称之为错误术语,有些人称之为阈值,我只是不明白它代表什么。
任何解释表示赞赏,谢谢。