循环遍历所有 (i,j) 元素

Kap*_*a11 2 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;
};
Run Code Online (Sandbox Code Playgroud)

如果我想遍历 a 中的所有元素Rectangle,我可以简单地这样做:

for (int i = iL; i < iL-width; i--)
  for (int j = jL; j < jL+length; j++)
    doSomething();
Run Code Online (Sandbox Code Playgroud)

我的问题是实现一种智能方式来迭代Circle. 我目前的解决方案如下:

for (int i = iC-radius; i <= iC+radius; i++)
  for (int j = jC-radius; j <= jC+radius; j++)
    if ( sqrt(pow(i-iC,2)+pow(j-jC,2)) <= r ) // checking if (i,j) lies within the circle (or its boundary)
      doSomething();
Run Code Online (Sandbox Code Playgroud)

然而,为了radius变大,我当前的解决方案非常耗时(因为我接触了许多不在 中的元素,Circle而且我总是需要评估pow)。你能想到一种更智能、更高效的迭代所有Circle元素的方法吗?

MBo*_*MBo 5

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

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);
Run Code Online (Sandbox Code Playgroud)