一、解决引发了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中蓝色为已知圆,黄色为内接正多边形,红色为外切正多边形。
二、略过曲折的道路直达终点
百度正多边形面积计算公式,发现中华先贤刘徽(225-295),祖冲之(429-500)发明的割圆术。(看完求解过程,做为毕业多年的数学学渣内心真的各种崇拜。)
把多边形公式换一下变量名(为了和代码保持一致r换为R):
S = n/2*R^2*sin(2*PI/n)
参照图2,红色为白色圆的内接正多边形,红色多边形面积计算可以使用上面公式,半径为R。这时候如果把红色多边形内接蓝色圆形的面积做为S的近似值,即S = PI*r^2。

公式就修改为
PI*r^2 = n/2*R^2*sin(2*dTheta)
左右换一下
R^2 = r^2 *(2*PI/(n*sin(2*dTheta)))
原来如此,由于用内切圆面积近似代表多边形面积,得到的外接圆半径比正确计算方法数值要小一丢丢。但作为严谨的程序猿,不留注释实在是过分。