#circlesInCircle.py import math #distance between two points, each a tuple of x and y coordinates def distance_points(pt1,pt2): return math.sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2) R = int(input("Enter the radius of the outer circle: ")) r = int(input("Enter the radius of the inner circles: ")) from ezgraphics import GraphicsWindow margin = 10 size = 2*R win = GraphicsWindow(size+margin,size+margin) canvas = win.canvas() canvas.setColor("red") canvas.setFill() canvas.drawOval(margin/2,margin/2, 2*R,2*R) canvas.setColor("green") xO = R+margin/2 yO = R+margin/2 canvas.drawOval(xO,yO ,2,2) #origin layers = R // (2*r) for layer in range(layers): inner_circumference = 2*math.pi*(R-(2*layer+1)*r) canvas.setColor("red") canvas.setFill() canvas.drawOval((2*layer+1)*r+margin/2,(2*layer+1)*r+margin/2, \ 2*(R-(2*layer+1)*r),2*(R-(2*layer+1)*r)) num_circles = inner_circumference // (2*r) print("num_circles:",num_circles) centers = [] for p in range(int(num_circles)): alpha = 2*math.pi/num_circles * p cos_p = math.cos(alpha) sin_p = math.sin(alpha) x = cos_p*(R-(2*layer+1)*r) y = sin_p*(R-(2*layer+1)*r) can_fit = True #innermost layer: if would overlap, rotate to find non-overlapping while layer==layers-1 and p>0 and distance_points((x,y),centers[-1])<2*r: alpha += math.pi/64 #not perfect... cos_p = math.cos(alpha) sin_p = math.sin(alpha) x = cos_p*(R-(2*layer+1)*r) y = sin_p*(R-(2*layer+1)*r) if alpha>=2*math.pi or (p>1 and distance_points((x,y),centers[0])<2*r): can_fit = False break if can_fit: centers.append((x,y)) canvas.setColor("green") canvas.setFill() canvas.drawOval(centers[-1][0]+(R-r)+margin/2,\ (centers[-1][1]+(R-r)+margin/2), 2*r,2*r) canvas.setColor("black") canvas.drawOval(centers[-1][0]+R+margin/2,(centers[-1][1]+R+margin/2), 2,2) #can fit a circle at the origin 200 15 if distance_points((0,0), centers[-1]) >= 2*r: print("yes") canvas.setColor("green") canvas.setFill() canvas.drawOval(0+(R-r)+margin/2,0+(R-r)+margin/2, 2*r,2*r)