这个算法用来列举圆内整数点,通过推广可以用来列举圆环内的整数点。
不过现在仅是某些特殊情况,没有推广到一般。限制条件:圆心坐标为整数(可以转换为圆心在原点),半径为正整数。
语言为c++,
点的数据结构为:
stuct Vector2
{
int x;
int y;
};
容器为 std::vector<Vector2> points,算法的目标就是把圆内的所有整数点插入points里。
圆是关于坐标轴对称以及 y=x 和 y=-x 对称的图形所以我们仅需考虑第一象限右下部分(圆的八分之一部分)即可。
设半径为r
第一步,加入原点。因为圆心在原点上。
第二步,加入坐标轴上的点。(1, 0)(2,0)...(r, 0)。
第三步,加入y = x, y = -x 上的点 (1, 1)(2, 2)...(⌊r/1.414⌋, ⌊r/1.414⌋) 注意最后一个是向下取整。
第四步,加入其他的点:
最后的这一部分大概是个扇形:
射线 (2, 1)->(3, 1) 和射线 (2, 1)->(3, 2) 与圆相交的区域。
通过观察发现两个事实:
1.这个区域最低点的y坐标为1,最高点的y坐标为 射线 (2, 1)->(3, 2) 与圆相交的点的 y坐标向下取整。
2.因为圆的半径为整数,所以点(r, 0)在圆上。 (r, 1)在圆外。并且有相当多的点(r - 1, j) 是圆内最右边的整数点。</