如何使 Bresenham 算法反向工作?

How to make Bresenham algorithm working backward?

我有一个练习,我想用 Bressenham 算法画一条线。 问题是它对向下和向右的线路非常有效,但是当线路向上或向后时,它就不再工作了...... 有人可以帮我吗?

void    draw_line(t_data img, int xStart, int yStart, int xEnd, int yEnd)

{
    int dx;
    int dy;
    int pk;
    int x;
    int y;

dx = xEnd - xStart;
dy = yEnd - yStart;
x = xStart;
y = yStart;

while(x <= xEnd)
{
    if(pk >= 0)
    {
        printf("in if ");
        my_mlx_pixel_put(&img, x, y, 0x00FF0000);
        y = y + 1;
        pk = pk + 2 * dy - 2 * dx;
    }
    else
    {
        my_mlx_pixel_put(&img, x, y, 0x00FF0000);
        pk = pk + 2 * dy;
    }
x = x + 1;
count ++;
}
}

它正在为此工作

draw_line(img, 300, 300, 400, 360);

但不是为了这个

draw_line(img, 300, 300, 200, 260);

感谢您的帮助!!

您正在第一个八分圆工作。如果你想在所有方向上画线,你必须检查 8 八分圆。 这是我对 8 八分圆的 bresenham 的实现:

void bresenham(int x1, int y1, int x2, int y2) {    
    int dx = x2 - x1;
    int dy = y2 - y1;

    int error;
    /** first quarter */
    if(dx >= 0 && dy >= 0) {
        /** 1st octant */
        if (dx >= dy) {
            error = -dx;
            int y = y1;
            for(int x = x1; x < x2; x++) {
                draw_pixel(x, y);
                error = error + 2 * dy;
                if (error >= 0) {
                    y++;
                    error = error - 2 * dx;
                }
            }
        }
        /** 2nd octant */
        else {
            error = -dy;
            int x = x1;
            for(int y = y1; y < y2; y++) {
                draw_pixel(x, y);
                error = error + 2 * dx;
                if (error >= 0) {
                    x++;
                    error = error - 2 * dy ;
                }
            }
        }
    }
    /** second quarter */
    else if (dx <= 0 && dy >= 0) {
        /** 4th octant */
        if(dx < -dy) {
            error = dx;
            int y = y1;
            for(int x = x1; x > x2; x--) {
                draw_pixel(x, y);
                error = error + 2 * dy;
                if (error >= 0) {
                    y++;
                    error = error + 2 * dx;
                }
            }
        }
        /** 3rd octant */
        else {
            error = -dy;
            int x = x1;
            for(int y = y1; y < y2; y++) {
                draw_pixel(x, y);
                error = error - 2 * dx;
                if (error >= 0) {
                    x--;
                    error = error - 2 * dy;
                }
            }
        }
    }
    /** 3rd quarter */
    else if (dx <= 0 && dy <= 0) {
        /** 5th octant */
        if(dx <= dy) {
            error = 2 * dx;
            int y = y1;
            for(int x = x1; x > x2; x--) {
                draw_pixel(x, y);
                error = error - 2 * dy;
                if (error >= 0) {
                    y--;
                    error = error + 2 * dx;
                }
            }
        }
        /** 6th octant */
        else {
            error = 2 * dy;
            int x = x1;
            for(int y = y1; y > y2; y--) {
                draw_pixel(x, y);
                error = error - 2 * dx;
                if (error >= 0) {
                    x--;
                    error = error + 2 * dy ;
                }
            }
        }
    }
    /* 4th quarter */
    else if(dx >= 0 && dy <= 0) {
        /** 7th octant */
        if(dx < -dy) {
            error = 2 * dy;
            int x = x1;
            for(int y = y1; y > y2; y--) {
                draw_pixel(x, y);
                error = error + 2 * dx;
                if (error >= 0) {
                    x++;
                    error = error + 2 * dy ;
                }
            }
        }
        /** 8th octant */
        else {
            error = -dx;
            int y = y1;
            for(int x = x1; x < x2; x++) {
                draw_pixel(x, y);
                error = error - 2 * dy;
                if (error >= 0) {
                    y--;
                    error = error - 2 * dx;
                }
            }
        }
    }
}