等比数列圆收敛于360度q=0.828
设想有一组半径是等比数列的圆。最大圆的半径是1,其它圆全部围在最大的圆身上,使得恰好收敛于360度,求等比q?
#半径为1的主圆,周围是半径为递减的q等比数列,紧紧相切刚好收敛于360度,求q
#易知必定是收敛于某个角度的
import math
import turtle as tt
PI=3.14159
def get_radian(a, b, c):
'''
:param a: 外边
:param b: 长边
:param c: 短边
:return: a边对应的A角,圆心角的弧度
'''
t=(b*b+c*c-a*a)/(2*b*c)
return math.acos(t)
# print(get_radian(1,2,1.73))#0.52
def get_sum_radian(q):
res=0
a=q+q*q
b=1+q
c=1+q*q
SIZE=50 #精确到第几个三角形
for i in range(1,SIZE):#第几个三角形
res+=get_radian(a, b, c)
a*=q
b=c
c=1+q**(i+1)
return res
# print(get_sum_radian(0.8))
# print(get_sum_radian(0.9))
# 结果必定在0.8和0.9之间,二分法查找
def get_ans():
r=0.9
l=0.8
m=0.85
SIZE=50 # 精确到二分法多少次
for i in range(SIZE):
ans=get_sum_radian(m)
if ans<=2*PI:
l=m
else:
r=m
m=(l+r)/2
return m
def draw(q):
SPAN=100
tt.setup(700,700)
tt.speed(0)
r=1
cnt_degree = 0#累计的圆角度
tt.up()
tt.goto(0,-r*SPAN)
tt.down()
tt.circle(r*SPAN)
tt.up()
r*=q
a = q + q * q
b = 1 + q
c = 1 + q * q
SIZE = 30 # 精确到第几个三角形
for i in range(1, SIZE): # 第几个三角形
tt.home()
tt.seth(cnt_degree)
tt.forward(SPAN)
tt.right(90)
tt.down()
tt.circle(r*SPAN)
tt.up()
cnt_degree+=get_radian(a,b,c)*180/PI
a *= q
b = c
c = 1 + q ** (i + 1)
r*=q
tt.done()
q=get_ans()
print(q)
# 0.8287775143909673
draw(q)