如何使Bresenham算法向后工作?

3

我遇到了一个练习题,需要使用 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);

感谢您的帮助!!

6
您没有初始化pk - ikegami
3
x <= xEnd 时,你的代码明显期望 x 是递增的。如果不是这种情况,你可以交换坐标。然后你只需要关心 y 是否需要处理不同的情况即可。 - Gerhardh
1
和 y 坐标 :) - Weather Vane
3
请查看此维基百科页面了解该算法。通常情况下,您只需要实现其中一个八分之一的部分,并使用其他方法来实现其他七个八分之一的部分。 - the busybee
你需要同时交换 xy - Gerhardh
显示剩余6条评论
1个回答

1

您正在第一象限工作。如果要在所有方向上绘制线条,您需要检查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;
                }
            }
        }
    }
}

哦,非常感谢。好的,我明白了!!感谢你的帮助和时间!:) - rpoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接