C++ 按顺序计算圆周围的点

C++ 按顺序计算圆周围的点,c++,algorithm,geometry,C++,Algorithm,Geometry,我改编了Mukund Sivaraman的一篇关于圆绘制的伟大文章中的一些代码,为给定圆上的每个点执行传递函数: template<class Function> static void For_each_point_on_circle(Image *image, int radius, Function function) { int x, y; int l; l = (int) radius * cos (M_PI / 4); for (x = 0

我改编了Mukund Sivaraman的一篇关于圆绘制的伟大文章中的一些代码,为给定圆上的每个点执行传递函数:

template<class Function>
static void For_each_point_on_circle(Image *image, int radius, Function function)
{
    int x, y;
    int l;
    l = (int) radius * cos (M_PI / 4);
    for (x = 0; x <= l; x++)
    {
        y = (int) sqrt ((double) (radius * radius) - (x * x));
        function(image, x, y);
        function(image, x, -y);
        function(image, -x, y);
        function(image, -x, -y);
        function(image, y, x);
        function(image, y, -x);
        function(image, -y, x);
        function(image, -y, -x);
  }
}
模板
圆上每个点的静态空隙(图像*图像,整数半径,函数)
{
int x,y;
int l;
l=(int)半径*cos(μPI/4);

对于(x=0;x,这里有一篇关于以离散步骤绘制圆的文章。它的动机是用于数控机床步进电机控制器,但也许它可以满足您的需要


像这样的东西应该可以做到:

template<class Function>
static void For_each_point_on_circle(Image *image, int radius, Function function)
{
    int x, y;
    int l;
    l = (int) radius * cos (M_PI / 4);
    for (x = -l; x < l; x++)
    {
        y = (int) sqrt ((double) (radius * radius) - (x * x));
        function(image, x, y);
    }
    for (x = -l; x < l; x++)
    {
        y = (int) sqrt ((double) (radius * radius) - (x * x));
        function(image, y, -x);
    }
    for (x = -l; x < l; x++)
    {
        y = (int) sqrt ((double) (radius * radius) - (x * x));
        function(image, -x, -y);
    }
    for (x = -l; x < l; x++)
    {
        y = (int) sqrt ((double) (radius * radius) - (x * x));
        function(image, -y, x);
    }
}
模板
圆上每个点的静态空隙(图像*图像,整数半径,函数)
{
int x,y;
int l;
l=(int)半径*cos(μPI/4);
对于(x=-l;x
圆上的点相距有多远?(1度?)彼此仅相距1个像素,不一定是固定的角度。谢谢。如果您想在偶数空间中圆(即使是弧长,而不是x轴)我建议使用极坐标,并根据要绘制的点的数量适当划分2*PI。明显的
函数(图像、半径*cos(角度)、半径*sin(角度))有什么问题
?@Danny:保持像素坐标比尝试跨入极坐标更容易。圆周周围的角度像素间距不是恒定的。如果你想计算它,它将是角度和分辨率的函数。这非常接近,它会产生以下输出:。我会用它来填充孔,我现在应该没事了。我会的完成后用完整的代码更新主帖子。谢谢大家的帮助!@user1454345-这就是我在上面的评论中得到的。半径越大,问题就越严重。@atb-没关系,我错过了cos(M_PI/4)在计算l时考虑因素。虽然这有助于将其分解为4个循环,但它并不能真正解决问题。随着半径的增加,它最终将变得足够大,以便在一个象限内,相邻的x值将映射到不相邻的y值。我认为唯一的解决方法是为每个x值和sepa计算像素范围内每个y值的比率。它似乎对我尝试过的半径值有效,-渐变显示了像素的绘制顺序。@atb-你是对的,它在半径*半径变得太大时起作用。