From f51f6c01361d3fd00bca2efcc19c5aca7534e675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Sun, 12 Apr 2026 10:14:17 +0200 Subject: [PATCH] Sonnensystem verbessert --- public/solarsystem.php | 51 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/public/solarsystem.php b/public/solarsystem.php index 4dae715..3b7bfdf 100644 --- a/public/solarsystem.php +++ b/public/solarsystem.php @@ -2194,6 +2194,35 @@ function getMinorPlanetHelioPosition(minorPlanet, date) { }; } +function getMinorPlanetHelioPositionFromEccentricAnomaly(minorPlanet, eccentricAnomaly) { + if (!minorPlanet) { + return null; + } + + const eccentricity = Math.max(0, Math.min(0.999999, minorPlanet.eccentricity)); + const semimajorAxisAu = minorPlanet.semimajorAxisAu; + const inclination = minorPlanet.inclinationDeg * Math.PI / 180; + const ascendingNode = minorPlanet.ascendingNodeDeg * Math.PI / 180; + const argPerihelion = minorPlanet.argPerihelionDeg * Math.PI / 180; + const orbitalX = semimajorAxisAu * (Math.cos(eccentricAnomaly) - eccentricity); + const orbitalY = semimajorAxisAu * Math.sqrt(1 - eccentricity ** 2) * Math.sin(eccentricAnomaly); + const cosArg = Math.cos(argPerihelion); + const sinArg = Math.sin(argPerihelion); + const cosNode = Math.cos(ascendingNode); + const sinNode = Math.sin(ascendingNode); + const cosInc = Math.cos(inclination); + const sinInc = Math.sin(inclination); + const perifocalX = (cosArg * orbitalX) - (sinArg * orbitalY); + const perifocalY = (sinArg * orbitalX) + (cosArg * orbitalY); + + return { + x: (cosNode * perifocalX) - (sinNode * perifocalY * cosInc), + y: (sinNode * perifocalX) + (cosNode * perifocalY * cosInc), + z: perifocalY * sinInc, + r: semimajorAxisAu * (1 - eccentricity * Math.cos(eccentricAnomaly)), + }; +} + function ensureCometObjects() { if (!cometObjects) { cometObjects = new Map(); @@ -2383,12 +2412,22 @@ function rebuildMinorPlanetOrbit(id) { } const periodDays = minorPlanet.meanMotionDegPerDay > 0 ? 360 / minorPlanet.meanMotionDegPerDay : 365; - const steps = Math.max(180, Math.min(520, Math.round(periodDays / 8))); + const steps = Math.max( + 360, + Math.min( + 1440, + Math.round( + 360 + + (minorPlanet.eccentricity * 720) + + (Math.log10(Math.max(periodDays, 365) / 365) * 220) + ) + ) + ); const positions = []; for (let step = 0; step <= steps; step += 1) { - const orbitDate = new Date(Date.parse(`${minorPlanet.epochDateIso}T00:00:00Z`) + ((periodDays * step) / steps) * 86400000); - const heliocentric = getMinorPlanetHelioPosition(minorPlanet, orbitDate); + const eccentricAnomaly = (step / steps) * Math.PI * 2; + const heliocentric = getMinorPlanetHelioPositionFromEccentricAnomaly(minorPlanet, eccentricAnomaly); if (!heliocentric) { continue; } @@ -3087,7 +3126,7 @@ function attachPointerControls() { canvas.addEventListener('wheel', (event) => { event.preventDefault(); - camRadiusTarget = Math.max(12, Math.min(900, camRadiusTarget * (1 + event.deltaY * 0.001))); + camRadiusTarget = Math.max(12, Math.min(2600, camRadiusTarget * (1 + event.deltaY * 0.001))); camRadius = camRadiusTarget; updateCamera(); }, { passive: false }); @@ -3365,7 +3404,7 @@ async function initSolarSystem() { scene = new THREE.Scene(); - camera = new THREE.PerspectiveCamera(45, 1, 0.1, 2000); + camera = new THREE.PerspectiveCamera(45, 1, 0.1, 6000); planetMeshes = new Map(); orbitLines = new Map(); labelElements = new Map(); @@ -3413,7 +3452,7 @@ async function initSolarSystem() { for (let i = 0; i < starCount; i++) { const theta = Math.random() * Math.PI * 2; const phi = Math.acos(2 * Math.random() - 1); - const r = 860 + Math.random() * 80; + const r = 2600 + Math.random() * 200; positions[i * 3] = r * Math.sin(phi) * Math.cos(theta); positions[i * 3 + 1] = r * Math.sin(phi) * Math.sin(theta); positions[i * 3 + 2] = r * Math.cos(phi);