迭代一个圆圈中的所有(i,j) - 元素

时间:2016-12-14 06:30:37

标签: 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;
};

如果我想迭代Rectangle中的所有元素,我可以通过以下方式执行此操作:

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

我的问题是实现一种迭代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();

然而,对于radius变大,我当前的解决方案非常耗费时间(因为我触及Circle中的许多元素,因为我总是需要评估{{1} }})。你能想到一种比所有pow - 元素更智能,更有效的迭代方法吗?

2 个答案:

答案 0 :(得分:4)

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

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);

答案 1 :(得分:-1)

让圆的半径为r。考虑在要绘制的圆周围的大小(2r + 1)*(2r + 1)的正方形。因此,方形中的等距点存储在2D数组中。

现在走进广场内的每一个角落。对于每个点(x,y),if(x,y)位于圆内(或x ^ 2 + y ^ 2&lt; r ^ 2),然后打印它。例如,等距点形成一个10x10数组,并在(x,y)处选择数组的“中心”:

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
        }
    }
}