@jjlmoya/utils-science 1.43.0 → 1.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/category/index.ts +3 -1
- package/src/entries.ts +5 -1
- package/src/index.ts +2 -0
- package/src/tests/locale_completeness.test.ts +2 -2
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/black-hole-event-horizon-simulator/bibliography.astro +14 -0
- package/src/tool/black-hole-event-horizon-simulator/bibliography.ts +16 -0
- package/src/tool/black-hole-event-horizon-simulator/black-hole-event-horizon-simulator.css +366 -0
- package/src/tool/black-hole-event-horizon-simulator/component.astro +302 -0
- package/src/tool/black-hole-event-horizon-simulator/entry.ts +29 -0
- package/src/tool/black-hole-event-horizon-simulator/i18n/de.ts +179 -0
- package/src/tool/black-hole-event-horizon-simulator/i18n/en.ts +259 -0
- package/src/tool/black-hole-event-horizon-simulator/i18n/es.ts +259 -0
- package/src/tool/black-hole-event-horizon-simulator/i18n/fr.ts +179 -0
- package/src/tool/black-hole-event-horizon-simulator/i18n/id.ts +259 -0
- package/src/tool/black-hole-event-horizon-simulator/i18n/it.ts +179 -0
- package/src/tool/black-hole-event-horizon-simulator/i18n/ja.ts +179 -0
- package/src/tool/black-hole-event-horizon-simulator/i18n/ko.ts +259 -0
- package/src/tool/black-hole-event-horizon-simulator/i18n/nl.ts +179 -0
- package/src/tool/black-hole-event-horizon-simulator/i18n/pl.ts +259 -0
- package/src/tool/black-hole-event-horizon-simulator/i18n/pt.ts +179 -0
- package/src/tool/black-hole-event-horizon-simulator/i18n/ru.ts +259 -0
- package/src/tool/black-hole-event-horizon-simulator/i18n/sv.ts +179 -0
- package/src/tool/black-hole-event-horizon-simulator/i18n/tr.ts +179 -0
- package/src/tool/black-hole-event-horizon-simulator/i18n/zh.ts +179 -0
- package/src/tool/black-hole-event-horizon-simulator/index.ts +11 -0
- package/src/tool/black-hole-event-horizon-simulator/logic.ts +68 -0
- package/src/tool/black-hole-event-horizon-simulator/seo.astro +15 -0
- package/src/tool/exoplanet-biosignature-detector/bibliography.astro +14 -0
- package/src/tool/exoplanet-biosignature-detector/bibliography.ts +16 -0
- package/src/tool/exoplanet-biosignature-detector/component.astro +351 -0
- package/src/tool/exoplanet-biosignature-detector/entry.ts +26 -0
- package/src/tool/exoplanet-biosignature-detector/exoplanet-biosignature-detector.css +516 -0
- package/src/tool/exoplanet-biosignature-detector/i18n/de.ts +196 -0
- package/src/tool/exoplanet-biosignature-detector/i18n/en.ts +196 -0
- package/src/tool/exoplanet-biosignature-detector/i18n/es.ts +196 -0
- package/src/tool/exoplanet-biosignature-detector/i18n/fr.ts +196 -0
- package/src/tool/exoplanet-biosignature-detector/i18n/id.ts +196 -0
- package/src/tool/exoplanet-biosignature-detector/i18n/it.ts +196 -0
- package/src/tool/exoplanet-biosignature-detector/i18n/ja.ts +196 -0
- package/src/tool/exoplanet-biosignature-detector/i18n/ko.ts +196 -0
- package/src/tool/exoplanet-biosignature-detector/i18n/nl.ts +196 -0
- package/src/tool/exoplanet-biosignature-detector/i18n/pl.ts +149 -0
- package/src/tool/exoplanet-biosignature-detector/i18n/pt.ts +149 -0
- package/src/tool/exoplanet-biosignature-detector/i18n/ru.ts +149 -0
- package/src/tool/exoplanet-biosignature-detector/i18n/sv.ts +149 -0
- package/src/tool/exoplanet-biosignature-detector/i18n/tr.ts +149 -0
- package/src/tool/exoplanet-biosignature-detector/i18n/zh.ts +196 -0
- package/src/tool/exoplanet-biosignature-detector/index.ts +11 -0
- package/src/tool/exoplanet-biosignature-detector/logic.ts +169 -0
- package/src/tool/exoplanet-biosignature-detector/seo.astro +15 -0
- package/src/tools.ts +4 -0
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
---
|
|
2
|
+
import './black-hole-event-horizon-simulator.css';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
ui: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const { ui } = Astro.props;
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
<div
|
|
12
|
+
class="bh-lab"
|
|
13
|
+
id="bh-lab"
|
|
14
|
+
data-rs-label={ui.rsLabel}
|
|
15
|
+
data-diameter-label={ui.diameterLabel}
|
|
16
|
+
data-time-label={ui.timeLabel}
|
|
17
|
+
data-redshift-label={ui.redshiftLabel}
|
|
18
|
+
data-status-safe={ui.statusSafe}
|
|
19
|
+
data-status-photon={ui.statusPhoton}
|
|
20
|
+
data-status-inside={ui.statusInside}
|
|
21
|
+
data-km-unit={ui.kilometerUnit}
|
|
22
|
+
data-ms-unit={ui.millisecondUnit}
|
|
23
|
+
data-second-unit={ui.secondUnit}
|
|
24
|
+
data-light-speed-unit={ui.lightSpeedUnit}
|
|
25
|
+
data-tidal-unit={ui.tidalUnit}
|
|
26
|
+
data-solar-masses-unit={ui.solarMassesUnit}
|
|
27
|
+
data-rs-unit={ui.rsUnit}
|
|
28
|
+
>
|
|
29
|
+
<div class="bh-card">
|
|
30
|
+
<section class="bh-stage" aria-label={ui.visualTitle}>
|
|
31
|
+
<div class="bh-visual">
|
|
32
|
+
<svg class="bh-svg" viewBox="0 0 760 620" role="img" aria-label={ui.visualTitle}>
|
|
33
|
+
<defs>
|
|
34
|
+
<radialGradient id="bh-core-glow" cx="50%" cy="50%" r="50%">
|
|
35
|
+
<stop offset="0%" stop-color="#000000" />
|
|
36
|
+
<stop offset="54%" stop-color="#020204" />
|
|
37
|
+
<stop offset="100%" stop-color="#19161f" />
|
|
38
|
+
</radialGradient>
|
|
39
|
+
<linearGradient id="bh-disk" x1="0" x2="1" y1="0" y2="0">
|
|
40
|
+
<stop offset="0%" stop-color="#4dd7ff" />
|
|
41
|
+
<stop offset="42%" stop-color="#ffe27a" />
|
|
42
|
+
<stop offset="72%" stop-color="#ff7a3d" />
|
|
43
|
+
<stop offset="100%" stop-color="#fb2d5f" />
|
|
44
|
+
</linearGradient>
|
|
45
|
+
<filter id="bh-blur">
|
|
46
|
+
<feGaussianBlur stdDeviation="9" />
|
|
47
|
+
</filter>
|
|
48
|
+
</defs>
|
|
49
|
+
<rect class="bh-space" width="760" height="620"></rect>
|
|
50
|
+
<g class="bh-stars" id="bh-stars"></g>
|
|
51
|
+
<ellipse class="bh-disk bh-disk-back" cx="380" cy="314" rx="268" ry="68"></ellipse>
|
|
52
|
+
<circle class="bh-photon" id="bh-photon" cx="380" cy="310" r="152"></circle>
|
|
53
|
+
<circle class="bh-isco" id="bh-isco" cx="380" cy="310" r="216"></circle>
|
|
54
|
+
<circle class="bh-horizon-glow" id="bh-horizon-glow" cx="380" cy="310" r="102"></circle>
|
|
55
|
+
<circle class="bh-horizon" id="bh-horizon" cx="380" cy="310" r="96"></circle>
|
|
56
|
+
<ellipse class="bh-disk bh-disk-front" cx="380" cy="314" rx="268" ry="68"></ellipse>
|
|
57
|
+
<g class="bh-probe" id="bh-probe">
|
|
58
|
+
<circle r="9"></circle>
|
|
59
|
+
<path d="M-18 0 L-4 -5 L-4 5 Z"></path>
|
|
60
|
+
</g>
|
|
61
|
+
<g class="bh-label bh-label-rs">
|
|
62
|
+
<line x1="380" x2="476" y1="310" y2="310"></line>
|
|
63
|
+
<text x="394" y="298">{ui.eventHorizon}</text>
|
|
64
|
+
</g>
|
|
65
|
+
<g class="bh-label bh-label-photon">
|
|
66
|
+
<line x1="532" x2="594" y1="310" y2="254"></line>
|
|
67
|
+
<text x="596" y="250">{ui.photonSphere}</text>
|
|
68
|
+
</g>
|
|
69
|
+
<g class="bh-label bh-label-isco">
|
|
70
|
+
<line x1="596" x2="662" y1="310" y2="368"></line>
|
|
71
|
+
<text x="548" y="390">{ui.isco}</text>
|
|
72
|
+
</g>
|
|
73
|
+
</svg>
|
|
74
|
+
</div>
|
|
75
|
+
<div class="bh-readout">
|
|
76
|
+
<span id="bh-status">{ui.statusSafe}</span>
|
|
77
|
+
<strong id="bh-rs">{ui.zeroKilometers}</strong>
|
|
78
|
+
<p>{ui.visualCaption}</p>
|
|
79
|
+
</div>
|
|
80
|
+
</section>
|
|
81
|
+
|
|
82
|
+
<section class="bh-controls" aria-label={ui.controlsTitle}>
|
|
83
|
+
<div class="bh-kpis">
|
|
84
|
+
<div>
|
|
85
|
+
<span>{ui.diameter}</span>
|
|
86
|
+
<strong id="bh-diameter">{ui.zeroKilometers}</strong>
|
|
87
|
+
</div>
|
|
88
|
+
<div>
|
|
89
|
+
<span>{ui.lightCrossing}</span>
|
|
90
|
+
<strong id="bh-crossing">{ui.zeroMilliseconds}</strong>
|
|
91
|
+
</div>
|
|
92
|
+
<div>
|
|
93
|
+
<span>{ui.timeDilation}</span>
|
|
94
|
+
<strong id="bh-time">{ui.zeroMultiplier}</strong>
|
|
95
|
+
</div>
|
|
96
|
+
<div>
|
|
97
|
+
<span>{ui.redshift}</span>
|
|
98
|
+
<strong id="bh-redshift">0</strong>
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
|
|
102
|
+
<div class="bh-sliders">
|
|
103
|
+
<label class="bh-slider" for="bh-mass">
|
|
104
|
+
<span>{ui.mass}</span>
|
|
105
|
+
<output id="bh-mass-output">{ui.initialMassOutput}</output>
|
|
106
|
+
<input id="bh-mass" type="range" min="0.477" max="10" step="0.01" value="1" />
|
|
107
|
+
</label>
|
|
108
|
+
<label class="bh-slider" for="bh-distance">
|
|
109
|
+
<span>{ui.distance}</span>
|
|
110
|
+
<output id="bh-distance-output">{ui.initialDistanceOutput}</output>
|
|
111
|
+
<input id="bh-distance" type="range" min="1.02" max="12" step="0.01" value="3" />
|
|
112
|
+
</label>
|
|
113
|
+
<label class="bh-slider" for="bh-speed">
|
|
114
|
+
<span>{ui.speed}</span>
|
|
115
|
+
<output id="bh-speed-output">{ui.initialSpeedOutput}</output>
|
|
116
|
+
<input id="bh-speed" type="range" min="5" max="99" step="1" value="32" />
|
|
117
|
+
</label>
|
|
118
|
+
</div>
|
|
119
|
+
|
|
120
|
+
<div class="bh-orbit-panel">
|
|
121
|
+
<div>
|
|
122
|
+
<span>{ui.escapeVelocity}</span>
|
|
123
|
+
<strong id="bh-escape">{ui.zeroLightSpeed}</strong>
|
|
124
|
+
</div>
|
|
125
|
+
<div>
|
|
126
|
+
<span>{ui.orbitalPeriod}</span>
|
|
127
|
+
<strong id="bh-period">{ui.zeroMilliseconds}</strong>
|
|
128
|
+
</div>
|
|
129
|
+
<div>
|
|
130
|
+
<span>{ui.tidalGradient}</span>
|
|
131
|
+
<strong id="bh-tide">{ui.zeroTidal}</strong>
|
|
132
|
+
</div>
|
|
133
|
+
</div>
|
|
134
|
+
</section>
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
|
|
138
|
+
<script>
|
|
139
|
+
import { simulateEventHorizon } from './logic';
|
|
140
|
+
|
|
141
|
+
const root = document.getElementById('bh-lab');
|
|
142
|
+
const massInput = document.getElementById('bh-mass') as HTMLInputElement | null;
|
|
143
|
+
const distanceInput = document.getElementById('bh-distance') as HTMLInputElement | null;
|
|
144
|
+
const speedInput = document.getElementById('bh-speed') as HTMLInputElement | null;
|
|
145
|
+
const probe = document.getElementById('bh-probe');
|
|
146
|
+
const horizon = document.getElementById('bh-horizon');
|
|
147
|
+
const glow = document.getElementById('bh-horizon-glow');
|
|
148
|
+
const photon = document.getElementById('bh-photon');
|
|
149
|
+
const isco = document.getElementById('bh-isco');
|
|
150
|
+
const stars = document.getElementById('bh-stars');
|
|
151
|
+
const numberFormat = new Intl.NumberFormat('en', { maximumFractionDigits: 2 });
|
|
152
|
+
const compactFormat = new Intl.NumberFormat('en', { maximumFractionDigits: 1, notation: 'compact' });
|
|
153
|
+
const storageKey = 'black-hole-event-horizon-simulator:last-state';
|
|
154
|
+
const labels = {
|
|
155
|
+
km: root?.dataset.kmUnit ?? '',
|
|
156
|
+
ms: root?.dataset.msUnit ?? '',
|
|
157
|
+
seconds: root?.dataset.secondUnit ?? '',
|
|
158
|
+
lightSpeed: root?.dataset.lightSpeedUnit ?? '',
|
|
159
|
+
tidal: root?.dataset.tidalUnit ?? '',
|
|
160
|
+
solarMasses: root?.dataset.solarMassesUnit ?? '',
|
|
161
|
+
rs: root?.dataset.rsUnit ?? '',
|
|
162
|
+
};
|
|
163
|
+
const statusLabels = {
|
|
164
|
+
'inside-horizon': root?.dataset.statusInside ?? '',
|
|
165
|
+
'photon-sphere': root?.dataset.statusPhoton ?? '',
|
|
166
|
+
'stable-orbit': root?.dataset.statusSafe ?? '',
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
function text(id: string, value: string) {
|
|
170
|
+
const node = document.getElementById(id);
|
|
171
|
+
if (node) node.textContent = value;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function inputValue(input: HTMLInputElement | null, fallback: number) {
|
|
175
|
+
return input ? Number(input.value) : fallback;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function massFromSlider() {
|
|
179
|
+
return 10 ** inputValue(massInput, 1);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function km(value: number) {
|
|
183
|
+
return `${compactFormat.format(value)} ${labels.km}`;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function milliseconds(value: number) {
|
|
187
|
+
if (value >= 1000) return `${numberFormat.format(value / 1000)} ${labels.seconds}`;
|
|
188
|
+
return `${numberFormat.format(value)} ${labels.ms}`;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function setSliderOutput(input: HTMLInputElement | null, outputId: string, value: string) {
|
|
192
|
+
const output = document.getElementById(outputId);
|
|
193
|
+
if (!input || !output) return;
|
|
194
|
+
const min = Number(input.min);
|
|
195
|
+
const max = Number(input.max);
|
|
196
|
+
const progress = (Number(input.value) - min) / (max - min);
|
|
197
|
+
output.style.setProperty('--value-x', `${progress * 100}%`);
|
|
198
|
+
output.textContent = value;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function saveState() {
|
|
202
|
+
if (!massInput || !distanceInput || !speedInput) return;
|
|
203
|
+
window.localStorage.setItem(storageKey, JSON.stringify({
|
|
204
|
+
mass: massInput.value,
|
|
205
|
+
distance: distanceInput.value,
|
|
206
|
+
speed: speedInput.value,
|
|
207
|
+
}));
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function restoreState() {
|
|
211
|
+
try {
|
|
212
|
+
const raw = window.localStorage.getItem(storageKey);
|
|
213
|
+
if (!raw) return;
|
|
214
|
+
const state = JSON.parse(raw) as Record<string, string>;
|
|
215
|
+
restoreInputValue(massInput, state.mass);
|
|
216
|
+
restoreInputValue(distanceInput, state.distance);
|
|
217
|
+
restoreInputValue(speedInput, state.speed);
|
|
218
|
+
} catch {
|
|
219
|
+
window.localStorage.removeItem(storageKey);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function restoreInputValue(input: HTMLInputElement | null, value: string | undefined) {
|
|
224
|
+
if (!input || !value) return;
|
|
225
|
+
input.value = value;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function drawStars() {
|
|
229
|
+
if (!stars || stars.childElementCount > 0) return;
|
|
230
|
+
const ns = 'http://www.w3.org/2000/svg';
|
|
231
|
+
for (let index = 0; index < 90; index += 1) {
|
|
232
|
+
const star = document.createElementNS(ns, 'circle');
|
|
233
|
+
const angle = index * 2.399963;
|
|
234
|
+
const radius = 35 + index * 3.1;
|
|
235
|
+
const x = 380 + Math.cos(angle) * radius * 1.3;
|
|
236
|
+
const y = 310 + Math.sin(angle) * radius * 0.78;
|
|
237
|
+
star.setAttribute('cx', x.toFixed(1));
|
|
238
|
+
star.setAttribute('cy', y.toFixed(1));
|
|
239
|
+
star.setAttribute('r', (index % 5 === 0 ? 1.7 : 0.9).toString());
|
|
240
|
+
stars.append(star);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function statusLabel(status: ReturnType<typeof simulateEventHorizon>['status']) {
|
|
245
|
+
return statusLabels[status];
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
function updateGeometry(massSolar: number, distance: number, speed: number, result: ReturnType<typeof simulateEventHorizon>) {
|
|
249
|
+
const horizonRadius = Math.max(58, Math.min(126, 48 + Math.log10(massSolar) * 13));
|
|
250
|
+
const probeRadius = horizonRadius * Math.min(3.4, distance);
|
|
251
|
+
const angle = performance.now() / 1300 * speed + distance;
|
|
252
|
+
const probeX = 380 + Math.cos(angle) * probeRadius;
|
|
253
|
+
const probeY = 310 + Math.sin(angle) * probeRadius * 0.33;
|
|
254
|
+
|
|
255
|
+
horizon?.setAttribute('r', horizonRadius.toFixed(1));
|
|
256
|
+
glow?.setAttribute('r', (horizonRadius + 18).toFixed(1));
|
|
257
|
+
photon?.setAttribute('r', (horizonRadius * 1.5).toFixed(1));
|
|
258
|
+
isco?.setAttribute('r', (horizonRadius * 3).toFixed(1));
|
|
259
|
+
probe?.setAttribute('transform', `translate(${probeX.toFixed(2)} ${probeY.toFixed(2)}) rotate(${angle * 57.2958 + 90})`);
|
|
260
|
+
root?.style.setProperty('--bh-warp', Math.min(1, result.escapeVelocityFraction).toFixed(3));
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function updateReadouts(result: ReturnType<typeof simulateEventHorizon>) {
|
|
264
|
+
text('bh-status', statusLabel(result.status));
|
|
265
|
+
text('bh-rs', `${root?.dataset.rsLabel}: ${km(result.schwarzschildRadiusKm)}`);
|
|
266
|
+
text('bh-diameter', km(result.diameterKm));
|
|
267
|
+
text('bh-crossing', milliseconds(result.lightCrossingMs));
|
|
268
|
+
text('bh-time', `${numberFormat.format(result.timeDilationFactor)}x`);
|
|
269
|
+
text('bh-redshift', numberFormat.format(result.gravitationalRedshift));
|
|
270
|
+
text('bh-escape', `${numberFormat.format(result.escapeVelocityFraction * 100)}${labels.lightSpeed}`);
|
|
271
|
+
text('bh-period', milliseconds(result.orbitalPeriodMs));
|
|
272
|
+
text('bh-tide', `${numberFormat.format(result.tidalGradientEarthGPerMeter)} ${labels.tidal}`);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
function updateSliderOutputs(massSolar: number, distance: number, speed: number) {
|
|
276
|
+
setSliderOutput(massInput, 'bh-mass-output', `${compactFormat.format(massSolar)} ${labels.solarMasses}`);
|
|
277
|
+
setSliderOutput(distanceInput, 'bh-distance-output', `${numberFormat.format(distance)} ${labels.rs}`);
|
|
278
|
+
setSliderOutput(speedInput, 'bh-speed-output', `${Math.round(speed * 100)}${labels.lightSpeed}`);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
function update(shouldSave = true) {
|
|
282
|
+
if (shouldSave) saveState();
|
|
283
|
+
const massSolar = massFromSlider();
|
|
284
|
+
const distance = inputValue(distanceInput, 3);
|
|
285
|
+
const speed = inputValue(speedInput, 32) / 100;
|
|
286
|
+
const result = simulateEventHorizon({ massSolar, distanceMultiplier: distance, orbitalSpeedFraction: speed });
|
|
287
|
+
|
|
288
|
+
updateGeometry(massSolar, distance, speed, result);
|
|
289
|
+
updateReadouts(result);
|
|
290
|
+
updateSliderOutputs(massSolar, distance, speed);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
function animate() {
|
|
294
|
+
update(false);
|
|
295
|
+
window.requestAnimationFrame(animate);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
drawStars();
|
|
299
|
+
restoreState();
|
|
300
|
+
[massInput, distanceInput, speedInput].forEach((input) => input?.addEventListener('input', update));
|
|
301
|
+
animate();
|
|
302
|
+
</script>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ScienceToolEntry, ToolLocaleContent } from '../../types';
|
|
2
|
+
|
|
3
|
+
export interface BlackHoleEventHorizonSimulatorUI {
|
|
4
|
+
[key: string]: string;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export type BlackHoleEventHorizonSimulatorLocaleContent = ToolLocaleContent<BlackHoleEventHorizonSimulatorUI>;
|
|
8
|
+
|
|
9
|
+
export const blackHoleEventHorizonSimulator: ScienceToolEntry<BlackHoleEventHorizonSimulatorUI> = {
|
|
10
|
+
id: 'black-hole-event-horizon-simulator',
|
|
11
|
+
icons: { bg: 'mdi:circle-opacity', fg: 'mdi:orbit' },
|
|
12
|
+
i18n: {
|
|
13
|
+
de: () => import('./i18n/de').then((m) => m.content),
|
|
14
|
+
en: () => import('./i18n/en').then((m) => m.content),
|
|
15
|
+
es: () => import('./i18n/es').then((m) => m.content),
|
|
16
|
+
fr: () => import('./i18n/fr').then((m) => m.content),
|
|
17
|
+
id: () => import('./i18n/id').then((m) => m.content),
|
|
18
|
+
it: () => import('./i18n/it').then((m) => m.content),
|
|
19
|
+
ja: () => import('./i18n/ja').then((m) => m.content),
|
|
20
|
+
ko: () => import('./i18n/ko').then((m) => m.content),
|
|
21
|
+
nl: () => import('./i18n/nl').then((m) => m.content),
|
|
22
|
+
pl: () => import('./i18n/pl').then((m) => m.content),
|
|
23
|
+
pt: () => import('./i18n/pt').then((m) => m.content),
|
|
24
|
+
ru: () => import('./i18n/ru').then((m) => m.content),
|
|
25
|
+
sv: () => import('./i18n/sv').then((m) => m.content),
|
|
26
|
+
tr: () => import('./i18n/tr').then((m) => m.content),
|
|
27
|
+
zh: () => import('./i18n/zh').then((m) => m.content),
|
|
28
|
+
},
|
|
29
|
+
};
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
|
|
4
|
+
const slug = 'schwarzes-loch-ereignishorizont-simulator';
|
|
5
|
+
const title = 'Schwarzes Loch Ereignishorizont Simulator';
|
|
6
|
+
const description = 'Erkunden Sie den Ereignishorizont eines schwarzen Lochs mit interaktiven Berechnungen von Masse, Orbitdistanz, Zeitdilatation, Photonensphäre, Fluchtgeschwindigkeit und Schwarzschild-Radius.';
|
|
7
|
+
|
|
8
|
+
const howTo = [
|
|
9
|
+
{
|
|
10
|
+
name: 'Wählen Sie die Masse des schwarzen Lochs',
|
|
11
|
+
text: 'Bewegen Sie den Masse-Regler von einem stellaren schwarzen Loch zu einem supermassiven schwarzen Loch und beobachten Sie, wie der Schwarzschild-Radius in Echtzeit skaliert.',
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
name: 'Bewegen Sie die Sonde nahe an den Horizont',
|
|
15
|
+
text: 'Stellen Sie die Entfernung in Schwarzschild-Radien ein, um einen sicheren äußeren Orbit, die Region der Photonensphäre und den Rand des Ereignishorizonts zu vergleichen.',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'Untersuchen Sie relativistische Effekte',
|
|
19
|
+
text: 'Lesen Sie die Fluchtgeschwindigkeit, die gravitative Zeitdilatation, die Rotverschiebung und die Umlaufzeit ab, um zu verstehen, warum die gewöhnliche Intuition in der Nähe des Horizonts versagt.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: 'Vergleichen Sie die charakteristischen Radien',
|
|
23
|
+
text: 'Nutzen Sie die Leitringe für Ereignishorizont, Photonensphäre und ISCO, um die verschiedenen Grenzen um ein nicht rotierendes schwarzes Loch zu verstehen.',
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
const faq = [
|
|
28
|
+
{
|
|
29
|
+
question: 'Was ist der Ereignishorizont eines schwarzen Lochs?',
|
|
30
|
+
answer: 'Der Ereignishorizont ist die Grenze, an der die Fluchtgeschwindigkeit die Lichtgeschwindigkeit erreicht. Sobald ein Objekt ihn überquert, kann kein Signal, das sich mit oder unter Lichtgeschwindigkeit bewegt, zum äußeren Universum zurückkehren.',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
question: 'Was bedeutet der Schwarzschild-Radius?',
|
|
34
|
+
answer: 'Der Schwarzschild-Radius ist der Ereignishorizont-Radius für ein nicht rotierendes, ungeladenes schwarzes Loch. Er wächst linear mit der Masse, sodass eine Verdopplung der Masse den Horizontradius verdoppelt.',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
question: 'Was ist die Photonensphäre?',
|
|
38
|
+
answer: 'Die Photonensphäre ist eine Region bei 1,5 Schwarzschild-Radien, in der Licht auf einem instabilen Pfad um das schwarze Loch kreisen kann. Winzige Störungen lassen Photonen entweder nach außen entkommen oder nach innen fallen.',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
question: 'Was ist die ISCO?',
|
|
42
|
+
answer: 'ISCO steht für "Innermost Stable Circular Orbit" (innerster stabiler kreisförmiger Orbit). Bei einem nicht rotierenden schwarzen Loch liegt sie bei 3 Schwarzschild-Radien bzw. 6 Gravitationsradien und markiert den letzten stabilen kreisförmigen Orbit für massereiche Teilchen.',
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
question: 'Warum nimmt die Zeitdilatation in der Nähe des Horizonts zu?',
|
|
46
|
+
answer: 'In der Schwarzschild-Geometrie ticken Uhren, die tiefer im Gravitationsfeld liegen, langsamer relativ zu entfernten Beobachtern. Der angezeigte Faktor nähert sich Null, wenn sich die Sonde dem Ereignishorizont nähert.',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
question: 'Kann dieser Simulator ein rotierendes schwarzes Loch modellieren?',
|
|
50
|
+
answer: 'Nein. Er verwendet die Schwarzschild-Lösung, die keine Rotation und keine elektrische Ladung annimmt. Echte astrophysikalische schwarze Löcher rotieren oft, und die Rotation verändert die Horizontgröße, die ISCO-Position und das Verhalten der Scheibe.',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
question: 'Warum sind supermassive schwarze Löcher am Horizont weniger "tidal gewalttätig"?',
|
|
54
|
+
answer: 'Der Gezeitengradient am Horizont nimmt mit zunehmender Masse des schwarzen Lochs ab. Ein kleines stellares schwarzes Loch kann Objekte in der Nähe des Horizonts gewaltsam auseinanderziehen, während ein supermassives schwarzes Loch an dieser Grenze einen sanfteren lokalen Gradienten aufweisen kann.',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
question: 'Zeigt die Visualisierung ein echtes Bild eines schwarzen Lochs?',
|
|
58
|
+
answer: 'Es ist ein lehrreiches Diagramm, keine Raytracing-Beobachtung. Die Ringe und die Scheibe sind auf die vereinfachten Schwarzschild-Radien skaliert, damit die physikalischen Zonen leicht vergleichbar sind.',
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
export const content: ToolLocaleContent = {
|
|
63
|
+
slug,
|
|
64
|
+
title,
|
|
65
|
+
description,
|
|
66
|
+
ui: {
|
|
67
|
+
visualTitle: 'Ereignishorizont-Feldkarte',
|
|
68
|
+
visualCaption: 'Die Sonde bewegt sich durch die skalierte Schwarzschild-Geometrie. Die hellen Leitringe markieren den Horizont, die Photonensphäre und den innersten stabilen kreisförmigen Orbit.',
|
|
69
|
+
controlsTitle: 'Steuerung des schwarzen Lochs',
|
|
70
|
+
eventHorizon: 'Ereignishorizont',
|
|
71
|
+
photonSphere: 'Photonensphäre',
|
|
72
|
+
isco: 'ISCO',
|
|
73
|
+
rsLabel: 'Schwarzschild-Radius',
|
|
74
|
+
diameterLabel: 'Durchmesser',
|
|
75
|
+
timeLabel: 'Zeitdilatation',
|
|
76
|
+
redshiftLabel: 'Rotverschiebung',
|
|
77
|
+
statusSafe: 'Außerhalb der stabilen Orbitregion',
|
|
78
|
+
statusPhoton: 'Innerhalb der Photonensphären-Zone',
|
|
79
|
+
statusInside: 'An der Horizontgrenze',
|
|
80
|
+
diameter: 'Horizontdurchmesser',
|
|
81
|
+
lightCrossing: 'Lichtdurchquerungszeit',
|
|
82
|
+
timeDilation: 'Uhrenrate vs. entfernter Beobachter',
|
|
83
|
+
redshift: 'Gravitative Rotverschiebung',
|
|
84
|
+
mass: 'Masse des schwarzen Lochs',
|
|
85
|
+
distance: 'Sondenentfernung',
|
|
86
|
+
speed: 'Orbitalgeschwindigkeit der Sonde',
|
|
87
|
+
escapeVelocity: 'Fluchtgeschwindigkeit',
|
|
88
|
+
orbitalPeriod: 'Umlaufzeit der Sonde',
|
|
89
|
+
tidalGradient: 'Gezeitengradient',
|
|
90
|
+
kilometerUnit: 'km',
|
|
91
|
+
millisecondUnit: 'ms',
|
|
92
|
+
secondUnit: 's',
|
|
93
|
+
lightSpeedUnit: '% c',
|
|
94
|
+
tidalUnit: 'g/m',
|
|
95
|
+
solarMassesUnit: 'Sonnenmassen',
|
|
96
|
+
rsUnit: 'Rs',
|
|
97
|
+
zeroKilometers: '0 km',
|
|
98
|
+
zeroMilliseconds: '0 ms',
|
|
99
|
+
zeroMultiplier: '0x',
|
|
100
|
+
zeroLightSpeed: '0% c',
|
|
101
|
+
zeroTidal: '0 g/m',
|
|
102
|
+
initialMassOutput: '10 Sonnenmassen',
|
|
103
|
+
initialDistanceOutput: '3.0 Rs',
|
|
104
|
+
initialSpeedOutput: '32% c',
|
|
105
|
+
},
|
|
106
|
+
seo: [
|
|
107
|
+
{
|
|
108
|
+
type: 'title',
|
|
109
|
+
text: 'Schwarzes Loch Ereignishorizont Simulator für Schwarzschild-Radius, Photonensphäre und Zeitdilatation',
|
|
110
|
+
level: 2,
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
type: 'paragraph',
|
|
114
|
+
html: 'Dieser Schwarzes Loch Ereignishorizont Simulator verwandelt die Kernideen von Schwarzschild-schwarzen Löchern in ein interaktives visuelles Modell. Ändern Sie die Masse des schwarzen Lochs, bewegen Sie eine Sonde nach innen oder außen und vergleichen Sie, wie Ereignishorizont, Photonensphäre, innerster stabiler kreisförmiger Orbit, Fluchtgeschwindigkeit, gravitative Rotverschiebung und Zeitdilatation reagieren.',
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
type: 'paragraph',
|
|
118
|
+
html: 'Der Simulator wurde für Astronomiestudenten, Physiklehrer, Wissenschaftsautoren und neugierige Lernende entwickelt, die mehr als eine statische Formel wollen. Die Anzeige verbindet die Zahlen mit einem räumlichen Diagramm, sodass Sie sehen können, warum der Ereignishorizont keine materielle Oberfläche ist, warum Photonen einen speziellen instabilen Orbit haben und warum stabile Kreisbewegungen stoppen, bevor der Horizont erreicht wird.',
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
type: 'title',
|
|
122
|
+
text: 'Wie der Ereignishorizont-Radius berechnet wird',
|
|
123
|
+
level: 3,
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'paragraph',
|
|
127
|
+
html: 'Für ein nicht rotierendes, ungeladenes schwarzes Loch ist der Ereignishorizont-Radius der <strong>Schwarzschild-Radius</strong>. Er wird berechnet als <strong>Rs = 2GM / c^2</strong>, wobei G die Gravitationskonstante, M die Masse des schwarzen Lochs und c die Lichtgeschwindigkeit ist. Eine Sonnenmasse entspricht einem Schwarzschild-Radius von etwa 2,95 Kilometern.',
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
type: 'paragraph',
|
|
131
|
+
html: 'Da der Schwarzschild-Radius linear mit der Masse skaliert, hat ein schwarzes Loch mit 10 Sonnenmassen einen Radius von nahezu 29,5 Kilometern, während ein schwarzes Loch mit 4 Millionen Sonnenmassen wie Sagittarius A* einen Radius von etwa 11,8 Millionen Kilometern hat. Der Masse-Regler verwendet eine logarithmische Skala, damit sowohl stellare als auch supermassive Fälle in dieselbe Steuerung passen.',
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
type: 'table',
|
|
135
|
+
headers: ['Region', 'Radius in Schwarzschild-Radien', 'Bedeutung'],
|
|
136
|
+
rows: [
|
|
137
|
+
['Ereignishorizont', '1.0 Rs', 'Die Einweg-Grenze, an der die Fluchtgeschwindigkeit der Lichtgeschwindigkeit entspricht.'],
|
|
138
|
+
['Photonensphäre', '1.5 Rs', 'Der instabile kreisförmige Orbit für Licht um ein Schwarzschild-schwarzes Loch.'],
|
|
139
|
+
['ISCO', '3.0 Rs', 'Der innerste stabile kreisförmige Orbit für massereiche Teilchen.'],
|
|
140
|
+
['Schwaches Feld', '6 Rs und darüber', 'Die Schwerkraft ist immer noch stark, aber kreisförmige Orbits sind leichter aufrechtzuerhalten.'],
|
|
141
|
+
],
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
faq,
|
|
145
|
+
bibliography,
|
|
146
|
+
howTo,
|
|
147
|
+
schemas: [
|
|
148
|
+
{
|
|
149
|
+
'@context': 'https://schema.org',
|
|
150
|
+
'@type': 'SoftwareApplication',
|
|
151
|
+
name: title,
|
|
152
|
+
description,
|
|
153
|
+
applicationCategory: 'ScientificApplication',
|
|
154
|
+
operatingSystem: 'Any',
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
'@context': 'https://schema.org',
|
|
158
|
+
'@type': 'FAQPage',
|
|
159
|
+
mainEntity: faq.map((item) => ({
|
|
160
|
+
'@type': 'Question',
|
|
161
|
+
name: item.question,
|
|
162
|
+
acceptedAnswer: {
|
|
163
|
+
'@type': 'Answer',
|
|
164
|
+
text: item.answer,
|
|
165
|
+
},
|
|
166
|
+
})),
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
'@context': 'https://schema.org',
|
|
170
|
+
'@type': 'HowTo',
|
|
171
|
+
name: title,
|
|
172
|
+
step: howTo.map((step) => ({
|
|
173
|
+
'@type': 'HowToStep',
|
|
174
|
+
name: step.name,
|
|
175
|
+
text: step.text,
|
|
176
|
+
})),
|
|
177
|
+
},
|
|
178
|
+
],
|
|
179
|
+
};
|