Spaces:
Sleeping
Sleeping
| import numpy as np | |
| import gradio as gr | |
| import matplotlib.pyplot as plt | |
| from PIL import Image | |
| # Cargar la imagen del logo (asegúrate de que el archivo esté en la ruta correcta) | |
| logo_image = "LOGOCIPDOQUEBRADAS.png" # Asegúrate de que el archivo esté en la ruta correcta | |
| def calcular_movimiento_parabolico(v0, angulo, h_inicial): | |
| g = 9.81 # Aceleración debido a la gravedad (m/s^2) | |
| angulo_rad = np.radians(angulo) | |
| # Tiempo de vuelo considerando altura inicial | |
| t_vuelo = (v0 * np.sin(angulo_rad) + np.sqrt((v0 * np.sin(angulo_rad))**2 + 2 * g * h_inicial)) / g | |
| # Tiempo en intervalos | |
| t = np.linspace(0, t_vuelo, num=500) | |
| # Trayectoria | |
| x = v0 * np.cos(angulo_rad) * t | |
| y = h_inicial + v0 * np.sin(angulo_rad) * t - 0.5 * g * t**2 | |
| # Altura máxima | |
| h_max = h_inicial + (v0**2 * np.sin(angulo_rad)**2) / (2 * g) | |
| # Alcance máximo | |
| alcance_max = v0 * np.cos(angulo_rad) * t_vuelo | |
| return x, y, h_max, alcance_max, t_vuelo | |
| def graficar(v0, angulo, h_inicial): | |
| x, y, h_max, alcance_max, t_vuelo = calcular_movimiento_parabolico(v0, angulo, h_inicial) | |
| plt.figure(figsize=(10, 5)) | |
| plt.plot(x, y, label='Trayectoria', color='purple') | |
| plt.title('Movimiento Parabólico') | |
| plt.xlabel('Distancia (m)') | |
| plt.ylabel('Altura (m)') | |
| plt.grid(True) | |
| # Cálculo de componentes de velocidad | |
| vx = v0 * np.cos(np.radians(angulo)) | |
| vy = v0 * np.sin(np.radians(angulo)) | |
| # Añadir vectores | |
| plt.quiver(0, h_inicial, vx, vy, angles='xy', scale_units='xy', scale=1, color='r', label='Vector de Lanzamiento (V0)') | |
| plt.quiver(0, h_inicial, vx, 0, angles='xy', scale_units='xy', scale=1, color='g', label='Componente x (Vx)') | |
| plt.quiver(0, h_inicial, 0, vy, angles='xy', scale_units='xy', scale=1, color='b', label='Componente y (Vy)') | |
| plt.axhline(0, color='k', linewidth=0.5, linestyle='--') | |
| plt.axvline(0, color='k', linewidth=0.5, linestyle='--') | |
| plt.xlim(0, alcance_max * 1.1) | |
| plt.ylim(0, h_max * 1.1) | |
| # Dibujar el arco del ángulo | |
| angulo_rad = np.arctan2(vy, vx) | |
| arco_x = np.linspace(0, vx, 100) | |
| arco_y = h_inicial + (arco_x * np.tan(angulo_rad)) | |
| plt.plot(arco_x, arco_y, color='orange', label='Ángulo de Lanzamiento') | |
| plt.text(vx / 2, h_inicial + 2, f'Ángulo: {angulo}°', fontsize=12, color='orange', ha='center') | |
| plt.legend() | |
| plt.savefig('plot.png') # Guardar la gráfica | |
| plt.close() | |
| # Formatear la salida del texto con las ecuaciones en formato LaTeX | |
| resultado = ( | |
| "**Ecuaciones del Movimiento Parabólico:** \n" | |
| "$$ h_{max} = h_0 + \\frac{v_0^2 \\sin^2(\\theta)}{2g} $$ \n" | |
| "$$ R = \\frac{v_0 \\cos(\\theta)}{g} \\left( v_0 \\sin(\\theta) + \\sqrt{(v_0 \\sin(\\theta))^2 + 2gh_0} \\right) $$ \n" | |
| "$$ t_{vuelo} = \\frac{v_0 \\sin(\\theta) + \\sqrt{(v_0 \\sin(\\theta))^2 + 2gh_0}}{g} $$ \n" | |
| "Ecuaciones de posición: \n" | |
| "$$ x(t) = v_0 \\cos(\\theta) \\cdot t $$ \n" | |
| "$$ y(t) = h_0 + v_0 \\sin(\\theta) \\cdot t - \\frac{1}{2} g \\cdot t^2 $$ \n\n" | |
| "**Valores calculados:** \n" | |
| f"- Altura máxima (h_max): {h_max:.2f} m \n" | |
| f"- Alcance máximo (R): {alcance_max:.2f} m \n" | |
| f"- Tiempo de vuelo (t_vuelo): {t_vuelo:.2f} s" | |
| ) | |
| return Image.open('plot.png'), resultado, 'plot.png' # Devolver la ruta del archivo | |
| # Crear la interfaz de Gradio | |
| with gr.Blocks() as interfaz: | |
| # Mostrar el logo en la parte superior con tamaño ajustado | |
| with gr.Row(): | |
| gr.Image(logo_image, show_label=False, interactive=False, width=300, height=150) # Ajusta los valores según sea necesario | |
| # Título de la interfaz | |
| gr.Markdown("## **Simulación de Movimiento Parabólico - UNAD CIP Dosquebradas ECBTI**") | |
| gr.Markdown("**Ingrese los valores para la simulación**") | |
| # Entradas para velocidad, ángulo y altura inicial usando sliders | |
| with gr.Row(): | |
| v0_input = gr.Slider(label="Velocidad Inicial (m/s)", minimum=0, maximum=100, value=20, step=1) | |
| angulo_input = gr.Slider(label="Ángulo de Lanzamiento (grados)", minimum=0, maximum=90, value=45, step=1) | |
| h_inicial_input = gr.Number(label="Altura Inicial (m)", value=0) | |
| # Salidas para la gráfica y resultados | |
| output_image = gr.Image(type="pil") | |
| output_markdown = gr.Markdown(label="Ecuaciones y Valores Calculados") | |
| # Botón para generar gráfica | |
| boton_graficar = gr.Button("Generar Gráfica") | |
| boton_descargar = gr.File(label="Descargar Gráfica", type="filepath") # Cambiado a filepath | |
| # Funcionalidad del botón | |
| boton_graficar.click(fn=graficar, inputs=[v0_input, angulo_input, h_inicial_input], outputs=[output_image, output_markdown, boton_descargar]) | |
| # Lanzar la interfaz | |
| interfaz.launch() | |