Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 布雷森厄姆';所有情况下的s线算法_C++_Algorithm_Vector_2d_Bresenham - Fatal编程技术网

C++ 布雷森厄姆';所有情况下的s线算法

C++ 布雷森厄姆';所有情况下的s线算法,c++,algorithm,vector,2d,bresenham,C++,Algorithm,Vector,2d,Bresenham,我创建了一个函数,它接受一个2Dstd::vector,向量中有两个点,并在向量中“绘制”一条线。但是,它并不涵盖所有情况(八分之一)。我所说的直线是指以直线相互连接的点。该向量将写入.ppm文件,因此在图像中显示为一行 我使用以下链接实现了此功能: 看看这里: 我试图找出如何修改我的函数,以便它为2D向量中的任意2个坐标“绘制”一条直线,但我有点困惑。我不明白为什么有一个函数应用于输入和输出。以及在哪个坐标上应用哪个。另外,我不知道如何计算出2个坐标系中的线所处的八分之一 2D矢量将写入.p

我创建了一个函数,它接受一个2D
std::vector
,向量中有两个点,并在向量中“绘制”一条线。但是,它并不涵盖所有情况(八分之一)。我所说的直线是指以直线相互连接的点。该向量将写入
.ppm
文件,因此在图像中显示为一行

我使用以下链接实现了此功能:

看看这里:
我试图找出如何修改我的函数,以便它为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;
        }
}
#包括
#包括
#包括
使用pixel=std::tuple;//rgb像素
使用row_t=std::vector;//二维向量中的行
使用grid_t=std::vector;//网格由行组成
//x,y坐标-访问类似于网格[y][x],因为网格是由行组成的
使用coord=std::pair;
//Bresenham直线算法
//两个点之间划一条线
无效图纸(网格和网格、常数坐标和c1、常数坐标和c2)
{
long long dx{c2.first-c1.first},
dy{c2.second-c1.second},
D{2*dy-dx},
y{c1.second};
//是否需要if/else?
如果(c1.first=c2.first;--x)
{
网格[y][x]=像素{0,0,0};
如果(D>0)
{
++y;
D-=2*dx;
}
D+=2*dy;
}
}

如果您能帮助我使该函数适用于所有情况(以及如何使其更好),并帮助我了解如何使用该函数,我们将不胜感激。

输入函数将变换坐标,以便在变换后坐标始终位于第一个八分之一。应用该算法(仅适用于第一个八分之一)后,必须再次将它们转换回原始八分之一

使用了这个技巧,因为每个八分之一的算法都需要不同。不是为所有不同的情况编写代码,而是应用转换,使算法本身保持简单


然而,我也不完全理解如何正确地应用该转换。维基百科的文章对此并不十分清楚。在他们的例子中,(0,1),(6,4)在两个不同的八分之一中,但在下一节中,他们说这只适用于第一个八分之一。

输入函数变换坐标,使得变换后它们始终在第一个八分之一中。应用该算法(仅适用于第一个八分之一)后,必须再次将它们转换回原始八分之一

使用了这个技巧,因为每个八分之一的算法都需要不同。不是为所有不同的情况编写代码,而是应用转换,使算法本身保持简单


然而,我也不完全理解如何正确地应用该转换。维基百科的文章对此并不十分清楚。在他们的例子中,(0,1),(6,4)在两个不同的八分之一中,但在下一节中,他们说这只适用于第一个八分之一。

在向量中画一条线是什么意思?@tobi303他有一个向量向量向量(换句话说,一个2d数组)这个2d数组的每个元素代表一个像素。@tobi303一条线,就像一系列点连接在一条尽可能直的线上一样。我将编辑这个问题。“在向量中画一条线”是什么意思?@tobi303他有一个向量向量(换句话说,一个2d数组),这个2d数组的每个元素代表一个像素。@tobi303一条线,就像一条直线中连接的一系列点一样。我会编辑这个问题。谢谢你的澄清。读完这篇文章后,我有点迷糊。现在我只需要弄清楚如何确定由2个坐标点创建的直线所处的八分之一。为什么应用该算法后需要变换坐标?坐标已经被打印(绘制)。@cppxor2arr您必须在打印之前对其进行变换,或者将变换应用于整个图像。试想一下:你只知道如何加正数。如果我想让你把-3和-5相加,我会让你把3和5相加,你告诉我答案是8,然后我仍然需要应用逆变换得到-8,所以有两种方法:1。在运行算法之前转换2个坐标,然后在打印点时运行该算法。通过迭代二维向量的元素来变换整个图像,变换每个当前坐标,并交换当前坐标和变换后的当前坐标的元素。2.在运行算法之前变换2个坐标。运行算法时,存储要绘制的坐标。转换存储的坐标并绘制它们。有什么错误吗?@cppxor2arr我也不确定细节。我会在家里尝试(但不是在工作时间;)。这是一个很好的问题,因为如果你做错了什么,你会立即看到哪里出了问题。谢谢你的澄清。读完这篇文章后,我有点迷糊。现在我只需要弄清楚如何确定由2个坐标点创建的直线所处的八分之一。为什么应用该算法后需要变换坐标?坐标已经被打印(绘制)。@cppxor2arr您必须在打印之前对其进行变换,或者将变换应用于整个图像。试想一下:你只知道如何加正数。如果我想让你把-3和-5相加,我会让你把3和5相加,你告诉我答案是8,然后我仍然需要应用逆变换得到-8