#circle_division.py import math import random from itertools import combinations from ezgraphics import GraphicsWindow size = int(input("Enter size of 'rosette': ")) radius = size / 2 num_points = int(input("Enter number of points: ")) is_randomness = True if input("Add some randomness? (y or n): ").lower()=='y' else False margin = 20 win = GraphicsWindow(size+margin,size+margin) canvas = win.canvas() #canvas.setBackground("yellow") canvas.setColor("red") points = [] for p in range(num_points): if is_randomness: alpha = 2*math.pi/num_points * p + random.random() else: alpha = 2*math.pi/num_points * p #regular polygon sin_p = math.sin(alpha) cos_p = math.cos(alpha) points.append((cos_p*radius+radius+margin/2,sin_p*radius+radius+margin/2)) for from_pt in range(num_points): for to_pt in range(from_pt+1,num_points): canvas.drawLine(points[from_pt][0], points[from_pt][1],\ points[to_pt][0], points[to_pt][1]) canvas.setColor("blue") canvas.setFill() canvas.drawOval(margin/2,margin/2,size,size) def num_combos(n,k): if k>n: return 0 return int(math.factorial(n) / (math.factorial(n-k) * math.factorial(k))) num_quad_points = num_combos(num_points,4) print("#4-combinations=#intersections:",num_quad_points) #intersection point of two line (segments) defined by two points each #def intersection_point(x1,y1, x2,y2, x3,y3, x4,y4): # m1 = (y2-y1) / (x2-x1) # m2 = (y3-y4) / (x3-x4) # b1 = -m1*x1 + y1 # b2 = -m2*x3 + y3 def intersection_point(p1,p2, p3,p4): m1 = (p2[1]-p1[1]) / (p2[0]-p1[0]) if m1 > 1000: m1 = 1000 m2 = (p3[1]-p4[1]) / (p3[0]-p4[0]) if m2 > 1000: m2 = 1000 b1 = -m1*p1[0] + p1[1] b2 = -m2*p3[0] + p3[1] xi = (b1-b2) / (m2-m1) yi = m2*xi + b2 return xi,yi canvas.setColor("green") combos = combinations(range(num_points),4) # Print the obtained combinations for comb in list(combos): print (comb) i,j,k,l = comb xi,yi = intersection_point(points[i],points[k], points[j],points[l]) canvas.drawOval(xi-1,yi-1,3,3) win.showStatus() num_regions = 1 + num_points*(num_points-1)//2 + num_quad_points win.setStatus("#points on circle: n="+str(num_points)+" #intersections: nC4="+str(num_quad_points)+\ " #regions: nC0+nC2+nC4="+str(num_regions)) print("Go look at the graphics window") for i in range(1,11): iChoose2 = i*(i-1)//2 iChoose4 = num_combos(i,4) print(i,":",1,iChoose2,iChoose4,"=",1+iChoose2+iChoose4) #win.wait()