Asteroid temperatur eingebaut

This commit is contained in:
2026-04-23 10:30:02 +02:00
parent 9138b542ac
commit 79fc30c212
14 changed files with 378 additions and 0 deletions
+376
View File
@@ -0,0 +1,376 @@
<?php
declare(strict_types=1);
ini_set('display_errors', '1');
error_reporting(E_ALL);
session_start();
$loggedIn = isset($_SESSION['user_id']);
$pageTitle = 'Asteroidtemperatur – AstroTools';
$headerIntroPre = 'Astronomie-Werkzeuge';
$headerIntroTitle = 'Asteroid-Temperaturrechner';
$headerIntroSub = 'Gleichgewichts- und Subsolartemperatur eines Asteroiden berechnen (NEATM).';
?>
<?php require __DIR__ . '/header.php'; ?>
<style>
.at-layout {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1.5rem;
align-items: start;
}
@media (max-width: 700px) {
.at-layout { grid-template-columns: 1fr; }
}
.at-param-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0.75rem 1rem;
}
@media (max-width: 480px) {
.at-param-grid { grid-template-columns: 1fr; }
}
.at-param {
display: flex;
flex-direction: column;
gap: 0.3rem;
}
.at-param label {
font-size: 0.78rem;
color: var(--text-dim);
letter-spacing: 0.04em;
}
.at-param input[type=range] {
width: 100%;
accent-color: var(--gold);
cursor: pointer;
}
.at-param .at-num {
display: flex;
align-items: center;
gap: 0.5rem;
}
.at-param .at-num input[type=number] {
flex: 1;
background: var(--bg);
border: 1px solid var(--border);
border-radius: var(--radius);
color: var(--text);
padding: 0.35rem 0.6rem;
font-size: 0.92rem;
min-width: 0;
}
.at-param .at-num input[type=number]:focus {
outline: none;
border-color: var(--gold-dim);
}
.at-param .at-unit {
font-size: 0.78rem;
color: var(--text-dim);
white-space: nowrap;
}
.at-hint {
font-size: 0.75rem;
color: var(--text-dim);
line-height: 1.45;
min-height: 2.2em;
}
/* Ergebnisse */
.at-results {
display: flex;
flex-direction: column;
gap: 1rem;
}
.at-result-row {
display: flex;
align-items: baseline;
gap: 0.6rem;
flex-wrap: wrap;
}
.at-result-label {
font-size: 0.78rem;
color: var(--text-dim);
min-width: 4.5rem;
}
.at-result-sym {
font-family: 'Georgia', serif;
font-style: italic;
color: var(--gold-pale);
font-size: 1rem;
min-width: 3rem;
}
.at-result-val {
font-size: 1.45rem;
font-weight: 600;
color: var(--gold);
letter-spacing: 0.01em;
}
.at-result-c {
font-size: 0.9rem;
color: var(--text-dim);
}
/* Albedo-Vorschau */
.at-albedo-wrap {
display: flex;
align-items: center;
gap: 0.75rem;
margin-top: 0.5rem;
}
.at-albedo-swatch {
width: 2.2rem;
height: 2.2rem;
border-radius: 50%;
border: 1px solid var(--border);
flex-shrink: 0;
transition: background 0.2s;
}
.at-albedo-label {
font-size: 0.78rem;
color: var(--text-dim);
}
/* Preset-Buttons */
.at-presets {
display: flex;
flex-wrap: wrap;
gap: 0.45rem;
margin-top: 0.25rem;
}
/* Trennlinie */
.at-divider {
border: none;
border-top: 1px solid var(--border);
margin: 0.75rem 0;
}
</style>
<div class="at-layout">
<!-- Linke Spalte: Eingaben -->
<div class="card">
<h2>Parameter</h2>
<div class="at-param-grid">
<div class="at-param">
<label for="at-r">Sonnenabstand <em>r</em></label>
<div class="at-num">
<input type="number" id="at-r" min="0.05" max="50" step="0.01" value="1.00">
<span class="at-unit">AE</span>
</div>
<input type="range" id="at-r-slider" min="0.05" max="10" step="0.01" value="1.00">
<p class="at-hint">Abstand zur Sonne in Astronomischen Einheiten. Einstrahlung skaliert mit 1/r².</p>
</div>
<div class="at-param">
<label for="at-a">Bond-Albedo <em>A</em></label>
<div class="at-num">
<input type="number" id="at-a" min="0" max="0.999" step="0.001" value="0.050">
<span class="at-unit">0–1</span>
</div>
<input type="range" id="at-a-slider" min="0" max="0.999" step="0.001" value="0.050">
<p class="at-hint">Anteil der reflektierten Gesamtenergie. Dunkel ≈ 0,02–0,10.</p>
</div>
<div class="at-param">
<label for="at-eps">Emissivität <em>ε</em></label>
<div class="at-num">
<input type="number" id="at-eps" min="0.01" max="1" step="0.01" value="0.90">
<span class="at-unit">0–1</span>
</div>
<input type="range" id="at-eps-slider" min="0.01" max="1" step="0.01" value="0.90">
<p class="at-hint">Wie gut die Oberfläche Wärme abstrahlt. Typisch 0,90–0,95.</p>
</div>
<div class="at-param">
<label for="at-eta">Beaming-Faktor <em>η</em></label>
<div class="at-num">
<input type="number" id="at-eta" min="0.1" max="3" step="0.01" value="1.00">
<span class="at-unit">&gt; 0</span>
</div>
<input type="range" id="at-eta-slider" min="0.1" max="3" step="0.01" value="1.00">
<p class="at-hint">Rauigkeits-/Anisotropie-Korrektur. Typisch 0,7–1,4; Standard 1,0.</p>
</div>
</div>
<hr class="at-divider">
<div class="at-albedo-wrap">
<div class="at-albedo-swatch" id="at-albedo-swatch"></div>
<span class="at-albedo-label">Albedo-Vorschau (Helligkeit der Oberfläche)</span>
</div>
<hr class="at-divider">
<p class="at-albedo-label" style="margin-bottom:0.4rem;">Bekannte Asteroiden</p>
<div class="at-presets">
<button class="btn btn-sm btn-secondary" data-preset="c">C-Typ</button>
<button class="btn btn-sm btn-secondary" data-preset="s">S-Typ</button>
<button class="btn btn-sm btn-secondary" data-preset="vesta">Vesta</button>
<button class="btn btn-sm btn-secondary" data-preset="eros">Eros</button>
<button class="btn btn-sm btn-secondary" data-preset="bennu">Bennu</button>
<button class="btn btn-sm btn-secondary" data-preset="ryugu">Ryugu</button>
<button class="btn btn-sm btn-secondary" data-preset="neufang">(2183) Neufang</button>
<button class="btn btn-sm btn-danger" id="at-reset">Zurücksetzen</button>
</div>
</div>
<!-- Rechte Spalte: Ergebnisse + Erklärung -->
<div style="display:flex;flex-direction:column;gap:1.25rem;">
<div class="card">
<h2>Temperaturen</h2>
<div class="at-results">
<div>
<div class="at-result-row">
<span class="at-result-label">Gleichgewicht</span>
<span class="at-result-sym">T<sub>eq</sub></span>
<span class="at-result-val" id="at-teq-k">–</span>
<span class="at-result-c" id="at-teq-c"></span>
</div>
<p class="at-hint" style="margin-top:0.25rem;">Isotherme Gleichgewichtstemperatur — globaler Mittelwert über die gesamte Oberfläche.</p>
</div>
<hr class="at-divider">
<div>
<div class="at-result-row">
<span class="at-result-label">Subsolar</span>
<span class="at-result-sym">T<sub>ss</sub></span>
<span class="at-result-val" id="at-tss-k">–</span>
<span class="at-result-c" id="at-tss-c"></span>
</div>
<p class="at-hint" style="margin-top:0.25rem;">Subsolartemperatur — heißester Punkt direkt unter der Sonne auf der Tagseite.</p>
</div>
</div>
</div>
<div class="card">
<h2>Formeln</h2>
<table class="data-table">
<tr><td>T<sub>eq</sub></td><td>⁴√[ (1−A)·S / (4·ε·σ·η) ]</td></tr>
<tr><td>T<sub>ss</sub></td><td>⁴√[ (1−A)·S / (ε·σ·η) ]</td></tr>
<tr><td>S</td><td>S₀ / r² &nbsp;mit S₀ = 1361 W/m²</td></tr>
<tr><td>σ</td><td>5,670 × 10⁻⁸ W m⁻² K⁻⁴</td></tr>
</table>
<p class="hint" style="margin-top:0.75rem;">
Modell: NEATM (Near-Earth Asteroid Thermal Model).
T<sub>ss</sub> = 4<sup>¼</sup> · T<sub>eq</sub> ≈ 1,414 · T<sub>eq</sub>.
</p>
</div>
</div>
</div>
<script>
(function () {
const SIGMA = 5.670374419e-8;
const S0 = 1361.0;
const PRESETS = {
default: { r: 1.00, A: 0.050, eps: 0.90, eta: 1.00 },
c: { r: 2.50, A: 0.040, eps: 0.90, eta: 1.00 },
s: { r: 2.00, A: 0.150, eps: 0.90, eta: 1.00 },
vesta: { r: 2.36, A: 0.200, eps: 0.90, eta: 1.00 },
eros: { r: 1.46, A: 0.120, eps: 0.90, eta: 1.00 },
bennu: { r: 1.13, A: 0.020, eps: 0.90, eta: 1.00 },
ryugu: { r: 1.19, A: 0.020, eps: 0.90, eta: 1.00 },
neufang: { r: 3.01, A: 0.045, eps: 0.90, eta: 1.00 },
};
const numR = document.getElementById('at-r');
const numA = document.getElementById('at-a');
const numEps = document.getElementById('at-eps');
const numEta = document.getElementById('at-eta');
const sldR = document.getElementById('at-r-slider');
const sldA = document.getElementById('at-a-slider');
const sldEps = document.getElementById('at-eps-slider');
const sldEta = document.getElementById('at-eta-slider');
const outTeqK = document.getElementById('at-teq-k');
const outTeqC = document.getElementById('at-teq-c');
const outTssK = document.getElementById('at-tss-k');
const outTssC = document.getElementById('at-tss-c');
const swatch = document.getElementById('at-albedo-swatch');
function fmt(val, decimals = 2) {
return val.toFixed(decimals).replace('.', ',');
}
function calculate() {
const r = parseFloat(numR.value);
const A = parseFloat(numA.value);
const eps = parseFloat(numEps.value);
const eta = parseFloat(numEta.value);
if (!isFinite(r) || r <= 0 || !isFinite(A) || A < 0 || A >= 1 ||
!isFinite(eps) || eps <= 0 || !isFinite(eta) || eta <= 0) {
outTeqK.textContent = '–';
outTeqC.textContent = '';
outTssK.textContent = '–';
outTssC.textContent = '';
return;
}
const S = S0 / (r * r);
const Teq = Math.pow((1 - A) * S / (4.0 * eps * SIGMA * eta), 0.25);
const Tss = Math.pow((1 - A) * S / ( eps * SIGMA * eta), 0.25);
outTeqK.textContent = fmt(Teq, 2) + ' K';
outTeqC.textContent = '(' + fmt(Teq - 273.15, 2) + ' °C)';
outTssK.textContent = fmt(Tss, 2) + ' K';
outTssC.textContent = '(' + fmt(Tss - 273.15, 2) + ' °C)';
const v = Math.round(Math.min(1, Math.max(0, A)) * 255);
swatch.style.background = `rgb(${v},${v},${v})`;
}
function sync(numInput, slider) {
numInput.addEventListener('input', () => {
slider.value = numInput.value;
calculate();
});
slider.addEventListener('input', () => {
numInput.value = slider.value;
calculate();
});
}
sync(numR, sldR);
sync(numA, sldA);
sync(numEps, sldEps);
sync(numEta, sldEta);
function applyPreset(p) {
numR.value = sldR.value = p.r;
numA.value = sldA.value = p.A;
numEps.value = sldEps.value = p.eps;
numEta.value = sldEta.value = p.eta;
calculate();
}
document.querySelectorAll('[data-preset]').forEach(btn => {
btn.addEventListener('click', () => {
const key = btn.dataset.preset;
if (PRESETS[key]) applyPreset(PRESETS[key]);
});
});
document.getElementById('at-reset').addEventListener('click', () => {
applyPreset(PRESETS.default);
});
calculate();
})();
</script>
<?php require __DIR__ . '/footer.php'; ?>