Python实现小圆覆盖大圆问题

问题回顾


    给定一个半径为10m的圆,和若干半径为1m的小圆(小圆个数足够多),现在要用若干小圆来覆盖这个大圆。问至少需要多少个小圆才能覆盖这个半径为10m的圆?

求解思路


     为保证小圆数量最小,既圆与圆之间不重叠,既相切情况。
     因为需要考虑大圆与小圆之间的间隙,也要考虑小圆与小圆之间的间隙。
     故只能采取近似思想进行计算。
     
    1、当r<R<2r时,n=1;
    2、当2r<=R<2.1547r时,n=2;
    3、当R>2.1547*r时,先挨大圆边均匀分布一圈小圆,计算小圆个数,在摆第二圈,得到小圆个数,以次类推,...

import math

PI= 3.1415926

#计算圆面积
def getArea(R):
    Area = PI*R**2
    return Area

BigR = 10  #大圆半径
MinR = 1   #小圆半径


BigArea = getArea(BigR)  #大圆面积

MinArea = getArea(MinR)   #小圆面积

BestNumber = round(BigArea/MinArea) #最理想情况小圆个数


'''

现在考虑内圆与外圆的空隙。求的一个更精确的解。
根据上面第3条,最外圆的可以放的圆的个数为 n0 = [pi/( arcsin(r/(R- r)) )];
那么考虑当内圈的一个圆与外圈的两个圆相切时,特别的,当三个圆心成正三角形时,最节省空间。
于是得到:

n0 = [ pi/(arcsin(r/(R- r)) )]
n1 = [ pi/arcsin(r/( sqrt((R -1 - sqrt(3) )^2 + 1) )) ]
n2 = [ pi/arcsin(r/( sqrt((R -1 - 2*sqrt(3) )^2 +1) )) ]
n3 = [ pi/arcsin(r/( sqrt((R -1 - 3*sqrt(3) )^2 + 1) )) ]
....
一直到减出来小于0为止
把所有的n相加就得到了解。

'''

n0 = round(PI/(math.asin(MinR/(BigR - MinR)) ))  
n1 = round(PI/(math.asin(MinR/(math.sqrt((BigR -1 -   math.sqrt(3) )**2 + 1) )) ))
n2 = round(PI/(math.asin(MinR/(math.sqrt((BigR -1 - 2*math.sqrt(3) )**2 + 1) )) ))
n3 = round(PI/(math.asin(MinR/(math.sqrt((BigR -1 - 3*math.sqrt(3) )**2 + 1) )) ))
n4 = round(PI/(math.asin(MinR/(math.sqrt((BigR -1 - 4*math.sqrt(3) )**2 + 1) )) ))
n5 = round(PI/(math.asin(MinR/(math.sqrt((BigR -1 - 5*math.sqrt(3) )**2 + 1) )) ))


print("最好情况:",BestNumber)

N = n0 +n1+n2+n3+n4+n5

print("使用近似思想(忽略圆与圆之间间隔)得到的小圆个数为:",N)

猜你喜欢

转载自blog.csdn.net/qq_39463175/article/details/107579251
今日推荐