Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make Bresenham algorithm working backward?

Tags:

c

bresenham

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 !!

like image 380
rpoder Avatar asked Mar 04 '26 17:03

rpoder


1 Answers

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;
                }
            }
        }
    }
}
like image 104
zestones Avatar answered Mar 07 '26 09:03

zestones



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!