#pointsXYcircle.py #randomly generate (x,y) integer points inside a circle, #Average distance each point to the center. ~.66 (unit circle) #Average distance between points: 0.8948 import random import math def distance_pair_points(x1,y1, x2,y2): return math.sqrt((x2-x1)**2+(y2-y1)**2) radius = int(input("Enter the radius of the circle: ")) num_points = int(input("Enter the number of random points: ")) X = [] #x-coordinates Y = [] #y-coordinates ''' alpha = random.random()*2*math.pi #radians d = random.random()*radius X.append(math.cos(alpha) * d) #too clumped near center??? Y.append(math.sin(alpha) * d) #avg. dist is ~.5 ''' for p in range(num_points): is_inside = False while not is_inside: x = random.random()*2*radius-radius y = random.random()*2*radius-radius if distance_pair_points(x,y, 0,0) <= radius: is_inside = True X.append(x) Y.append(y) #print("("+str(X[p])+","+str(Y[p])+")", end=" ") print() #print(X) #print(Y) distances = [] #distance each point to centroid inners = 0 inner_inners =0 for p in range(num_points): distances.append(distance_pair_points(X[p],Y[p], 0,0)) if distances[p] < .7071*radius: inners += 1 if distances[p] < .5*radius: inner_inners += 1 print("Sum of distances to center:", sum(distances)) print("Average distance to center:", sum(distances)/num_points) print("number within .7071 circle (~half):",inners) print("number within .5 circle (~quarter):",inner_inners) dist_pt_pt = [[0 for j in range(num_points)] for i in range(num_points) ] for i in range(num_points): for j in range(num_points): #could be more eff., do only half... dist_pt_pt[i][j] = distance_pair_points(X[i],Y[i], X[j],Y[j]) #i_avg_dist = sum(dist_pt_pt[i])/(num_points-1) #print("i",i,"avg. dist:",i_avg_dist) #not itself total_distances = 0 for i in range(num_points): total_distances += sum(dist_pt_pt[i]) print("Average distance between points:",total_distances/(num_points*(num_points-1))) from ezgraphics import GraphicsWindow size = int(input("Enter square size of graphics window: ")) win = GraphicsWindow(size,size) canvas = win.canvas() canvas.drawLine(size/2,1, size/2,size) canvas.drawLine(1,size/2, size,size/2) scale = size/(radius*2) canvas.setColor("red") canvas.setFill() canvas.drawOval(1,1, size,size) canvas.setColor("yellow") canvas.setFill() #half the points within .7071r of center canvas.drawOval(.2929*size/2,.2929*size/2, size*.7071,size*.7071) # 1/root2=.707 canvas.drawOval(.25*size,.25*size, size*.5,size*.5) # 1/4 of points within .5 of center canvas.setColor("blue") for p in range(num_points): #canvas.setColor("blue") canvas.drawOval(X[p]*scale+size/2,size-(Y[p]*scale+size/2), 2,2) #canvas.setColor("yellow") #canvas.drawLine(size/2,size-(size/2), # X[p]*scale+size/2,size-(Y[p]*scale+size/2))