C++ 没有重复的中点圆?

C++ 没有重复的中点圆?,c++,algorithm,bresenham,C++,Algorithm,Bresenham,我有一些代码来生成网格坐标(SDL_点只包含两个ints代表x和y)和一个圆形: std::vector<SDL_Point> circle(const SDL_Point & start, const int radius) { int x{ radius }, y{ 0 }; int xChange{ 1 - 2 * radius }; int yChange{ 1 }; int rError{ 0 }; std::vector&

我有一些代码来生成网格坐标(
SDL_点
只包含两个
int
s代表x和y)和一个圆形:

std::vector<SDL_Point> circle(const SDL_Point & start, const int radius)
{
    int x{ radius }, y{ 0 };
    int xChange{ 1 - 2 * radius };
    int yChange{ 1 };
    int rError{ 0 };

    std::vector<SDL_Point> circle;
    SDL_Point coord;

    while (x >= y)
    {
        /*  Due to circle's symmetry, we need only to calculate
            points in the first 45º of the circle.
        */

        coord = { start.x + x, start.y + y }; // Octant 1.
        circle.push_back(coord);
        coord = { start.x - x, start.y + y }; // Octant 4.
        circle.push_back(coord);
        coord = { start.x - x, start.y - y }; // Octant 5.
        circle.push_back(coord);
        coord = { start.x + x, start.y - y }; // Octant 8.
        circle.push_back(coord);
        coord = { start.x + y, start.y + x }; // Octant 2.
        circle.push_back(coord);
        coord = { start.x - y, start.y + x }; // Octant 3.
        circle.push_back(coord);
        coord = { start.x - y, start.y - x }; // Octant 6.
        circle.push_back(coord);
        coord = { start.x + y, start.y - x }; // Octant 7.
        circle.push_back(coord);

        ++y;
        rError += yChange;
        yChange += 2;

        if (2 * rError + xChange > 0)
        {
            --x;
            rError += xChange;
            xChange += 2;
        }
    }

    return circle;
}
std::矢量圆(常数SDL_点和起点,常数int半径)
{
int x{radius},y{0};
int交换{1-2*半径};
int yChange{1};
int-rError{0};
std::矢量圆;
SDL_Point coord;
而(x>=y)
{
/*由于圆的对称性,我们只需要计算
圆的前45º内的点。
*/
coord={start.x+x,start.y+y};//八分之一。
圆圈。向后推(坐标);
coord={start.x-x,start.y+y};//八分位4。
圆圈。向后推(坐标);
coord={start.x-x,start.y-y};//Octant 5。
圆圈。向后推(坐标);
coord={start.x+x,start.y-y};//Octant 8。
圆圈。向后推(坐标);
coord={start.x+y,start.y+x};//Octant 2。
圆圈。向后推(坐标);
coord={start.x-y,start.y+x};//Octant 3。
圆圈。向后推(坐标);
coord={start.x-y,start.y-x};//Octant 6。
圆圈。向后推(坐标);
coord={start.x+y,start.y-x};//Octant 7。
圆圈。向后推(坐标);
++y;
rError+=yChange;
yChange+=2;
如果(2*rError+xChange>0)
{
--x;
rError+=xChange;
xChange+=2;
}
}
返回圈;
}
这工作正常,但我注意到一些坐标在从一个八分之一复制到另一个八分之一时添加了两次(图片中的灰色更清晰):

是否有一种已知的方法可以避免这些重复项,或者我应该在将它们添加到
向量之前进行检查

我想知道最有效的方法是什么。我还没有找到任何答案,我想在打印素色圆圈时,这通常不是一个问题

编辑:我需要向量作为输出


谢谢!:)

您可以使用强制唯一性的容器,如

std::set<SDL_Point>
std::set

然后使用insert方法而不是push_back。

您可以使用强制唯一性的容器,如

std::set<SDL_Point>
std::set

然后使用INSERT方法,而不是PuxJuff.

如果您考虑代码在做什么,有两种情况会产生重复:当代码> y>代码>为0(沿着图的边),以及当<代码> x==y(圆中的对角线)。您可以在相应的

coord
计算之前添加检查以排除这些条件


例如,
coord={start.x+x,start.y+y}
coord={start.x+x,start.y-y} y>代码>为0时,代码生成相同的值。

如果你考虑你的代码在做什么,有两种情况会产生重复:当代码> y>代码>为0(沿着图的边),以及当<代码> x==y(圆中的对角线)。您可以在相应的
coord
计算之前添加检查以排除这些条件


例如,
coord={start.x+x,start.y+y}
coord={start.x+x,start.y-y}y
为零时,code>生成相同的值。

我曾想过这样做,但它真的有效吗?我从不确定。我需要一个向量作为输出,所以我必须复制集合的内容。是的,这很有效。至少和确保向量唯一性的其他方法一样有效。有什么特别的原因需要向量吗?也许这也可以用set来实现,因为我还有其他函数,它们也输出点的向量,它们的所有输出都将被类似地管理。但也许我应该把它们都做好。。。我会想一想:)我曾想过这样做,但它真的有效吗?我从不确定。我需要一个向量作为输出,所以我必须复制集合的内容。是的,这很有效。至少和确保向量唯一性的其他方法一样有效。有什么特别的原因需要向量吗?也许这也可以用set来实现,因为我还有其他函数,它们也输出点的向量,它们的所有输出都将被类似地管理。但也许我应该把它们都做好。。。我会考虑:)它是否有任何实际的性能或正确性影响?如果不是,那么忽略它始终是一个有效的选项。它是否会对实际性能或正确性产生任何影响?如果不是,那么忽略它总是一个有效的选择。嗯,你是对的,也许这是最简单的解决方案。谢谢,我试试看!嗯,你说得对,也许这是最简单的解决办法。谢谢,我试试看!