# Qué observar esta noche · versión 05

## Archivos y conexión

- `js/esta-noche.js`: cálculo geométrico, caché e interfaz del panel.
- `css/esta-noche.css`: colores y presentación responsive de este panel.
- `tests/noche.cjs`: comprobaciones numéricas y del trabajo limitado.
- No descarga datos, no necesita cuenta y funciona con los scripts locales de Astronomy Engine 2.1.19, `SolarPhysics`, `SolarObserver` y `SolarLunarPlaces`.

La aplicación crea `new SolarTonight(container, { onSelectTime, onSelectSite })` y llama `update(date, location)` con el instante del visor. Los callbacks reciben un `Date`; el de región recibe además el objeto de `SolarLunarPlaces.regions`. `SolarTonight.calculate(date, location)` permite consultar el modelo sin dibujar una interfaz.

## Qué significa «esta noche»

El intervalo va desde las 12:00 locales del **día civil mostrado en el visor** hasta las 12:00 locales del día siguiente. Por tanto, si el visor marca las 02:00, este panel prepara la noche que comienza esa tarde, no la madrugada en curso. Las horas llevan fecha y desplazamiento UTC; así pueden distinguirse incluso las horas repetidas al terminar el horario de verano. Las noches de cambio horario pueden abarcar 23 o 25 horas.

Los mediodías se convierten a UTC utilizando el huso IANA de la ubicación. La fecha clave de la caché es local, no UTC. El cálculo crea un observador propio, sin cambiar la ubicación global del cielo. Para cambios históricos de huso con un día civil omitido, se muestra un error en vez de inventar una noche.

## Criterios de la recomendación

La app usa un criterio editorial sencillo, **no una clasificación oficial de NASA**: centro de la Luna a más de 15° de altura geométrica y centro del Sol por debajo de −6°. La hora sugerida maximiza la altura lunar más una bonificación moderada de oscuridad, que deja de crecer cuando el Sol baja de −18°.

Astronomy Engine calcula coordenadas topocéntricas con paralaje y aberración. Las alturas del planificador son geométricas, sin refracción, mientras que otras lecturas del cielo pueden incluir refracción aproximada. Se muestrea cada 10 minutos; los cruces detectados se refinan por bisección a aproximadamente un segundo y la hora sugerida se refina cada minuto. La interfaz muestra minutos porque montañas, edificios, nubes y turbulencia no están incluidos. Un intervalo excepcionalmente corto, inferior al paso de muestreo, podría no detectarse.

No se interpreta la ausencia de franja como imposibilidad absoluta de observar: la Luna puede verse de día o a menor altura. Se distinguen el día polar, el Sol que no baja lo suficiente, la Luna bajo el horizonte y la Luna demasiado baja durante los tramos oscuros muestreados. El intervalo siempre queda limitado a una noche, también cerca de los polos.

## Regiones y terminador

Para Copérnico, Tycho y el entorno de Apollo 11, se transforma la normal de sus coordenadas selenográficas mediante la orientación lunar real de `SolarPhysics`. Su producto escalar con la dirección geométrica al Sol da la altura solar sobre el horizonte lunar medio. Se marca «luz rasante» entre 2° y 20°, siempre que el lugar esté del lado orientado hacia la Tierra y separado del borde extremo del disco.

Este cálculo describe el horizonte de la esfera lunar de referencia; no resuelve sombras proyectadas por montañas ni simula la capacidad óptica de un telescopio. Si ninguna región cumple el criterio, se dice expresamente. Las tres pueden explorarse igualmente con su iluminación correspondiente a la hora de referencia. El relieve conserva los datos y límites documentados en `references/luna-v04.md`.

NASA explica que el límite entre día y noche permite apreciar mejor cráteres y montañas por sus sombras alargadas. Esta idea orienta la recomendación; los umbrales numéricos son de esta aplicación. Fuente primaria consultada el 20 de septiembre de 2026: [NASA · Observe the Moon at Home](https://science.nasa.gov/moon/observe-the-moon-night/observe-at-home/), apartado 2. No se incorporan nuevas imágenes ni recursos con licencias adicionales.

Modelo astronómico: [Astronomy Engine · documentación JavaScript](https://github.com/cosinekitty/astronomy/tree/master/source/js), funciones Equator, Horizon, Observer y MoonPhase. Código de Astronomy Engine incluido con su licencia MIT en el proyecto.

## Rendimiento y verificación

La actualización habitual compara una clave de día local y ubicación. La caché guarda un máximo de seis noches; regresar a ellas es inmediato. Los cambios rápidos de día se agrupan con una espera de 180 ms antes del cálculo, de modo que arrastrar el tiempo no dispara un estudio completo en cada fotograma. No se cargan texturas ni datos de relieve desde este panel.

`tests/noche.cjs` verifica franjas mediante evaluaciones independientes del horizonte, cambios de horario de 23/25 h en Madrid, medianoche local, lugares del hemisferio sur, husos de cuarto de hora, día/noche polar, ausencia de Luna, iluminación lunar en luna nueva y llena, luz rasante, callbacks, escape de texto y límites de caché. En estos casos el máximo es de 193 muestras de Sol/Luna por noche. Mil actualizaciones del mismo día producen un solo cálculo; diez cambios rápidos de día dejan un único cálculo pendiente. No se presenta este conteo como medida de FPS o consumo eléctrico.
