给出两个(非常简化的)类:
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
- 元素更智能,更有效的迭代方法吗?
答案 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
}
}
}