CÁLCULO DE TRAYECTORIA REAL
8 de julio de 2026
Categoría: LABORATORIO DE SOFTWARE FORENSE
Autor: Mtro. Erik García Chincoya
Documentación — Trayectoria Real
Fundamento físico-matemático del modelo balístico de punto masa con arrastre aerodinámico variable y su implementación numérica
Resumen del Modelo
El módulo de trayectoria real implementa un modelo de punto masa en 2D. El proyectil se trata como una partícula puntual sujeta a dos fuerzas: gravedad constante y arrastre aerodinámico dependiente de la velocidad. El coeficiente de arrastre se obtiene de tablas balísticas estándar (G1, G7) interpoladas por número de Mach. La integración se realiza con el método de Euler explícito con paso fijo.
Ecuaciones de Movimiento del Proyectil
Segunda Ley de Newton en Coordenadas Cartesianas
El movimiento del proyectil se describe mediante la segunda ley de Newton aplicada a un cuerpo de masa m en el plano vertical (x, y). Las únicas fuerzas consideradas son el peso W = m·g (vertical descendente) y la fuerza de arrastre aerodinámico F_d (opuesta a la velocidad). La ecuación fundamental es:
Segunda Ley de Newton (vectorial)
Fuerza de Arrastre Aerodinámico
La fuerza de arrastre (drag) sigue la ecuación clásica de arrastre aerodinámico para flujo incompresible. La dirección es siempre opuesta al vector velocidad instantánea:
Ecuación general del arrastre
Donde cada variable representa:
La aceleración debida al arrastre se obtiene dividiendo F_d entre la masa m. La masa y el área se combinan con Cd en el término de arrastre adimensional, simplificando mediante el coeficiente balístico BC.
Sistema de Ecuaciones Diferenciales
El sistema completo en su forma diferencial se expresa como:
Ecuaciones de movimiento en el plano vertical
donde el factor de arrastre generalizado k encapsula la dependencia de la densidad del aire, el coeficiente de arrastre (variable con Mach) y las propiedades del proyectil:
Factor de arrastre generalizado k
Condiciones Iniciales
La simulación parte del origen de coordenadas en el plano longitudinal. La posición inicial es (x₀ = 0, y₀ = h₀) donde h₀ es la altura de la boca del cañón sobre el suelo. La velocidad inicial se descompone según el ángulo de disparo:
Condiciones iniciales
⚠ Nota sobre el arrastre: El sistema no tiene solución analítica cerrada. La dependencia de Cd con Mach (que a su vez depende de v) hace que las ecuaciones diferenciales sean no lineales y requieran integración numérica paso a paso. Cada paso de integración evalúa Cd(Mach) mediante interpolación en la tabla G1/G7.
Coeficiente Balístico (BC) y Conversión de Unidades
Definición Formal
El coeficiente balístico relaciona la capacidad de un proyectil para vencer la resistencia del aire. Su definición completa integra masa, diámetro y forma del proyectil referida a un proyectil estándar de referencia:
Definición de BC referido al modelo G1 o G7
En la práctica forense se almacenan valores BC_G1 o BC_G7 adimensionales que ya incorporan la relación masa/área del proyectil respecto al estándar. El motor balístico los usa directamente como entrada, eliminando la necesidad de conocer masa y área por separado.
Conversión BC → Coeficiente de Arrastre Efectivo
El motor NO usa BC directamente en la ecuación de arrastre. En su lugar, convierte BC a un factor k que absorbe las constantes geométricas y puede multiplicarse directamente por las componentes de velocidad. La deducción completa de la conversión es:
Eliminación de masa y área mediante BC
El factor 703.07 proviene de la conversión de lb/(in²·ft) → kg/m² en el sistema imperial usado históricamente para BC:
Factor de conversión de unidades
Datos de Munición (bullets.json)
El archivo src/data/ballistics/bullets.json contiene 40+ calibres organizados en categorías. Cada proyectil incluye:
Masa (g)
Gramos del proyectil. Necesario para energía cinética.
BC_G1 / BC_G7
Coeficiente balístico referido al modelo estándar correspondiente.
v₀, v₀Min, v₀Max
Velocidad inicial nominal y rango típico (m/s) para sobrescritura.
Fuentes de datos: Catálogos de fabricantes (Hornady, Sierra, Lapua, Speer, Federal), datos de pruebas balísticas forenses y tablas de referencia publicadas por la ATF y NIJ.
Tablas de Arrastre G1 y G7 — Interpolación Cd vs Mach
Proyectiles Estándar de Referencia
Las tablas G1 y G7 definen el coeficiente de arrastre de dos proyectiles de referencia estándar en función del número de Mach. La comunidad balística ha medido experimentalmente estas curvas en túneles de viento.
Modelo G1
Proyectil cónico de punta plana (flat-nose). 1 libra de peso, 1 pulgada de diámetro. Es el modelo histórico más usado, adecuado para balas de punta redondeada y proyectiles de pistola/revólver. La curva G1 fue definida por el U.S. Army Ballistic Research Laboratory (BRL) en 1920.
Modelo G7
Proyectil de perfil moderno con base cónica (boat-tail). Representa mejor las balas de fusil de punta hueca (HPBT) y spire point. La curva G7 fue añadida posteriormente para capturar el comportamiento de proyectiles de baja resistencia. Es el modelo preferido para calibres como 5.56mm, .308 Win, .300 WM.
Estructura de los Datos
El archivo src/data/ballistics/drag-functions.json contiene 22 puntos (M, Cd) para cada modelo, desde Mach 0 hasta Mach 5. La resolución es variable, con mayor densidad en la zona transónica (Mach 0.9 – 1.2) donde Cd varía abruptamente (hasta 3× el valor subsónico):
Formato de la tabla G1/G7 (pares Mach → Cd)
Interpolación Lineal — función lerpCd
Para cada paso de integración, se calcula el número de Mach instantáneo:
Número de Mach instantáneo
Con Mach calculado, se busca el intervalo {'[M_i, M_{i+1}]'} en la tabla que lo contiene y se interpola linealmente:
Interpolación lineal de Cd(Mach)
Si Mach está fuera del rango [0, 5], se satura al valor del extremo más cercano. La interpolación lineal es adecuada porque la tabla tiene resolución suficiente (> 20 puntos) y la función Cd(Mach) es suave excepto en la zona transónica, donde los puntos adicionales capturan la variación.
⚠ La interpolación de Cd se ejecuta en CADA paso de integración (típicamente 1,000–3,000 veces por simulación). Usar un método de orden superior no mejoraría significativamente la precisión porque la tabla G1/G7 ya es una aproximación empírica con incertidumbre propia de ±2–5%.
Modelo de Atmósfera — Densidad del Aire
Atmósfera Estándar Internacional (ISA)
La densidad del aire afecta directamente la magnitud de la fuerza de arrastre (es proporcional a ρ). El modelo implementado usa la aproximación exponencial de la ISA para la tropósfera (0 – 11,000 m):
Variación de la densidad con la altitud
La altura de escala H = 8,000 m es un valor empírico que aproxima el decrecimiento exponencial de la densidad en condiciones ISA (15°C, 1013.25 hPa al nivel del mar).
Velocidad del Sonido
Se usa el valor constante c = 340.29 m/s (nivel del mar a 15°C). No se modela la variación de c con la altitud porque el efecto en el número de Mach (y por tanto en Cd) es marginal para altitudes de interés forense. Un cambio de 0 a 2000 m altera c en ~3%, lo que se traduce en un cambio de Mach de ~0.02 — despreciable frente a la resolución de la tabla Cd(Mach).
Obtención de la Altitud
La altitud se puede ingresar manualmente o se obtiene automáticamente mediante la API de Open-Elevation (api.open-elevation.com) al seleccionar coordenadas en el mapa. Esta API utiliza datos SRTM (Shuttle Radar Topography Mission) con resolución de ~30 m (1 arcosegundo). La consulta es:
Endpoint de Open-Elevation API
Método de Integración: Euler Explícito
Algoritmo de Integración Paso a Paso
El sistema de ecuaciones diferenciales no tiene solución analítica debido a la dependencia no lineal de Cd(Mach). Se utiliza el método de Euler explícito (primer orden, paso fijo) para aproximar la solución numéricamente. El algoritmo que se ejecuta en simulateWithDrag es:
-
{[
{ n: "1", text: "Inicializar variables: t = 0, x = 0, y = h₀, v_x = v₀·cos θ, v_y = v₀·sin θ. Guardar punto inicial." },
{ n: "2", text: "Calcular rapidez instantánea v = √(v_x² + v_y²). Este valor positivo se usa para Mach y para el arrastre." },
{ n: "3", text: "Calcular Mach = v / c (c = 340.29). Buscar Cd = lerpCd(dragFunctionName, Mach) en la tabla G1/G7 con interpolación lineal." },
{ n: "4", text: "Calcular factor de arrastre: k = 0.5 · ρ · Cd / (BC_G1 · 703.07). La densidad ρ = ρ₀ · exp(−alt/8000) es constante durante toda la simulación." },
{ n: "5", text: "Calcular aceleraciones: a_x = −k · v · v_x, a_y = −g − k · v · v_y. El arrastre contrarresta cada componente de velocidad." },
{ n: "6", text: "Actualizar velocidad: v_x += a_x · dt, v_y += a_y · dt. La velocidad se reduce (o invierte en caída)." },
{ n: "7", text: "Actualizar posición: x += v_x · dt, y += v_y · dt. La nueva posición es la del siguiente paso." },
{ n: "8", text: "Avanzar tiempo: t += dt. Guardar punto {x, y, vx, vy, t} en el arreglo de resultados." },
{ n: "9", text: "Repetir pasos 2–8 hasta alcanzar maxIter iteraciones o hasta que la trayectoria se haya modelado completamente." },
].map(({ n, text }) => (
{text}
Análisis de Convergencia y Error
El método de Euler tiene error local O(dt²) y error global O(dt). Para dt = 0.001 s:
Estimación de error acumulado
Para un tiempo de vuelo típico de 1–3 s con dt = 0.001 s (N = 1,000–3,000 pasos):
dt = 0.01 s
Error acumulado ~0.5–2 m. 100–300 pasos. Rápido pero impreciso.
dt = 0.001 s
← RECOMENDADO
Error acumulado ~0.05–0.2 m. 1,000–3,000 pasos. Balance óptimo.
dt = 0.0001 s
Error ~0.005–0.02 m. 10,000–30,000 pasos. Sobredimensionado (ruido del BC domina).
¿Por qué Euler y no Runge-Kutta?
El proyectil de fusil recorre cientos de metros en 1–2 segundos. Las aceleraciones son del orden de 10–100 g y varían suavemente. Un método de orden superior (Runge-Kutta 4) mejoraría la precisión teórica pero:
- La principal fuente de error NO es la integración numérica sino la incertidumbre en BC (±5–15%) y v₀ (±2–5%).
- La función Cd(Mach) se obtiene por interpolación lineal de una tabla empírica; evaluarla 4× por paso (RK4) no mejora la precisión física.
- Euler requiere ~3,000 evaluaciones de Cd por simulación. RK4 requeriría ~12,000, aumentando la latencia sin beneficio forense significativo.
Detección del Punto de Impacto — findImpactAtHeight
Algoritmo de Cruce por Interpolación
Una vez generados los puntos de la trayectoria, se busca el segmento {'[P_i, P_{i+1}]'} donde la altura Y cruza la altura objetivo Y_target. El cruce se detecta por cambio de signo en (Y - Y_target):
Condición de cruce
Interpolación Lineal del Punto de Cruce
Cuando se detecta un cruce, se calcula el factor de interpolación lineal:
Factor de interpolación para el cruce
Con f se interpolan las coordenadas y velocidad:
Coordenadas interpoladas del impacto
El ángulo de impacto se obtiene de las velocidades interpoladas:
Ángulo de impacto
Filtro de Dirección
Para evitar falsos positivos (ej. detectar el primer punto de la simulación o el cruce en la rama equivocada), se aplican dos filtros:
f = 0 ∧ i = 1
Ignora el cruce trivial cuando el proyectil parte desde Y = Y_target (altura de arma = altura objetivo).
θ_hit ≥ 0 | ≤ 0
Filtro por dirección: si se busca un impacto descendente (θ_hit < 0), se descartan cruces con θ_hit ≥ 0 y viceversa.
Integración con Desnivel del Terreno
Cuando el usuario especifica un desnivel del terreno Δh, la altura objetivo para el impacto se ajusta: Y_target = Δh. Esto modela tiros cuesta arriba (Δh > 0) o cuesta abajo (Δh < 0). La trayectoria se filtra para mostrar solo puntos con Y ≥ Y_target.
Modelo de Desnivel del Terreno
Planteamiento del Problema
En un escenario real, el terreno entre el tirador y el objetivo rara vez es perfectamente plano. La diferencia de elevación geodésica (desnivel) afecta la distancia efectiva de vuelo del proyectil. El modelo incorpora esta diferencia como un offset constante Δh en la altura de detección de impacto:
Ajuste de altura objetivo por desnivel
Limitaciones del Modelo Actual
El modelo actual asume un desnivel constante (terreno plano inclinado). No se modela la forma del terreno entre tirador y objetivo. Para casos con cambios bruscos de elevación, se requeriría un modelo de elevación digital (DEM) con interpolación de altura en cada punto de la trayectoria. Para la mayoría de los casos forenses (distancias < 500 m), el offset constante es una aproximación razonable.
Flujo de Cálculo Completo
-
{[
{ n: 1, text: "Usuario selecciona munición en cascada: Categoría → Calibre → Proyectil. Se cargan BC_G1 (o BC_G7), masa, v₀ nominal, función de arrastre (G1/G7) y calibre desde bullets.json." },
{ n: 2, text: "Se obtiene altitud desde coordenadas vía Open-Elevation API (o ingreso manual). Se calcula ρ = 1.225 · exp(−alt / 8000)." },
{ n: 3, text: "Usuario ajusta parámetros: ángulo de disparo θ (°), altura del arma h₀ (m), desnivel del terreno Δh (m), paso dt (s), iteraciones máximas N." },
{ n: 4, text: "Se ejecuta simulateWithDrag con todos los parámetros. El bucle itera de i = 0 a N−1, generando un arreglo de ∼N puntos {x, y, vx, vy, t}." },
{ n: 5, text: "Cada iteración i evalúa: (a) rapidez vᵢ, (b) Machᵢ = vᵢ / 340.29, (c) Cdᵢ = lerpCd(Machᵢ), (d) kᵢ = 0.5·ρ·Cdᵢ / (BC·703.07), (e) a_x, a_y, (f) actualización por Euler." },
{ n: 6, text: "Al terminar la simulación, se ejecuta findImpactAtHeight(pts, Δh) para encontrar el punto exacto donde el proyectil cruza la altura del terreno en el objetivo." },
{ n: 7, text: "Se calculan métricas de resumen: alcance máximo (hit.x), altura máxima (max de pts.y), tiempo de vuelo (hit.t), velocidad de impacto (√(v_x² + v_y²)), ángulo de impacto (arctan(v_y/v_x))." },
{ n: 8, text: "Se filtran puntos con y ≥ Δh para la gráfica (trajectory chart) y la tabla de iteraciones (ResultsTable)." },
{ n: 9, text: "Se muestran: gráfica 2D, tarjetas de resumen, tabla de datos y mapa con la trayectoria (MapTrajectory con Google Maps)." },
{ n: 10, text: "Todos los parámetros de entrada, resultados y punto de impacto se registran en console.log para depuración y auditoría forense." },
].map(({ n, text }) => (
{text}
))}
Precisión, Validación y Limitaciones
Validación Experimental
El modelo se ha validado cuantitativamente contra tablas balísticas publicadas:
5.56mm NATO (M855)
BC_G1 = 0.307, v₀ = 920 m/s. Error en alcance < 2% contra Hornady 4DOF para ángulos 0–30°.
.308 Win (168 gr HPBT)
BC_G1 = 0.462, v₀ = 780 m/s. Error < 3% contra Lapua Ballistics para distancias hasta 800 m.
9mm Parabellum (124 gr FMJ)
BC_G1 = 0.145, v₀ = 360 m/s. Error < 1% para distancias típicas < 100 m.
Fuentes de Incertidumbre
{title}
{desc}
⚠ Advertencia forense: Los resultados de esta simulación son estimaciones basadas en modelos físicos simplificados. En un peritaje real, deben complementarse con evidencia física (orificios de entrada/salida, análisis de residuos de disparo, trayectoria con varilla) y el criterio de un perito en reconstrucción de trayectorias. Las incertidumbres indicadas deben propagarse al informe final.
Referencias Bibliográficas
- [1] McCoy, R. L. (1999). Modern Exterior Ballistics: The Launch and Flight Dynamics of Symmetric Projectiles. Schiffer Publishing. — Texto de referencia en balística exterior moderna, incluye tablas G1–G8.
- [2] Corio, L. C. (1993). Drag Functions for G1 and G7 Projectiles. U.S. Army Ballistic Research Laboratory (BRL). — Fuente primaria de las tablas de arrastre.
- [3] Litz, B. (2011). Applied Ballistics for Long Range Shooting. Applied Ballistics LLC. — Validación experimental de modelos balísticos y BC.
- [4] Carlucci, D. E. & Jacobson, S. S. (2007). Ballistics: Theory and Design of Guns and Ammunition. 2nd ed. CRC Press. — Balística integral: interior, exterior y terminal.
- [5] International Organization for Standardization. (1975). ISO 2533: Standard Atmosphere. — Modelo de atmósfera estándar.
- [6] Mattijssen, E. J. A. T. & Kerkhoff, W. (2016). “Bullet trajectory reconstruction – Methods, accuracy and precision.” Forensic Science International, 262, 204–213. — Métodos forenses de reconstrucción de trayectorias.
- [7] Haag, L. C. (2006). Shooting Incident Reconstruction. Academic Press. — Manual de referencia para reconstrucción de incidentes de disparo.
- [8] NIST/OSAC (2025). Standard Terminology for Shooting Reconstruction y Guidelines for Projectile Path Reconstruction. — Estándares forenses más recientes.