我创建了一个函数,它接收2D std::vector
,向量中有2个点,并在向量中“绘制”一条线。但是,它并未涵盖所有情况(八分圆)。一条线是指直线相互连接的点。此向量将写入.ppm
文件,因此它在图像中显示为一行。
我使用以下链接实现了此功能:https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm
在这里查看:https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm#All_cases
我试图找出如何更改我的功能,以便它“绘制”2D矢量中任何2个坐标的线,但我有点困惑。我不明白为什么有一个函数应用于输入和输出。哪一个适用于哪个坐标。另外,我不知道如何确定2坐标中的线是哪个八分圆。
2D矢量将被写入.ppm
文件,如下所示:
255 255 255 255 255 255 255 255 255
255 255 255 0 0 0 255 255 255
255 255 255 255 255 255 255 255 255
此图像将是中心的黑点。
#include <vector>
#include <tuple>
#include <utility>
using pixel = std::tuple<unsigned, unsigned, unsigned>; // rgb pixel
using row_t = std::vector<pixel>; // row in a 2D vector
using grid_t = std::vector<row_t>; // the grid made up of rows
// x, y coordinate - access is like grid[y][x] since grid is made of rows
using coord = std::pair<long long, long long>;
// Bresenham's line algorithm
// 2 points to draw a line between
void draw(grid_t& grid, const coord& c1, const coord& c2)
{
long long dx{c2.first - c1.first},
dy{c2.second - c1.second},
D {2 * dy - dx},
y {c1.second};
// is the if/else needed?
if (c1.first <= c2.first)
for (long long x{c1.first}; x <= c2.first; ++x)
{
grid[y][x] = pixel{0, 0, 0};
if (D > 0)
{
++y;
D -= 2 * dx;
}
D += 2 * dy;
}
else
for (long long x{c1.first}; x >= c2.first; --x)
{
grid[y][x] = pixel{0, 0, 0};
if (D > 0)
{
++y;
D -= 2 * dx;
}
D += 2 * dy;
}
}
任何帮助使这个功能适用于所有情况(以及如何使其更好),并帮助我理解将如何欣赏。