How to make Bresenham algorithm working backward?

295 Views Asked by At

I got an exersise where I would like to draw a line with Bressenham algorithm. The thing is that it's working perfectly for lines who goes down and on the right, but when the line goes up or backward, it doesn't work anymore ... Does anybody can help me on that ?

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

Its working for this

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

But not for this

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

Thanks for your help !!

1

There are 1 best solutions below

1
zestones On BEST ANSWER

You are working in the first octant. If you want to draw lines in all direction you have to check the 8 octant. here is my implentation of bresenham for the 8 octant:

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