绘制连接 2 点的像素

Drawing pixels which connect 2 points

我正在尝试在小地图上绘制玩家的方向。我有画的终点和起点。我想将两者连接起来以实际绘制玩家面对的方向。 我使用玩家方向 X 和 Y 找到了终点。 我正在处理像素。

我只能使用我学校的图书馆作画 window。

这是我获取终点和起点的方法(x 和 y 是玩家的坐标 (int),dir_x 和 dir_y 是方向的双精度数 (double),start.x 和 y 是 (ints)).
start.x = x * MAP_ELEM_PX_SIZE + MAP_PLAYER_PX_SIZE / 2 + (MAP_PLAYER_PX_SIZE + 5) * pos.dir_x;
start.y = y * MAP_ELEM_PX_SIZE + MAP_PLAYER_PX_SIZE / 2 + (MAP_PLAYER_PX_SIZE + 5) * pos.dir_y;
end.x = x * MAP_ELEM_PX_SIZE + MAP_PLAYER_PX_SIZE / 2;
end.y = y * MAP_ELEM_PX_SIZE + MAP_PLAYER_PX_SIZE / 2;

我首先尝试像在这个方法中一样同时迭代 x 和 y

int     draw_dir_ray(t_coord start, t_coord end, t_win *win)
{
    int i;
    int j;

    i = 0;
    j = 0;
    if (start.x < end.x)
        i = 1;
    else if (start.x > end.x)
        i = -1;
    if (start.y < end.y)
        j = 1;
    else if (start.y > end.y)
        j = -1;
    while (start.x != end.x || start.y != end.y)
    {
        set_pixel(win, start.x, start.y, 0x009E00);
        if (start.x != end.x)
            start.x += i;
        if (start.y != end.y)
            start.y += j;
    }
    return (1);
}

下面是它呈现的一些屏幕截图。如您所见,这并不是预期的结果...... (虽然我试图提供最多的信息,但如果需要我可以提供更多信息)

感谢你们,我搜索了 Bresenham 线算法并以这种方式实现了它!

int     draw_dir_ray(t_coord start, t_coord end, t_win *win)
{
    int dx;
    int dy;
    int sx;
    int sy;
    int err;
    int e2;

    dx = abs(end.x - start.x);
    dy = -abs(end.y - start.y);
    sx = start.x < end.x ? 1 : -1;
    sy = start.y < end.y ? 1 : -1;
    err = dx + dy;
    while (1)
    {
        set_pixel(win, start.x, start.y, 0xFF0000);
        set_pixel(win, start.x - 1, start.y, 0xFF0000);
        set_pixel(win, start.x, start.y - 1, 0xFF0000);
        set_pixel(win, start.x - 1, start.y - 1, 0xFF0000);
        if (start.y == end.y && start.x == end.x)
            break ;
        e2 = 2 * err;
        if (e2 >= dy)
        {
            err += dy;
            start.x += sx;
        }
        if (e2 <= dx)
        {
            err += dx;
            start.y += sy;
        }
    }
    return (1);