CALCULADORA DEL LANZADOR · VERSIÓN DIDÁCTICA

ARCHIVOS PRINCIPALES
1. modelo_basico.py: ecuaciones, validaciones y búsqueda de la solución.
2. calculadora_basica.py: ventana con campos, botones, tabla y gráfica.

PARA ABRIR
En este computador, abre «Abrir Calculadora» en la carpeta Proyecto.
En otro computador con Python 3.10+ y Tkinter:
    python calculadora_basica.py
No requiere instalar paquetes de pip.

QUÉ HACE
Ingresa la distancia desde el pie del pivote, entre 1 y 6 m (rango de
diseño). Si escribes más de 6 m, el programa avisa que no es posible.
Calcula las cinco posiciones
de tiro: 15°, 30°, 45°, 60° y 75°. Marca la que requiere menor extensión.
Puedes seleccionar una fila para destacar esa trayectoria.
Compara varillas macizas de 8 y 10 mm conservando los demás parámetros.
Los valores iniciales son referenciales; todavía no son datos de un ensayo.

ESTRUCTURAS DE PYTHON QUE SE USAN
Variables: distancia, angulo, velocidad y recorrido.
Operaciones: +, -, *, / y ** para potencias.
Comparaciones: <, >, <=, >=, == y !=.
Condiciones: if, elif y else.
Bucles: for y range.
Funciones: def y return, para dividir el problema en pasos.
Listas: guardan los resultados y puntos de cada trayectoria.
Diccionarios: relacionan cada nombre con su parámetro o resultado.
try y except: muestran una explicación si se introduce un dato incorrecto.
math: seno, coseno, raíz cuadrada, pi y conversión a radianes.
tkinter: ventana y botones; csv y json: archivos de la biblioteca estándar.
No hay clases propias, herencia, dataclasses ni hilos en estos dos archivos.

EJEMPLO REAL DEL PROGRAMA
    if datos["varilla"] == "8":
        p["diametro_varilla"] = 0.008
    elif datos["varilla"] == "10":
        p["diametro_varilla"] = 0.010
    else:
        raise ValueError("Selecciona una varilla de 8 o 10 mm.")

CÓMO EXPLICAR EL CÁLCULO
1. Lee los campos y convierte mm a m, y g a kg.
2. Rechaza datos vacíos, no numéricos, infinitos o fuera de sus intervalos.
3. Recorre los cinco ángulos con un bucle for.
4. Para cada ángulo prueba una velocidad intermedia:
   if la pelota no llega, aumenta el límite inferior;
   else disminuye el límite superior.
   Repite 26 veces: este procedimiento se llama bisección.
5. Calcula la extensión necesaria mediante energía e impacto.
6. Compara la extensión con el límite propuesto.
7. Elige la menor extensión con if / elif y muestra las cinco filas.

ECUACIONES Y UNIDADES
F de ambos resortes = 2(Fi + k*x).
E liberada = k*(x² - x0²) + 2*Fi*(x - x0).
Recorrido adicional s = x - x0.
Longitud cargada L = longitud natural + x.
El vuelo incluye arrastre cuadrático opcional y gravedad.
El programa también considera, opcionalmente, el peso del mecanismo y la
subida de la pelota dentro del cañón. Conserva el modelo del sitio web.

GUARDAR Y RECUPERAR
«Guardar configuración» crea un JSON con los campos e interruptores.
«Abrir configuración» valida ese archivo antes de modificar los campos.
«Exportar CSV» guarda la tabla; cada encabezado indica su unidad.
La versión didáctica exporta longitudes en mm y masa móvil en g, como la
pantalla; el CSV de la versión anterior utiliza metros y kg.
Cambiar un campo borra los resultados anteriores y bloquea su exportación
hasta recalcular. Guardar parámetros no los convierte en mediciones.

RESULTADO DE CONTROL, CON LOS VALORES INICIALES
Distancia: 4 m; varilla: 8 mm; menor extensión calculada: ángulo 30°.
Velocidad aproximada: 6,57 m/s; extensión total aproximada: 162,7 mm.
Recorrido adicional aproximado: 152,7 mm; fuerza de ambos resortes: 20,90 N.
Son predicciones del modelo, no prestaciones comprobadas del prototipo.

PENDIENTE EXPERIMENTAL
Medir k, Fi, masas, geometría y resultados del vuelo. «Dentro» solo compara
x con el límite introducido. No valida ganchos, gatillo, fatiga ni despejes.
La ventana anterior con ajuste de mediciones sigue en calculadora.py y se
puede abrir desde «Medir Resortes» en la carpeta Proyecto.

VERIFICACIÓN
Las 20 pruebas del conjunto pasan, incluida la comparación de 80 casos de
la versión básica con el motor anterior. Se comprobaron cálculo, selección,
guardado/lectura JSON, CSV y rechazo de resultados desactualizados.
Ejecutar desde esta carpeta:
    python -m unittest discover -p "test_*.py" -v
Los archivos test_*.py son de verificación; no forman parte de la lógica
didáctica y pueden usar estructuras adicionales de unittest.
