在一个圆圈中迭代所有(i,j)
Iterating over all (i,j)-elements in a circle
给定两个(非常简化)类:
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
}
}
}
相关文章:
- 实现一个在集合上迭代的模板函数
- 不明白迭代器,引用和指针失效,一个例子
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 为什么 C++ std::unordered_map 从 emplace/ 找到返回一个迭代器?
- 为什么我的模板化函数需要从一个迭代器转换到另一个迭代器?
- 在插入时同时迭代一个映射,这在什么方面是不安全的
- 如何在C++中迭代一个句子的单词
- 为什么在堆上迭代一个大数组比在堆栈上迭代相同大小的数组快
- 迭代一个巨大的 std::vector of std::vectors 并修改元素
- 你将如何迭代一个向量
- 迭代一个QList的QVariant<int>?
- 创建一个数组来迭代一个成员的两个数组
- 如何在C++中迭代一个无序的集合
- 迭代一个STL容器,而不是从.begin()函数开始
- 如何安全地迭代一个互锁列表
- 创建和迭代一个3D数组
- 迭代一个n元组
- 迭代一个有10000行的mysql结果集,耗时3.5秒.这正常吗?
- 迭代一个指向类的指针向量
- 如何迭代一个向量