求取圆内整数点(格点)的算法

这个算法用来列举圆内整数点,通过推广可以用来列举圆环内的整数点。

不过现在仅是某些特殊情况,没有推广到一般。限制条件:圆心坐标为整数(可以转换为圆心在原点),半径为正整数。

语言为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) 是圆内最右边的整数点。</

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值