在chatpgt的修改下,代码变成了下面这样,和作者的代码有3处不同。已用红色标出。
void line_bresenham(int x0, int y0, int x1, int y1, TGAImage& image, TGAColor& color)
{
int dx = x1 - x0; // 两点之间的水平距离
int dy = y1 - y0; // 两点之间的垂直距离
bool is_steep = false; // 直线的斜率是否大于 45 度?
// 判断直线的斜率是否大于 45 度,如果是则需要按 y = x 对称
if (abs(dx) < abs(dy)){
is_steep = true;
swap(x0, y0);
swap(x1, y1);
}
// 确保 x0 <= x1
if (x0 > x1){
swap(x0, x1);
swap(y0, y1);
}
dx = x1 - x0;
dy = y1 - y0;
int sum_error = 0; // 跟踪算法的误差
float delta_error = abs(dy) * 2.0f / dx; // x 方向每前进一步时误差的变化量
int y = y0;// 当前的 y 坐标
for (int x = x0; x <= x1; x++)
{
// 根据是否需要对称去绘制像素点
is_steep ? image.set(y, x, color) : image.set(x, y, color);
// 更新误差
sum_error += delta_error;
// 如果误差超过1,根据斜率的正负来决定y坐标增加或者减少。并更新误差
if (sum_error > 1.0f)
{
y += (y1 > y0 ? 1 : -1);
sum_error -= 2.0f;
}
}
}
拿这段代码去输出图片,得到:

可以看出,本该绘制斜线的地方,却绘制了直线。所以这段代码运行的并不正确。这是因为修改了误差值后,进而影响了y直线的移动量。