在一个圆圈中迭代所有(i,j)

Iterating over all (i,j)-elements in a circle

本文关键字:迭代 一个      更新时间:2023-10-16

给定两个(非常简化)类:

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中的元素,并且由于我始终需要评估pow)。您能想到所有Circle元素的更聪明,更有效的迭代方式吗?

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

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)。因此,正方形中的等距点存储在2D数组中。

现在穿过广场内的每个点。对于每个点(x,y),如果(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
        }
    }
}