解析垃圾代码的过程让我对中华先贤敬仰犹如滔滔江水绵绵不绝,犹如黄河泛滥一发不可收拾。

一、解决引发了BUG的一段无注释代码

程序逻辑:已知正n边型,内切圆半径r,计算外接圆半径R。业务逻辑是一段弧,通过拟合把弧转换为线段集合,可以通过R和圆心以及角度范围获得各拟合点。

有以下一段没有注释的代码

double dTheta = PI/n;
R = r*sqrt(PI/(n*sin(dTheta*2)/2));

公式处理一下

R^2 = r^2 * (2*PI/(n*sin(dTheta*2)))


各种推算了半天,找不到数学公式依据。
而正确的计算外接圆半径公式应该是 R = r / cos(dTheta);(见图1)

图1
图1中蓝色为已知圆,黄色为内接正多边形,红色为外切正多边形。

二、略过曲折的道路直达终点

百度正多边形面积计算公式,发现中华先贤刘徽(225-295),祖冲之(429-500)发明的割圆术。(看完求解过程,做为毕业多年的数学学渣内心真的各种崇拜。)

把多边形公式换一下变量名(为了和代码保持一致r换为R): 

S = n/2*R^2*sin(2*PI/n)

参照图2,红色为白色圆的内接正多边形,红色多边形面积计算可以使用上面公式,半径为R。这时候如果把红色多边形内接蓝色圆形的面积做为S的近似值,即S = PI*r^2。

图2

公式就修改为

PI*r^2 = n/2*R^2*sin(2*dTheta)

左右换一下

R^2 = r^2 *(2*PI/(n*sin(2*dTheta)))

        原来如此,由于用内切圆面积近似代表多边形面积,得到的外接圆半径比正确计算方法数值要小一丢丢。但作为严谨的程序猿,不留注释实在是过分。
 

割圆术

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值