diff --git a/src/app/features/galaxy-system/galaxy-system-scene.component.spec.ts b/src/app/features/galaxy-system/galaxy-system-scene.component.spec.ts index 499b92b..ce5033b 100644 --- a/src/app/features/galaxy-system/galaxy-system-scene.component.spec.ts +++ b/src/app/features/galaxy-system/galaxy-system-scene.component.spec.ts @@ -837,7 +837,7 @@ describe('GalaxySystemSceneComponent camera-flight transitions', () => { navigationStore.selectStar(SUN.id); await flushAsync(); await advanceFrames(engine, 2.5); - expect(note()).toMatch(/^Orbits propagated from JPL mean elements, the planets’ fit for 3000 BC to AD 3000, and the SBDB’s osculating ones for Ceres, Eris, Haumea and Makemake, to now, \d{4}-\d\d-\d\d \d\d:\d\d UTC\.$/); + expect(note()).toMatch(/^Orbits propagated from JPL mean elements, the planets’ fit for 3000 BC to AD 3000 and the moons’ checked from 1950 to 2100, and the SBDB’s osculating ones for Ceres, Eris, Haumea and Makemake, checked over the same span, to now, \d{4}-\d\d-\d\d \d\d:\d\d UTC\.$/); navigationStore.selectStar(ALPHA_CENTAURI.id); await flushAsync(); diff --git a/src/app/features/galaxy-system/galaxy-system-scene.component.ts b/src/app/features/galaxy-system/galaxy-system-scene.component.ts index 636a7d7..d7f7a9f 100644 --- a/src/app/features/galaxy-system/galaxy-system-scene.component.ts +++ b/src/app/features/galaxy-system/galaxy-system-scene.component.ts @@ -1768,8 +1768,9 @@ export class GalaxySystemSceneComponent implements AfterViewInit, OnDestroy { : []), ]); // Where the orbits come from, and for the Sun how far from the present they hold: each - // body's card names its own source and epoch. - const source = this.bodies.some((body) => body.systemStarId === star.id) ? 'JPL mean elements, the planets’ fit for 3000 BC to AD 3000, and the SBDB’s osculating ones for Ceres, Eris, Haumea and Makemake,' : 'published elements'; + // body's card names its own source, and for a moon or dwarf planet how far it strays from + // Horizons over the span it was checked. + const source = this.bodies.some((body) => body.systemStarId === star.id) ? 'JPL mean elements, the planets’ fit for 3000 BC to AD 3000 and the moons’ checked from 1950 to 2100, and the SBDB’s osculating ones for Ceres, Eris, Haumea and Makemake, checked over the same span,' : 'published elements'; // Named to the minute, in UTC like the date field: a jump to 18:00 on a given day is a // question about that hour, and the note is where the answer says which sky it is. const drawnFor = `${this.time.date().toISOString().slice(0, 16).replace('T', ' ')} UTC`; diff --git a/src/app/features/hud/hud-dock.component.spec.ts b/src/app/features/hud/hud-dock.component.spec.ts index cd29fda..8e1524c 100644 --- a/src/app/features/hud/hud-dock.component.spec.ts +++ b/src/app/features/hud/hud-dock.component.spec.ts @@ -416,6 +416,7 @@ describe('HudDockComponent', () => { expect(field.min).toBe('0001-01-01T00:00'); expect(field.max).toBe('3000-01-01T00:00'); expect(host().querySelector(`#${field.getAttribute('aria-describedby')}`)?.textContent).toContain('AD 1 to AD 3000'); + expect(host().querySelector(`#${field.getAttribute('aria-describedby')}`)?.textContent).toContain('how far its orbit strays from 1950 to 2100'); }); it('jumps the clock to the date submitted, read as UTC', () => { diff --git a/src/app/features/hud/hud-dock.component.ts b/src/app/features/hud/hud-dock.component.ts index e8858f3..3caf1e8 100644 --- a/src/app/features/hud/hud-dock.component.ts +++ b/src/app/features/hud/hud-dock.component.ts @@ -377,7 +377,7 @@ function isWideViewport(): boolean { Go
- AD 1 to AD 3000, where the planets’ elements hold. + AD 1 to AD 3000, where the planets’ elements hold. Each moon’s and dwarf planet’s card says how far its orbit strays from 1950 to 2100.
diff --git a/src/app/shared/state/time.store.ts b/src/app/shared/state/time.store.ts index 1101974..227c0f0 100644 --- a/src/app/shared/state/time.store.ts +++ b/src/app/shared/state/time.store.ts @@ -31,9 +31,11 @@ const JULIAN_DATE_AT_EPOCH = 2440587.5; * The end is where Standish's Table 2, the mean elements that carry the planets, stops being * fitted: it covers 3000 BC to AD 3000, and every planet was within 0.29 degrees of Horizons at * each date measured out to 3000. The start is not the fit's but the date input's, which cannot - * go before 0001-01-01. Both are proleptic Gregorian, as a `Date` is, so before 1582 they run - * ahead of the Julian-calendar dates history gives: two days at AD 1, ten by 1582. The moons and - * dwarf planets hold for far less of it: Phobos is 11 degrees out by 2100, Ceres 11.6 by 2200. + * go before 0001-01-01. Both are proleptic Gregorian, as a `Date` is, so before 1582 they part from + * the Julian-calendar dates history gives: two days behind them at AD 1, level from AD 200 to 300, + * ten days ahead by 1582. The moons and dwarf planets hold for far less of it: each card says how + * far its orbit strays from Horizons from 1950 to 2100 (Ceres 7.1 degrees there, 11.6 by 2200 and + * 39 by 1600). */ export const CLOCK_WINDOW = { min: '0001-01-01T00:00', max: '3000-01-01T00:00' } as const; const WINDOW_MS = { diff --git a/src/assets/data/bodies.json b/src/assets/data/bodies.json index 78c0544..bfc18e2 100644 --- a/src/assets/data/bodies.json +++ b/src/assets/data/bodies.json @@ -499,7 +499,7 @@ "longitudeOfAscendingNodeDegPerDay": 0, "argumentOfPeriapsisDegPerDay": 0 }, - "orbitSource": "JPL SBDB osculating elements, epoch 2026 Jun 9", + "orbitSource": "JPL SBDB osculating elements, epoch 2026 Jun 9, within 7.2 degrees of Horizons from 1950 to 2100", "rotationPeriodHours": 9.07417, "rotationalElements": { "poleRaDeg": [ @@ -539,7 +539,7 @@ "longitudeOfAscendingNodeDegPerDay": 0, "argumentOfPeriapsisDegPerDay": 0 }, - "orbitSource": "JPL SBDB osculating elements, epoch 2026 Jun 9", + "orbitSource": "JPL SBDB osculating elements, epoch 2026 Jun 9, within 0.1 degrees of Horizons from 1950 to 2100", "rotationPeriodHours": 378.504 }, { @@ -562,7 +562,7 @@ "longitudeOfAscendingNodeDegPerDay": 0, "argumentOfPeriapsisDegPerDay": 0 }, - "orbitSource": "JPL SBDB osculating elements, epoch 2026 Jun 9", + "orbitSource": "JPL SBDB osculating elements, epoch 2026 Jun 9, within 0.4 degrees of Horizons from 1950 to 2100", "rotationPeriodHours": 3.9154 }, { @@ -585,7 +585,7 @@ "longitudeOfAscendingNodeDegPerDay": 0, "argumentOfPeriapsisDegPerDay": 0 }, - "orbitSource": "JPL SBDB osculating elements, epoch 2026 Jun 9", + "orbitSource": "JPL SBDB osculating elements, epoch 2026 Jun 9, within 0.3 degrees of Horizons from 1950 to 2100", "rotationPeriodHours": 22.8266 }, { @@ -608,7 +608,7 @@ "longitudeOfAscendingNodeDegPerDay": -0.052990660396105185, "argumentOfPeriapsisDegPerDay": 0.164353223839846 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1, within 2.7 degrees of Horizons from 1950 to 2100", "parentBodyId": "earth", "rotationPeriodHours": 655.7198886065481, "obliquityDeg": 6.67, @@ -707,7 +707,7 @@ "raDeg": 317.671, "decDeg": 52.893 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 1950 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 1950 Jan 1, within 1.3 degrees of Horizons from 1950 to 2100", "parentBodyId": "mars", "rotationPeriodHours": 7.653844882637157, "rotationalElements": { @@ -794,7 +794,7 @@ "raDeg": 316.657, "decDeg": 53.529 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 1950 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 1950 Jan 1, within 0.6 degrees of Horizons from 1950 to 2100", "parentBodyId": "mars", "rotationPeriodHours": 30.29857998656265, "rotationalElements": { @@ -891,7 +891,7 @@ "raDeg": 268.057, "decDeg": 64.495 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 1997 Jan 16", + "orbitSource": "JPL SSD satellite mean elements, epoch 1997 Jan 16, within 0.1 degrees of Horizons from 1950 to 2100", "parentBodyId": "jupiter", "rotationPeriodHours": 42.45930625514436, "rotationalElements": { @@ -956,7 +956,7 @@ "raDeg": 268.084, "decDeg": 64.506 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 1997 Jan 16", + "orbitSource": "JPL SSD satellite mean elements, epoch 1997 Jan 16, within 0.3 degrees of Horizons from 1950 to 2100", "parentBodyId": "jupiter", "rotationPeriodHours": 85.22834531173994, "rotationalElements": { @@ -1030,7 +1030,7 @@ "raDeg": 268.168, "decDeg": 64.543 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 1997 Jan 16", + "orbitSource": "JPL SSD satellite mean elements, epoch 1997 Jan 16, within 0.3 degrees of Horizons from 1950 to 2100", "parentBodyId": "jupiter", "rotationPeriodHours": 171.70927794038664, "rotationalElements": { @@ -1104,7 +1104,7 @@ "raDeg": 268.639, "decDeg": 64.749 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 1997 Jan 16", + "orbitSource": "JPL SSD satellite mean elements, epoch 1997 Jan 16, within 0.2 degrees of Horizons from 1950 to 2100", "parentBodyId": "jupiter", "rotationPeriodHours": 400.5364072574082, "rotationalElements": { @@ -1184,7 +1184,7 @@ "raDeg": 40.589, "decDeg": 83.536 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1, within 7.5 degrees of Horizons from 1950 to 2100", "parentBodyId": "saturn", "rotationPeriodHours": 22.618127008672275, "rotationalElements": { @@ -1249,7 +1249,7 @@ "raDeg": 40.586, "decDeg": 83.536 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1, within 1.0 degrees of Horizons from 1950 to 2100", "parentBodyId": "saturn", "rotationPeriodHours": 32.88523423439451, "rotationalElements": { @@ -1300,7 +1300,7 @@ "raDeg": 40.578, "decDeg": 83.537 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1, within 0.3 degrees of Horizons from 1950 to 2100", "parentBodyId": "saturn", "rotationPeriodHours": 45.30726088829954, "rotationalElements": { @@ -1365,7 +1365,7 @@ "raDeg": 40.544, "decDeg": 83.54 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1, within 0.1 degrees of Horizons from 1950 to 2100", "parentBodyId": "saturn", "rotationPeriodHours": 65.68597371070803, "rotationalElements": { @@ -1410,7 +1410,7 @@ "raDeg": 40.328, "decDeg": 83.559 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1, within 0.2 degrees of Horizons from 1950 to 2100", "parentBodyId": "saturn", "rotationPeriodHours": 108.42006554798584, "rotationalElements": { @@ -1466,7 +1466,7 @@ "raDeg": 36.214, "decDeg": 83.949 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1, within 0.1 degrees of Horizons from 1950 to 2100", "parentBodyId": "saturn", "rotationPeriodHours": 382.69076217631203, "rotationalElements": { @@ -1511,7 +1511,7 @@ "raDeg": 36.372, "decDeg": 83.862 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1, within 22.3 degrees of Horizons from 1950 to 2100", "measuredEccentricity": 0.105, "parentBodyId": "saturn" }, @@ -1539,7 +1539,7 @@ "raDeg": 284.715, "decDeg": 78.749 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1, within 10.4 degrees of Horizons from 1950 to 2100", "parentBodyId": "saturn", "rotationPeriodHours": 1903.9469348834284, "rotationalElements": { @@ -1584,7 +1584,7 @@ "raDeg": 275.954, "decDeg": 67.455 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1, within 2.6 degrees of Horizons from 1950 to 2100", "parentBodyId": "saturn", "rotationPeriodHours": 9.273966666666666, "rotationalElements": { @@ -1629,7 +1629,7 @@ "raDeg": 77.311, "decDeg": 15.175 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 1980 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 1980 Jan 1, within 1.8 degrees of Horizons from 1950 to 2100", "parentBodyId": "uranus", "rotationPeriodHours": 33.9235057988244, "rotationalElements": { @@ -1712,7 +1712,7 @@ "raDeg": 77.311, "decDeg": 15.175 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 1980 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 1980 Jan 1, within 0.7 degrees of Horizons from 1950 to 2100", "parentBodyId": "uranus", "rotationPeriodHours": 60.48909723963263, "rotationalElements": { @@ -1777,7 +1777,7 @@ "raDeg": 77.311, "decDeg": 15.175 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 1980 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 1980 Jan 1, within 0.8 degrees of Horizons from 1950 to 2100", "parentBodyId": "uranus", "rotationPeriodHours": 99.46023494563465, "rotationalElements": { @@ -1842,7 +1842,7 @@ "raDeg": 77.311, "decDeg": 15.175 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 1980 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 1980 Jan 1, within 0.7 degrees of Horizons from 1950 to 2100", "parentBodyId": "uranus", "rotationPeriodHours": 208.94080635857947, "rotationalElements": { @@ -1898,7 +1898,7 @@ "raDeg": 77.311, "decDeg": 15.175 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 1980 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 1980 Jan 1, within 0.5 degrees of Horizons from 1950 to 2100", "parentBodyId": "uranus", "rotationPeriodHours": 323.1176207078424, "rotationalElements": { @@ -1954,7 +1954,7 @@ "raDeg": 299.456, "decDeg": 43.414 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1, within 0.2 degrees of Horizons from 1950 to 2100", "parentBodyId": "neptune", "rotationPeriodHours": 141.0444976486201, "rotationalElements": { @@ -2082,7 +2082,7 @@ "raDeg": 269.302, "decDeg": 69.117 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1, within 11.2 degrees of Horizons from 1950 to 2100", "parentBodyId": "neptune" }, { @@ -2109,7 +2109,7 @@ "raDeg": 299.406, "decDeg": 42.432 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1, within 1.0 degrees of Horizons from 1950 to 2100", "parentBodyId": "neptune", "rotationPeriodHours": 26.93555462331033, "rotationalElements": { @@ -2174,7 +2174,7 @@ "raDeg": 132.993, "decDeg": -6.163 }, - "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1", + "orbitSource": "JPL SSD satellite mean elements, epoch 2000 Jan 1, within 0.4 degrees of Horizons from 1950 to 2100", "parentBodyId": "pluto", "massRatio": 0.1220485755631374, "rotationPeriodHours": 153.29335605836368, diff --git a/tools/etl/build.ts b/tools/etl/build.ts index cefeb76..d4dfd08 100644 --- a/tools/etl/build.ts +++ b/tools/etl/build.ts @@ -9,7 +9,8 @@ import { ExoplanetRecord } from '../../src/app/shared/models/exoplanet.model'; import { StarRecord, SUN_STAR_ID } from '../../src/app/shared/models/star.model'; import { fetchDeepSky } from './fetchDeepSky'; import { fetchExoplanets } from './fetchExoplanets'; -import { fetchSolarSystem, FREELY_SPINNING_MOONS } from './fetchSolarSystem'; +import { fetchSolarSystem, FREELY_SPINNING_MOONS, offsetFromTrackDeg } from './fetchSolarSystem'; +import { TrackPoint } from './lib/horizons'; import { BYTES_PER_STAR_META, BYTES_PER_STAR_POSITION, decodeStarCatalog, encodeStarCatalog } from '../../src/app/shared/models/star-catalog'; import { fetchStars } from './fetchStars'; import { describeSources } from './sources/registry'; @@ -152,28 +153,38 @@ const KM_PER_AU = 149597870.7; const DEG_TO_RAD = Math.PI / 180; /** - * The moons whose table row cannot come within that on this one date, each for a reason no mean - * ellipse carries, with a ceiling just above its offset here. What each reaches elsewhere is - * larger, and neither this check nor twelve New Year's Days sampled from 1980 to 2100 see it: - * - * - Hyperion, 9.4 degrees here and 22.2 at worst, sampled every other day from 1980 to 2100: held - * in a 4:3 resonance by Titan; the row's eccentricity, 0.0232, is less than a quarter of the - * 0.105 JPL's current table gives. - * - Iapetus, 9.6 here and 10.1 at worst: the row sits 9.4 degrees behind Horizons at its own epoch, - * 2000 Jan 1.5, and keeps that offset; its plane agrees with Horizons' to 0.07 degrees and its - * period to 0.001 per cent, so the fault is in the row's longitude, which this has no second - * source to correct. - * - Nereid, 2.6 here and 11.2 at worst, sampled daily: an eccentricity of 0.75, the largest here, - * which a mean ellipse follows least well near periapsis, where the true anomaly runs ten times - * faster than the mean. Its 360-day year put all twelve New Year's Days, under 2.6, far from - * periapsis; sampled daily it is past 2.6 on 92 days in 2010-2020 and on 295 in 2040-2050, each - * near a periapsis, and under 0.4 on most days. - * - * Mimas's swing of 44 degrees either way, the libration of its resonance with Tethys, which also - * needed a ceiling here once, is now in its orbit; see `orbitFromW` in `fetchSolarSystem.ts`. + * The moons whose table row cannot come within that on this one date, each with a ceiling just + * above its offset here; see {@link TRACK_OFFSET_CEILINGS_DEG} for what they reach from 1950 to 2100. */ const MOON_OFFSET_CEILINGS_DEG: Record