C++ 迭代圆中的所有(i,j)-元素
给定两个非常简化的类:C++ 迭代圆中的所有(i,j)-元素,c++,algorithm,geometry,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; };
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;
};
如果我想迭代矩形中的所有元素,我可以通过以下方法简单地完成:
for (int i = iL; i < iL-width; i--)
for (int j = jL; j < jL+length; j++)
doSomething();
然而,由于半径越来越大,我目前的解决方案非常耗时,因为我接触了许多不在圆中的元素,而且我总是需要评估pow。你能想出一种对所有圆元素进行迭代的更智能、更高效的方法吗?对于每一行,找到属于圆的第一列,然后从该列走到相对于圆中心镜像的列。伪码
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的正方形。因此,正方形中的等距点存储在二维阵列中 现在穿过广场内的每一点。对于每个点x,y,如果x,y位于圆内或x^2+y^2
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
}
}
}
所以我得到了一个离散的2D形状,有I,j点,其中有几个圆和矩形。如果我使用极坐标,我会遇到同样的问题:我应该如何迭代角度φ?我需要一些东西,比如psuedocode:for double phi=0;通过与r*r进行比较,您可以摆脱sqrt。@Kapa11:可以使用“仿佛”规则。您必须使用编译器检查生成的代码,但gcc/clang确实可以。谢谢,我将对此进行测试。但我将改变ix和iy循环以改进缓存位置:Emm。。。在大多数语言中,包括C++、2D数组都是按行存储的,所以通常描述顺序是首选的。也许,您指的是其他一些情况……但是在您的代码片段中,您在每个y j方向上迭代,然后在每个x i方向上迭代。因此,对于每一列,检查每一行。但是正如你所说的,一行一行地检查是非常困难的better@Kapa11似乎我们对行/列的看法略有不同;对于每个外部循环运行,我固定IY线,找到沿X轴的限制,并更频繁地遍历改变2d数组第二个数组的X范围。可能你的数据是以另一种方式组织的,首先是X索引是的,我想我们在不同的上下文中是指相同的,这不正是我目前正在做的事情吗?我对代码感到不舒服?!?!
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
}
}
}