Sonnensystem verbessert

This commit is contained in:
2026-04-12 10:14:17 +02:00
parent 8aa599b3bf
commit f51f6c0136
+45 -6
View File
@@ -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);