我最近在阅读 Alois Zingl 的一篇关于光栅化算法的论文。在我完全失去对算法的理解之前,我没有走多远。根据我的研究,我相信这个算法是 Bresenham 画线算法的某种版本。话虽这么说,但在某些方面它似乎不像我读过的那样。我在 OpenGL 中测试了该算法,它运行良好,但我不知道如何......这是 C/C++ 样式语法中的代码:
void plotLine(int x0, int y0, int x1, int y1)
{
int dx = abs(x1 - x0), sx = x0<x1 ? 1 : -1;
int dy = -abs(y1 - y0), sy = y0<y1 ? 1 : -1;
int err = dx+dy, e2;
for (;;)
{
setPixel(x0,y0);
e2 = 2*err;
if (e2 >= dy)
{
if (x0 == x1)
break;
err += dy;
x0 += sx;
}
if (e2 <= dx)
{
if (y0 == y1)
break;
err += dx;
y0 += sy;
}
}
}
我曾尝试对 Bresenham 的算法进行研究,但这似乎并不相同,因为它适用于所有斜坡。我已经对等式进行了一些数学运算,但对我来说没有任何意义的一件事是与 和 进行比较意味着dy
什么dx
。在我尝试从中派生算法时y = mx + b
,这没有任何意义。我的另一个问题是为什么err
每帧乘以两个。我不明白这一点。这是我画线的尝试。它并没有真正起作用,但它可能有助于理解我的大脑来自的方向。(为了简化,我删除了x0
和y0
)提前致谢!
void plotLine(uint32_t* bitmap, int size, int endX, int endY)
{
int a = 0, b = 0;
int y = endY, x = endX;
int error = a * x;
int target = y * b;
for (;;)
{
bitmap[b * size + a] = 0xffffffff;
if (error >= target)
{
if (b == x)
break;
target += y;
b++;
}
if (error <= target)
{
if (a == y)
break;
error += x;
a++;
}
}
}