From d4c44c55d26f017444c3c0357e65f147d30b1512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Sat, 12 Sep 2026 09:55:45 +0200 Subject: [PATCH] =?UTF-8?q?Jupiter-Monats=C3=BCbersicht=20ausrichten=20und?= =?UTF-8?q?=20GRS=20hervorheben?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/jupitersystem.php | 57 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/public/jupitersystem.php b/public/jupitersystem.php index 976a643..bbd6a31 100644 --- a/public/jupitersystem.php +++ b/public/jupitersystem.php @@ -206,7 +206,16 @@ const KM_TO_DISPLAY = JUPITER_DISPLAY_RADIUS / JUPITER_RADIUS_KM; // Jupiter System III (Referenz): 9h 55m 29.7s — System II (GRS): 9h 55m 40.632s const GRS_SYSTEM_II_PERIOD_DAYS = 35740.632 / 86400; -// GRS-Kalibrierung: Referenzzeitpunkt und Rotationswinkel bei Transit +// GRS-Kalibrierung: Referenzzeitpunkt und Rotationswinkel bei Transit. +// +// WICHTIG: Die Transitzeiten von Sky & Telescope sind beobachtete/geozentrische +// UT-Zeitpunkte. Die Lichtlaufzeit Jupiter→Erde ist für den jeweiligen +// Referenzzeitpunkt daher bereits enthalten. Hier NICHT nochmals pauschal die +// Jupiter-Lichtlaufzeit abziehen, sonst würden wir doppelt korrigieren. +// Bei der Monatsprognose wird aktuell die GRS-Rotation ab diesem beobachteten +// Referenzzeitpunkt mit der System-II-Periode fortgeschrieben. Eine mögliche +// spätere Verbesserung wäre, zusätzlich die Änderung der Lichtlaufzeit zwischen +// Referenzzeitpunkt und Prognosezeitpunkt zu berücksichtigen. let grsRefDate = new Date(0); let grsRefAngle = 0; @@ -1442,13 +1451,43 @@ function generateEphemerisCanvas() { return result; } + // Scheinbare Ost-West-Projektion für die Monatsgrafik. + // Die Jupiter-Mondvektoren liegen in EQJ. Für die Ansicht von der Erde + // projizieren wir sie auf die lokale Himmels-Ost-West-Achse. Für diese + // Darstellung steht Westen links und Osten rechts. + function getApparentWestBasis(date) { + const emissionDate = getJupiterEmissionDate(date); + const geo = AstronomyEngine.GeoVector( + AstronomyEngine.Body.Jupiter, + emissionDate, + true + ); + const equatorialLength = Math.hypot(geo.x, geo.y); + if (equatorialLength === 0) { + return { x: 1, y: 0, z: 0 }; + } + // Richtung zunehmender Rektaszension = Himmels-Osten. + const east = { + x: -geo.y / equatorialLength, + y: geo.x / equatorialLength, + z: 0 + }; + // Westen wird links gezeichnet, daher ist rechts die positive Ostseite. + return east; + } + + function getApparentWestOffset(state, westBasis) { + return state.x * westBasis.x + state.y * westBasis.y + state.z * westBasis.z; + } + const points = []; for (let d = 1; d <= daysInMonth; d++) { for (let s = 0; s < STEPS_PER_DAY; s++) { const date = new Date(Date.UTC(year, month, d, s * STEP_HOURS, 0, 0)); const states = getJupiterMoonStates(date); + const westBasis = getApparentWestBasis(date); const moonX = {}; - MOON_KEYS.forEach(key => { moonX[key] = states[key].x; }); + MOON_KEYS.forEach(key => { moonX[key] = getApparentWestOffset(states[key], westBasis); }); const nearDisk = getMoonsNearDisk(date, states); points.push({ d, t: (d - 1) + s / STEPS_PER_DAY, date, moonX, nearDisk }); } @@ -1484,6 +1523,8 @@ function generateEphemerisCanvas() { }); // GRS-Transitzeiten: alle Transits im Monat berechnen function getGrsTransitsForDay(d) { + // grsRefDate ist bereits eine scheinbare, von der Erde aus beobachtete + // Transitzeit. Deshalb keine erneute pauschale Lichtlaufzeit-Korrektur. if (!grsRefDate || grsRefDate.getTime() === 0) return []; const dayStart = new Date(Date.UTC(year, month, d, 0, 0, 0)).getTime(); const dayEnd = dayStart + 86400000; @@ -1505,8 +1546,9 @@ function generateEphemerisCanvas() { for (let d = 1; d <= daysInMonth; d++) { const date = new Date(Date.UTC(year, month, d, 12, 0, 0)); const states = getJupiterMoonStates(date); + const westBasis = getApparentWestBasis(date); const moonX = {}; - MOON_KEYS.forEach(key => { moonX[key] = states[key].x; }); + MOON_KEYS.forEach(key => { moonX[key] = getApparentWestOffset(states[key], westBasis); }); const grsTransits = getGrsTransitsForDay(d); rows.push({ d, moonX, grsTransits }); } @@ -1545,7 +1587,7 @@ function generateEphemerisCanvas() { moonRim: 'rgba(0,0,0,0.2)', legBg: 'rgba(240,240,245,0.9)', legBorder: 'rgba(100,80,20,0.3)', legText: 'rgba(40,40,80,0.8)', - grsCol: '#c05000', + grsCol: '#d02020', footText: 'rgba(60,60,100,0.5)', titleLine: 'rgba(120,90,20,0.4)', }; @@ -1572,6 +1614,13 @@ function generateEphemerisCanvas() { c.textAlign = 'center'; c.fillText(`Jupitermonde — ${monthName}`, W / 2, 56); + c.fillStyle = COL.footText; + c.font = '18px monospace'; + c.textAlign = 'left'; + c.fillText('West', MARGIN_LEFT, MARGIN_TOP - 12); + c.textAlign = 'right'; + c.fillText('Ost', MARGIN_LEFT + chartW, MARGIN_TOP - 12); + // Goldene Trennlinie unter Titel const tl = c.createLinearGradient(MARGIN_LEFT, 0, MARGIN_LEFT + chartW, 0); tl.addColorStop(0, 'transparent');