JHON FREDY GONZÁLEZ commited on
Commit
c08466e
·
verified ·
1 Parent(s): 96b9af3

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +112 -0
app.py ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import gradio as gr
3
+ import matplotlib.pyplot as plt
4
+ from PIL import Image
5
+
6
+ # Cargar la imagen del logo (asegúrate de que el archivo esté en la ruta correcta)
7
+ logo_image = "LOGOCIPDOQUEBRADAS.png" # Asegúrate de que el archivo esté en la ruta correcta
8
+
9
+ def calcular_movimiento_parabolico(v0, angulo, h_inicial):
10
+ g = 9.81 # Aceleración debido a la gravedad (m/s^2)
11
+ angulo_rad = np.radians(angulo)
12
+
13
+ # Tiempo de vuelo considerando altura inicial
14
+ t_vuelo = (v0 * np.sin(angulo_rad) + np.sqrt((v0 * np.sin(angulo_rad))**2 + 2 * g * h_inicial)) / g
15
+
16
+ # Tiempo en intervalos
17
+ t = np.linspace(0, t_vuelo, num=500)
18
+
19
+ # Trayectoria
20
+ x = v0 * np.cos(angulo_rad) * t
21
+ y = h_inicial + v0 * np.sin(angulo_rad) * t - 0.5 * g * t**2
22
+
23
+ # Altura máxima
24
+ h_max = h_inicial + (v0**2 * np.sin(angulo_rad)**2) / (2 * g)
25
+
26
+ # Alcance máximo
27
+ alcance_max = v0 * np.cos(angulo_rad) * t_vuelo
28
+
29
+ return x, y, h_max, alcance_max, t_vuelo
30
+
31
+ def graficar(v0, angulo, h_inicial):
32
+ x, y, h_max, alcance_max, t_vuelo = calcular_movimiento_parabolico(v0, angulo, h_inicial)
33
+
34
+ plt.figure(figsize=(10, 5))
35
+ plt.plot(x, y, label='Trayectoria', color='purple')
36
+ plt.title('Movimiento Parabólico')
37
+ plt.xlabel('Distancia (m)')
38
+ plt.ylabel('Altura (m)')
39
+ plt.grid(True)
40
+
41
+ # Cálculo de componentes de velocidad
42
+ vx = v0 * np.cos(np.radians(angulo))
43
+ vy = v0 * np.sin(np.radians(angulo))
44
+
45
+ # Añadir vectores
46
+ plt.quiver(0, h_inicial, vx, vy, angles='xy', scale_units='xy', scale=1, color='r', label='Vector de Lanzamiento (V0)')
47
+ plt.quiver(0, h_inicial, vx, 0, angles='xy', scale_units='xy', scale=1, color='g', label='Componente x (Vx)')
48
+ plt.quiver(0, h_inicial, 0, vy, angles='xy', scale_units='xy', scale=1, color='b', label='Componente y (Vy)')
49
+
50
+ plt.axhline(0, color='k', linewidth=0.5, linestyle='--')
51
+ plt.axvline(0, color='k', linewidth=0.5, linestyle='--')
52
+
53
+ plt.xlim(0, alcance_max * 1.1)
54
+ plt.ylim(0, h_max * 1.1)
55
+
56
+ # Dibujar el arco del ángulo
57
+ angulo_rad = np.arctan2(vy, vx)
58
+ arco_x = np.linspace(0, vx, 100)
59
+ arco_y = h_inicial + (arco_x * np.tan(angulo_rad))
60
+ plt.plot(arco_x, arco_y, color='orange', label='Ángulo de Lanzamiento')
61
+ plt.text(vx / 2, h_inicial + 2, f'Ángulo: {angulo}°', fontsize=12, color='orange', ha='center')
62
+
63
+ plt.legend()
64
+ plt.savefig('plot.png') # Guardar la gráfica
65
+ plt.close()
66
+
67
+ # Formatear la salida del texto con las ecuaciones en formato LaTeX
68
+ resultado = (
69
+ "**Ecuaciones del Movimiento Parabólico:** \n"
70
+ "$$ h_{max} = h_0 + \\frac{v_0^2 \\sin^2(\\theta)}{2g} $$ \n"
71
+ "$$ R = \\frac{v_0 \\cos(\\theta)}{g} \\left( v_0 \\sin(\\theta) + \\sqrt{(v_0 \\sin(\\theta))^2 + 2gh_0} \\right) $$ \n"
72
+ "$$ t_{vuelo} = \\frac{v_0 \\sin(\\theta) + \\sqrt{(v_0 \\sin(\\theta))^2 + 2gh_0}}{g} $$ \n"
73
+ "Ecuaciones de posición: \n"
74
+ "$$ x(t) = v_0 \\cos(\\theta) \\cdot t $$ \n"
75
+ "$$ y(t) = h_0 + v_0 \\sin(\\theta) \\cdot t - \\frac{1}{2} g \\cdot t^2 $$ \n\n"
76
+ "**Valores calculados:** \n"
77
+ f"- Altura máxima (h_max): {h_max:.2f} m \n"
78
+ f"- Alcance máximo (R): {alcance_max:.2f} m \n"
79
+ f"- Tiempo de vuelo (t_vuelo): {t_vuelo:.2f} s"
80
+ )
81
+
82
+ return Image.open('plot.png'), resultado, 'plot.png' # Devolver la ruta del archivo
83
+
84
+ # Crear la interfaz de Gradio
85
+ with gr.Blocks() as interfaz:
86
+ # Mostrar el logo en la parte superior con tamaño ajustado
87
+ with gr.Row():
88
+ gr.Image(logo_image, show_label=False, interactive=False, width=300, height=150) # Ajusta los valores según sea necesario
89
+
90
+ # Título de la interfaz
91
+ gr.Markdown("## **Simulación de Movimiento Parabólico - UNAD CIP Dosquebradas ECBTI**")
92
+ gr.Markdown("**Ingrese los valores para la simulación**")
93
+
94
+ # Entradas para velocidad, ángulo y altura inicial usando sliders
95
+ with gr.Row():
96
+ v0_input = gr.Slider(label="Velocidad Inicial (m/s)", minimum=0, maximum=100, value=20, step=1)
97
+ angulo_input = gr.Slider(label="Ángulo de Lanzamiento (grados)", minimum=0, maximum=90, value=45, step=1)
98
+ h_inicial_input = gr.Number(label="Altura Inicial (m)", value=0)
99
+
100
+ # Salidas para la gráfica y resultados
101
+ output_image = gr.Image(type="pil")
102
+ output_markdown = gr.Markdown(label="Ecuaciones y Valores Calculados")
103
+
104
+ # Botón para generar gráfica
105
+ boton_graficar = gr.Button("Generar Gráfica")
106
+ boton_descargar = gr.File(label="Descargar Gráfica", type="filepath") # Cambiado a filepath
107
+
108
+ # Funcionalidad del botón
109
+ boton_graficar.click(fn=graficar, inputs=[v0_input, angulo_input, h_inicial_input], outputs=[output_image, output_markdown, boton_descargar])
110
+
111
+ # Lanzar la interfaz
112
+ interfaz.launch()