绘制连接 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);
我正在尝试在小地图上绘制玩家的方向。我有画的终点和起点。我想将两者连接起来以实际绘制玩家面对的方向。 我使用玩家方向 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);