所有情况下Bresenham的线算法

时间:2017-08-10 09:29:26

标签: c++ algorithm vector 2d bresenham

我创建了一个函数,它接收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;
        }
}

任何帮助使这个功能适用于所有情况(以及如何使其更好),并帮助我理解将如何欣赏。

0 个答案:

没有答案