# -*- coding: utf-8 -*-
"""
Created on Thu Jul 20 20:53:56 2017
@author: Rashida Hakim
title: MIDPOINT METHOD
"""
import math
import random
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import fsolve
#user parameters
largeCircleRadius = 15
smallCircleRadius = 3
numLines = 100
#set up plot
fig, ax = plt.subplots()
ax.set_aspect('equal')
#set range of plot
ax.set_xlim((-1*largeCircleRadius - 5, largeCircleRadius + 5))
ax.set_ylim((-1*largeCircleRadius - 5, largeCircleRadius + 5))
#function that uses scipy (a technical computing python library) to find the intersection of two functions
def findIntersection(fun1,fun2,x0):
return fsolve(lambda x : fun1(x) - fun2(x),x0)
countIntersectingLines = 0
#midpoint method
i = 0
while i < numLines:
#selects random x and y coordinate for the midpoint
midpointx = random.uniform(-1*largeCircleRadius, largeCircleRadius)
midpointy = random.uniform(-1*largeCircleRadius, largeCircleRadius)
while(midpointx**2 + midpointy**2) >= largeCircleRadius**2: #checks if point is outside the circle
#resets coordinates
midpointx = random.uniform(-1*largeCircleRadius, largeCircleRadius)
midpointy = random.uniform(-1*largeCircleRadius, largeCircleRadius)
def f1(x): #equation of line passing through the chosen midpoint (modified from point-slope form)
y = -1*(midpointx/midpointy)*(x-midpointx) + midpointy
return y
def f2(x): #equation for a circle, alternates between top and bottom half to ensure random distribution
if i%2 == 0:
y = np.sqrt(math.fabs((largeCircleRadius**2 - x**2)))
if i%2 == 1:
y = -np.sqrt(math.fabs((largeCircleRadius**2 - x**2)))
return y
chordEndpoint1 = findIntersection(f1, f2,0.0) #x-coordinate of one intersection between chord and circle
chordEndpoint2 = (midpointx - chordEndpoint1) + midpointx
#setting coordinates for chord endpoints
x1 = chordEndpoint1
y1 = f1(chordEndpoint1)
x2 = chordEndpoint2
y2 = f1(chordEndpoint2)
if(x1**2 + y1**2 <= largeCircleRadius**2 and x2**2 + y2**2 <= largeCircleRadius**2): #checks if solution is correct (some are extraneous)
#plots lines
linex, liney = [x1, x2], [y1, y2]
ax.plot(linex, liney, marker = '')
#uncomment the line below to plot the midpoints of the lines
#ax.plot((midpointx), (midpointy), 'o', color='b')
if midpointx**2 + midpointy**2 <= smallCircleRadius**2: #checks if chord intersects smaller circle
countIntersectingLines += 1
i = i+1 #increments while loop
#draw the circles
largeCircle = plt.Circle((0, 0), largeCircleRadius, color='b', fill=False, linewidth = 2, zorder = numLines)
smallCircle = plt.Circle((0,0), smallCircleRadius, color = 'b', fill = False, linewidth = 2, zorder = numLines + 1)
ax.add_artist(largeCircle)
ax.add_artist(smallCircle)
#calculate probablity
theoreticalProbability = float(smallCircleRadius**2)/(largeCircleRadius**2)
probabilityOfIntersect = float(countIntersectingLines)/numLines
#title graph
plotTitle = ("Midpoint Method \n Large Circle Radius: " + str(largeCircleRadius) +
"\n Small Circle Radius: " + str(smallCircleRadius) +
"\n Number of Chords: " + str(numLines) +
"\n Theoretical Probability of Intersect: " + str(theoreticalProbability) +
"\n Experimental Probability of Intersect: " + str(probabilityOfIntersect))
plt.title(plotTitle)
#fig.savefig('midpointMethod.png')
"""
Created on Fri Jul 21 18:37:50 2017
@author: Rashida Hakim
title: RADIUS METHOD
"""
import math
import random
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import fsolve
#user parameters
largeCircleRadius = 15
smallCircleRadius = 3
numLines = 100
#set up plot
fig, ax = plt.subplots()
ax.set_aspect('equal')
#set range of plot
ax.set_xlim((-1*largeCircleRadius - 5, largeCircleRadius + 5))
ax.set_ylim((-1*largeCircleRadius - 5, largeCircleRadius + 5))
#function that uses scipy (a technical computing python library) to find the intersection of two functions
def findIntersection(fun1,fun2,x0):
return fsolve(lambda x : fun1(x) - fun2(x),x0)
countIntersectingLines = 0
#radius method
i = 0
while i < numLines:
direction = random.uniform(0, 360) #chooses random angle
radius = random.uniform(0,largeCircleRadius) #chooses random distance along that angle
#set midpoint of line based on random values above
midpointx = radius * math.cos(math.radians(direction))
midpointy = radius * math.sin(math.radians(direction))
def f1(x): #equation of line passing through the chosen midpoint (modified from point-slope form)
y = -1*(midpointx/midpointy)*(x-midpointx) + midpointy
return y
def f2(x): #equation for a circle, alternates between top and bottom half to ensure random distribution
if i%2 == 0:
y = np.sqrt(math.fabs((largeCircleRadius**2 - x**2)))
if i%2 == 1:
y = -np.sqrt(math.fabs((largeCircleRadius**2 - x**2)))
return y
solution1 = findIntersection(f1, f2,0.0) #x-coordinate of one intersection between chord and circle
solution2 = (midpointx - solution1) + midpointx #x-coordinate of opposing intersection
#setting coordinates for chord endpoints
x1 = solution1
y1 = f1(solution1)
x2 = solution2
y2 = f1(solution2)
if(x1**2 + y1**2 <= largeCircleRadius**2 and x2**2 + y2**2 <= largeCircleRadius**2): #checks if solution is correct (some are extraneous)
#plots lines
linex, liney = [x1, x2], [y1, y2]
ax.plot(linex, liney, marker = '')
#uncomment the line below to also plot the midpoints of the lines
#ax.plot((midpointx), (midpointy), 'o', color='g')
if midpointx**2 + midpointy**2 <= smallCircleRadius**2: #checks if chord intersects smaller circle
countIntersectingLines += 1
i += 1 #increments while loop
#draw the circles
largeCircle = plt.Circle((0, 0), largeCircleRadius, color='b', fill=False, linewidth = 2, zorder = numLines)
smallCircle = plt.Circle((0,0), smallCircleRadius, color = 'b', fill = False, linewidth = 2, zorder = numLines + 1)
ax.add_artist(largeCircle)
ax.add_artist(smallCircle)
#calculate probablity
theoreticalProbability = float(smallCircleRadius)/largeCircleRadius
probabilityOfIntersect = float(countIntersectingLines)/numLines
#title graph
plotTitle = ("Radius Method \n Large Circle Radius: " + str(largeCircleRadius) +
"\n Small Circle Radius: " + str(smallCircleRadius) +
"\n Number of Chords: " + str(numLines) +
"\n Theoretical Probability of Intersect: " + str(theoreticalProbability) +
"\n Experimental Probability of Intersect: " + str(probabilityOfIntersect))
plt.title(plotTitle)
#fig.savefig('radiusMethod.png')
"""
Created on Thu Jul 20 19:21:48 2017
@author: Rashida Hakim
title: ENDPOINT METHOD
"""
import math
import random
import matplotlib.pyplot as plt
#user parameters
largeCircleRadius = 15
smallCircleRadius = 3
numLines = 100
#set up plot
fig, ax = plt.subplots()
ax.set_aspect('equal')
#set range of plot
ax.set_xlim((-1*largeCircleRadius - 5, largeCircleRadius + 5))
ax.set_ylim((-1*largeCircleRadius - 5, largeCircleRadius + 5))
countIntersectingLines = 0
#endpoint method
for i in range(0,numLines):
#selects two random angles
theta1 = random.uniform(0,360)
theta2 = random.uniform(0,360)
#determines two points along the circle based on above angles
x1 = largeCircleRadius*math.cos(math.radians(theta1))
y1 = largeCircleRadius*math.sin(math.radians(theta1))
x2 = largeCircleRadius*math.cos(math.radians(theta2))
y2 = largeCircleRadius*math.sin(math.radians(theta2))
#calculates x and y coordinates of midpoints
midpointx = float(x1 + x2)/2
midpointy = float(y1 + y2)/2
#plots lines
linex, liney = [x1, x2], [y1, y2]
ax.plot(linex, liney, marker = '')
#uncomment the line below to also plot the midpoints of the lines
#ax.plot((midpointx), (midpointy), 'o', color='g')
if midpointx**2 + midpointy**2 <= smallCircleRadius**2: #checks if chord intersects smaller circle
countIntersectingLines += 1
#draw the circles
largeCircle = plt.Circle((0, 0), largeCircleRadius, color='b', fill=False, linewidth = 2, zorder = numLines)
smallCircle = plt.Circle((0,0), smallCircleRadius, color = 'b', fill = False, linewidth = 2, zorder = numLines + 1)
ax.add_artist(largeCircle)
ax.add_artist(smallCircle)
#calculate probablity
theoreticalProbability = float(math.atan(smallCircleRadius/largeCircleRadius))/(math.pi/2)
probabilityOfIntersect = float(countIntersectingLines)/numLines
#title graph
plotTitle = ("Endpoint Method \n Large Circle Radius: " + str(largeCircleRadius) +
"\n Small Circle Radius: " + str(smallCircleRadius) +
"\n Number of Chords: " + str(numLines) +
"\n Theoretical Probability of Intersect: " + str(theoreticalProbability) +
"\n Experimental Probability of Intersect: " + str(probabilityOfIntersect))
plt.title(plotTitle)
#fig.savefig('endpointMethod.png')