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元素的方法吗?
对于每一行,找到属于圆的第一列,然后从该列走到相对于圆中心镜像的列。伪代码
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)