# Eclipses y calendario de la versión 03

## Dónde está cada parte

- `js/eclipses.js`: intersección de los discos solares, sombras en materiales y comprobaciones numéricas.
- `js/calendario.js`: búsqueda de fases y eclipses, fechas, condiciones locales y exploración temporal.
- `css/calendario.css`: aspecto del panel, independiente de las cuentas astronómicas.
- `tests/eclipses.cjs`: pruebas que se ejecutan con `node tests/eclipses.cjs`.

## Qué calcula la sombra

En cada punto de la Tierra o la Luna, calculamos el radio angular del Sol, el radio angular del cuerpo que lo oculta y la separación entre sus centros. La intersección de los dos discos determina qué fracción de la luz solar directa se bloquea. De este modo aparecen penumbra, umbra y eclipses anulares sin dibujar una mancha prefabricada.

El cálculo utiliza kilómetros, radios físicos y posiciones de `SolarPhysics`. Se mantiene aunque se cambie la escala del dibujo. En modo didáctico, por tanto, la sombra representa la configuración física aunque los tamaños y distancias visuales estén exagerados. Para estudiar la alineación conviene la escala física.

Las posiciones se transforman a coordenadas locales del cuerpo antes de enviarlas a la GPU. Así se conserva precisión cerca de la superficie; no se restan dos posiciones heliocéntricas grandes dentro del shader. El Sol se trata como disco uniforme: no se modelan oscurecimiento del limbo, montañas del borde lunar ni el relieve terrestre.

La Tierra dibujada es una esfera de radio medio de 6371 km. Los datos locales del calendario usan el elipsoide terrestre de Astronomy Engine. Esta diferencia y las correcciones aparentes del motor pueden producir pequeñas diferencias de borde entre la sombra renderizada y los contactos tabulados. El visor es educativo; las horas de contacto proceden del motor y no se deducen de píxeles de la imagen.

La iluminación rojiza débil durante un eclipse lunar es una aproximación visual a la luz que refracta la atmósfera terrestre. Su color e intensidad reales dependen de condiciones atmosféricas que no recibimos. Los mapas de ciudades siguen siendo históricos, no son luces medidas durante el eclipse.

`SolarEclipses.atObserver(datos, ubicacion)` devuelve una ocultación geométrica topocéntrica. No comprueba el horizonte: se debe combinar con la altura solar antes de describirla como visible. `obscuration(datos, 'moon', puntoLocal)` devuelve la fracción del disco del Sol tapada desde ese punto, no el porcentaje de superficie lunar que está en la umbra.

## Fechas y visibilidad

El calendario calcula próximas lunas nuevas/llenas y eclipses solares/lunares desde la fecha indicada. No consulta una API en Internet. La lista se actualiza al pulsar «Buscar desde la fecha del visor» o al cambiar la ubicación. La animación solo actualiza la lectura del reloj; no vuelve a buscar eventos en cada fotograma.

Los eventos solares principales muestran el máximo global y distinguen su clasificación de la local. Por ejemplo, el eclipse del 12 de agosto de 2026 es total globalmente pero parcial en Granada. El botón de máximo local permite explorar ese instante distinto. El Sol puede ponerse antes del final de la fase parcial; las condiciones locales lo advierten.

Para los eclipses lunares indicamos si la Luna está sobre el horizonte en el máximo. Esto no implica que todas las fases tengan la misma visibilidad. El horizonte es ideal: no hay montañas, edificios ni meteorología.

El control deslizante lunar cubre el intervalo entre contactos penumbrales del modelo. El solar global ofrece una ventana de seis horas centrada en el máximo, etiquetada como ventana de exploración, no como contactos globales. Al elegir un máximo solar local, el intervalo corresponde a sus contactos parciales. Las horas se presentan en la zona elegida; internamente las fechas son UTC. Se limita la navegación a los años 1900–2100.

## Fuentes y licencias

- [Astronomy Engine: referencia oficial de JavaScript](https://github.com/cosinekitty/astronomy/tree/master/source/js): funciones `SearchMoonPhase`, `SearchGlobalSolarEclipse`, `SearchLocalSolarEclipse`, `SearchLunarEclipse` y sus estructuras de resultados. El proyecto ya incluye el motor bajo su licencia MIT.
- [NASA: eclipse solar total del 8 de abril de 2024](https://eclipse.gsfc.nasa.gov/SEgoogle/SEgoogle2001/SE2024Apr08Tgoogle.html): referencia independiente del ejemplo solar.
- [NASA: eclipse lunar total del 14 de marzo de 2025](https://eclipse.gsfc.nasa.gov/LEplot/LEplot2001/LE2025Mar14T.pdf): referencia independiente del ejemplo lunar.

No se incorporan imágenes ni recursos nuevos de terceros en estos dos módulos. La fórmula de intersección de discos y el código de interfaz son código propio del proyecto. Los mapas y sus condiciones se documentan por separado.
