在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;
        }
    }
}

拿这段代码去输出图片,得到:

Untitled

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