Asteroid temperatur eingebaut
This commit is contained in:
@@ -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">> 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² 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'; ?>
|
||||
Reference in New Issue
Block a user