import numpy as np ##Librería de operadores matematicos y valores
import matplotlib.pyplot as plt ##Librería de graficas
def circle1Pos(x): ##Metodo de la funcion del circulo positivo
return 10 + np.sqrt(400 - (x+10)**2)
def circle1Neg(x): ##Metodo de la funcion del circulo negativo
return 10 - np.sqrt(400 - (x+10)**2)
def circle2Pos(x):
return 10 + np.sqrt(400 - (x-10)**2)
def circle2Neg(x):
return 10 - np.sqrt(400 - (x-10)**2)
def circle3Pos(x):
return -10 + np.sqrt(400 - (x+10)**2)
def circle3Neg(x):
return -10 - np.sqrt(400 - (x+10)**2)
def circle4Pos(x):
return -10 + np.sqrt(400 - (x-10)**2)
def circle4Neg(x):
return -10 - np.sqrt(400 - (x-10)**2)
x_vals = np.linspace(-10, 10, 100) ##Se obtiene un rango de 100 valores de x entre -10 y 10
y_vals_pos1= circle1Pos(x_vals) ##Se obtiene los valores positivos con los valores de x
y_vals_neg1 = circle1Neg(x_vals) ##Se obtiene los valores negativos con los valores de x
y_vals_pos2= circle2Pos(x_vals)
y_vals_neg2 = circle2Neg(x_vals)
y_vals_pos3= circle3Pos(x_vals)
y_vals_neg3 = circle3Neg(x_vals)
y_vals_pos4= circle4Pos(x_vals)
y_vals_neg4 = circle4Neg(x_vals)
plt.plot(x_vals, y_vals_pos1, 'b') ##Graficamos x con los valores positivos de la funcion
plt.plot(x_vals, y_vals_neg1, 'b') ##Graficamos x con los valores negativos de la funcion
plt.plot(x_vals, y_vals_pos2, 'r')
plt.plot(x_vals, y_vals_neg2, 'r')
plt.plot(x_vals, y_vals_pos3, 'g')
plt.plot(x_vals, y_vals_neg3, 'g')
plt.plot(x_vals, y_vals_pos4, 'y')
plt.plot(x_vals, y_vals_neg4, 'y')
plt.ylim(-11, 11) ##Establemos limitis del plano cartesiano
plt.xlim(-11, 11)
plt.show() ##Mostramos la grafica
def realizar_muestra(a, b, n=1000): ##Obtenemos un rango de valores de muestra de forma aleatoria
return np.random.rand(n)*(b - a) + a
def hit_and_miss(a, b, c,d, n,method): ##Metodo de hit and miss
x_dentro, x_fuera = [], []
y_dentro, y_fuera = [], []
for i in range(n):
x_r = realizar_muestra(a, b, 1) # generamos un solo valor
y_r = realizar_muestra(c, d, 1) # generamos un solo valor
if y_r < method(x_r): # punto dentro
x_dentro += [x_r] # append element to list
y_dentro += [y_r] # append element to list
else: # punto fuera
x_fuera += [x_r] # append element to list
y_fuera += [y_r] # append element to list
return x_dentro, y_dentro, x_fuera, y_fuera # devuelve una tupla con 4 elementos
t_muestras = [100, 1000,5000] ##Definimos la cantidad de muestras o dardos
for t in t_muestras: ##Calculos de los dardos de cada funcion
puntos1 = hit_and_miss(0,10,-10,0, t,circle1Neg) ##Obtenemos los dardos solamente de los lados que nos interesa calcular
puntos2 = hit_and_miss(-10, 0, -10,0,t,circle2Neg)
puntos3 = hit_and_miss(0, 10, 0, 10,t,circle3Pos)
puntos4 = hit_and_miss(-10, 0, 0, 10,t,circle4Pos)
area_cuadrado1 = (10-0)*10 ##Calculamos el area del cuadrado con respecto a cada ecuación (b-a)*c
area_cuadrado2 = (0+10)*10
area_cuadrado3 = (10-0)*0
area_cuadrado4 = (0+10)*0 ##Calculamos el area de cada funcion
area1 = len(puntos1[0]) / t * area_cuadrado1 ##Calculamos el area final de cada funciona solamente los puntos que nos insteresa
area2 = len(puntos2[0]) / t * area_cuadrado2
area3 = len(puntos3[0]) / t * area_cuadrado3
area4 = len(puntos4[0]) / t * area_cuadrado4
print("Area para n "+str(t), "dardos, es:", area1+area2+area3+area4) ##Imprimimos el valor del area total con la cantidad de dardos
plt.plot(x_vals, y_vals_neg1) ##Mostramos la grafica del problema
plt.plot(x_vals, y_vals_neg2)
plt.plot(x_vals, y_vals_pos3)
plt.plot(x_vals, y_vals_pos4) ##Hacemos impresion de los dardos de cada funcion
plt.plot(puntos1[0], puntos1[1], 'co') ##Se imprime los dardos que estan dentro de la funcion
plt.plot(puntos1[2], puntos1[3], 'ko') ##Se imprimen los dardos que estan fuera de la funcion
plt.plot(puntos2[0], puntos2[1], 'co')
plt.plot(puntos2[2], puntos2[3], 'ko')
plt.plot(puntos3[0], puntos3[1], 'ko')
plt.plot(puntos3[2], puntos3[3], 'co')
plt.plot(puntos4[0], puntos4[1], 'ko')
plt.plot(puntos4[2], puntos4[3], 'co')
plt.show()