C++ 迭代圆中的所有(i,j)-元素

C++ 迭代圆中的所有(i,j)-元素,c++,algorithm,geometry,C++,Algorithm,Geometry,给定两个非常简化的类: class Rectangle { public: int iL,jL; // lower left point of rectangle int width, length; // width: in i-direction, length: in j-direction }; class Circle { public: int iC,jC; // center-point of circle int radius; };

给定两个非常简化的类:

class Rectangle {
  public:
    int iL,jL; // lower left point of rectangle
    int width, length; // width: in i-direction, length: in j-direction
};

class Circle {
  public:
    int iC,jC; // center-point of circle
    int radius;
};
如果我想迭代矩形中的所有元素,我可以通过以下方法简单地完成:

for (int i = iL; i < iL-width; i--)
  for (int j = jL; j < jL+length; j++)
    doSomething();

然而,由于半径越来越大,我目前的解决方案非常耗时,因为我接触了许多不在圆中的元素,而且我总是需要评估pow。你能想出一种对所有圆元素进行迭代的更智能、更高效的方法吗?

对于每一行,找到属于圆的第一列,然后从该列走到相对于圆中心镜像的列。伪码

for (int iy = - radius  to  radius; iy++)
    dx = (int) sqrt(radius * radius - iy * iy)
    for (int ix = - dx  to  dx; ix++)
        doSomething(CX + ix, CY + iy);

让圆的半径为r。考虑要画圆的大小为2R+1×2R+ 1的正方形。因此,正方形中的等距点存储在二维阵列中

现在穿过广场内的每一点。对于每个点x,y,如果x,y位于圆内或x^2+y^2
for i from 0 to 9 {
    for j from 0 to 9 {
        a = i - x
        b = j - y
        if a*a + b*b <= r*r {
            // Do something here
        }
    }
}

所以我得到了一个离散的2D形状,有I,j点,其中有几个圆和矩形。如果我使用极坐标,我会遇到同样的问题:我应该如何迭代角度φ?我需要一些东西,比如psuedocode:for double phi=0;通过与r*r进行比较,您可以摆脱sqrt。@Kapa11:可以使用“仿佛”规则。您必须使用编译器检查生成的代码,但gcc/clang确实可以。谢谢,我将对此进行测试。但我将改变ix和iy循环以改进缓存位置:Emm。。。在大多数语言中,包括C++、2D数组都是按行存储的,所以通常描述顺序是首选的。也许,您指的是其他一些情况……但是在您的代码片段中,您在每个y j方向上迭代,然后在每个x i方向上迭代。因此,对于每一列,检查每一行。但是正如你所说的,一行一行地检查是非常困难的better@Kapa11似乎我们对行/列的看法略有不同;对于每个外部循环运行,我固定IY线,找到沿X轴的限制,并更频繁地遍历改变2d数组第二个数组的X范围。可能你的数据是以另一种方式组织的,首先是X索引是的,我想我们在不同的上下文中是指相同的,这不正是我目前正在做的事情吗?我对代码感到不舒服?!?!
for i from 0 to 9 {
    for j from 0 to 9 {
        a = i - x
        b = j - y
        if a*a + b*b <= r*r {
            // Do something here
        }
    }
}