@jjlmoya/utils-science 1.30.0 → 1.31.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 +2 -1
- package/src/entries.ts +3 -1
- package/src/index.ts +1 -0
- package/src/tests/locale_completeness.test.ts +2 -2
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/twin-paradox-visualizer/bibliography.astro +14 -0
- package/src/tool/twin-paradox-visualizer/bibliography.ts +12 -0
- package/src/tool/twin-paradox-visualizer/component.astro +205 -0
- package/src/tool/twin-paradox-visualizer/entry.ts +26 -0
- package/src/tool/twin-paradox-visualizer/i18n/de.ts +168 -0
- package/src/tool/twin-paradox-visualizer/i18n/en.ts +168 -0
- package/src/tool/twin-paradox-visualizer/i18n/es.ts +168 -0
- package/src/tool/twin-paradox-visualizer/i18n/fr.ts +168 -0
- package/src/tool/twin-paradox-visualizer/i18n/id.ts +168 -0
- package/src/tool/twin-paradox-visualizer/i18n/it.ts +168 -0
- package/src/tool/twin-paradox-visualizer/i18n/ja.ts +168 -0
- package/src/tool/twin-paradox-visualizer/i18n/ko.ts +168 -0
- package/src/tool/twin-paradox-visualizer/i18n/nl.ts +168 -0
- package/src/tool/twin-paradox-visualizer/i18n/pl.ts +168 -0
- package/src/tool/twin-paradox-visualizer/i18n/pt.ts +168 -0
- package/src/tool/twin-paradox-visualizer/i18n/ru.ts +168 -0
- package/src/tool/twin-paradox-visualizer/i18n/sv.ts +168 -0
- package/src/tool/twin-paradox-visualizer/i18n/tr.ts +168 -0
- package/src/tool/twin-paradox-visualizer/i18n/zh.ts +168 -0
- package/src/tool/twin-paradox-visualizer/index.ts +11 -0
- package/src/tool/twin-paradox-visualizer/logic.ts +33 -0
- package/src/tool/twin-paradox-visualizer/seo.astro +15 -0
- package/src/tool/twin-paradox-visualizer/twin-paradox-visualizer.css +395 -0
- package/src/tools.ts +2 -0
package/package.json
CHANGED
package/src/category/index.ts
CHANGED
|
@@ -12,10 +12,11 @@ import { radioactiveDecay } from '../tool/radioactive-decay/index';
|
|
|
12
12
|
import { naturalSelectionDrift } from '../tool/natural-selection-drift/index';
|
|
13
13
|
import { entropySecondLaw } from '../tool/entropy-second-law/index';
|
|
14
14
|
import { phaseDiagramCriticalPoints } from '../tool/phase-diagram-critical-points/index';
|
|
15
|
+
import { twinParadoxVisualizer } from '../tool/twin-paradox-visualizer/index';
|
|
15
16
|
|
|
16
17
|
export const scienceCategory: ScienceCategoryEntry = {
|
|
17
18
|
icon: 'mdi:flask',
|
|
18
|
-
tools: [colonyCounter, asteroidImpact, microwaveDetector, simulationProbability, cellularRenewal, cosmicInflation, temperatureTimeline, lorenzAttractor, stellarHabitabilityZone, radioactiveDecay, naturalSelectionDrift, entropySecondLaw, phaseDiagramCriticalPoints],
|
|
19
|
+
tools: [colonyCounter, asteroidImpact, microwaveDetector, simulationProbability, cellularRenewal, cosmicInflation, temperatureTimeline, lorenzAttractor, stellarHabitabilityZone, radioactiveDecay, naturalSelectionDrift, entropySecondLaw, phaseDiagramCriticalPoints, twinParadoxVisualizer],
|
|
19
20
|
i18n: {
|
|
20
21
|
es: () => import('./i18n/es').then((m) => m.content),
|
|
21
22
|
en: () => import('./i18n/en').then((m) => m.content),
|
package/src/entries.ts
CHANGED
|
@@ -12,6 +12,7 @@ export { radioactiveDecay } from './tool/radioactive-decay/entry';
|
|
|
12
12
|
export { naturalSelectionDrift } from './tool/natural-selection-drift/entry';
|
|
13
13
|
export { entropySecondLaw } from './tool/entropy-second-law/entry';
|
|
14
14
|
export { phaseDiagramCriticalPoints } from './tool/phase-diagram-critical-points/entry';
|
|
15
|
+
export { twinParadoxVisualizer } from './tool/twin-paradox-visualizer/entry';
|
|
15
16
|
export { scienceCategory } from './category';
|
|
16
17
|
import { asteroidImpact } from './tool/asteroid-impact/entry';
|
|
17
18
|
import { cellularRenewal } from './tool/cellular-renewal/entry';
|
|
@@ -26,4 +27,5 @@ import { radioactiveDecay } from './tool/radioactive-decay/entry';
|
|
|
26
27
|
import { naturalSelectionDrift } from './tool/natural-selection-drift/entry';
|
|
27
28
|
import { entropySecondLaw } from './tool/entropy-second-law/entry';
|
|
28
29
|
import { phaseDiagramCriticalPoints } from './tool/phase-diagram-critical-points/entry';
|
|
29
|
-
|
|
30
|
+
import { twinParadoxVisualizer } from './tool/twin-paradox-visualizer/entry';
|
|
31
|
+
export const ALL_ENTRIES = [asteroidImpact, cellularRenewal, colonyCounter, microwaveDetector, simulationProbability, cosmicInflation, temperatureTimeline, lorenzAttractor, stellarHabitabilityZone, radioactiveDecay, naturalSelectionDrift, entropySecondLaw, phaseDiagramCriticalPoints, twinParadoxVisualizer];
|
package/src/index.ts
CHANGED
|
@@ -13,6 +13,7 @@ export { RADIOACTIVE_DECAY_TOOL } from './tool/radioactive-decay/index';
|
|
|
13
13
|
export { NATURAL_SELECTION_DRIFT_TOOL } from './tool/natural-selection-drift/index';
|
|
14
14
|
export { ENTROPY_SECOND_LAW_TOOL } from './tool/entropy-second-law/index';
|
|
15
15
|
export { PHASE_DIAGRAM_CRITICAL_POINTS_TOOL } from './tool/phase-diagram-critical-points/index';
|
|
16
|
+
export { TWIN_PARADOX_VISUALIZER_TOOL } from './tool/twin-paradox-visualizer/index';
|
|
16
17
|
|
|
17
18
|
export type {
|
|
18
19
|
KnownLocale,
|
|
@@ -4,8 +4,8 @@ import { scienceCategory } from '../data';
|
|
|
4
4
|
|
|
5
5
|
describe('Tool Validation Suite', () => {
|
|
6
6
|
describe('Library Registration', () => {
|
|
7
|
-
it('should have
|
|
8
|
-
expect(ALL_TOOLS.length).toBe(
|
|
7
|
+
it('should have 14 tools in ALL_TOOLS', () => {
|
|
8
|
+
expect(ALL_TOOLS.length).toBe(14);
|
|
9
9
|
});
|
|
10
10
|
|
|
11
11
|
it('scienceCategory should be defined', () => {
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { twinParadoxVisualizer } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'en' } = Astro.props;
|
|
11
|
+
const content = await twinParadoxVisualizer.i18n[locale]?.();
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
{content && <SharedBibliography links={content.bibliography} />}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BibliographyEntry } from '../../types';
|
|
2
|
+
|
|
3
|
+
export const bibliography: BibliographyEntry[] = [
|
|
4
|
+
{
|
|
5
|
+
name: 'Twin Paradox without One-Way Velocity Assumptions',
|
|
6
|
+
url: 'https://link.springer.com/article/10.1023/A:1018748702460',
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
name: 'Spacetime Physics: Introduction to Special Relativity',
|
|
10
|
+
url: 'https://ia800503.us.archive.org/22/items/SpacetimePhysicsIntroductionToSpecialRelativityTaylorWheelerPDF/Spacetime%20Physics%20-%20Introduction%20to%20Special%20Relativity%20%5BTaylor-Wheeler%5DPDF.pdf',
|
|
11
|
+
},
|
|
12
|
+
];
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
---
|
|
2
|
+
import './twin-paradox-visualizer.css';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
ui: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const { ui } = Astro.props;
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
<div class="twin-lab" id="twin-lab" data-years-unit={ui.yearsUnit} data-years-short-unit={ui.yearsShortUnit}>
|
|
12
|
+
<section class="twin-viewport" aria-label={ui.visualTitle}>
|
|
13
|
+
<div class="twin-orbit">
|
|
14
|
+
<div class="twin-earth">
|
|
15
|
+
<span>{ui.earthTwin}</span>
|
|
16
|
+
<strong id="twin-earth-age">30.0</strong>
|
|
17
|
+
</div>
|
|
18
|
+
<div class="twin-path" aria-hidden="true">
|
|
19
|
+
<div class="twin-turnaround" id="twin-turnaround"></div>
|
|
20
|
+
<div class="twin-ship" id="twin-ship"></div>
|
|
21
|
+
</div>
|
|
22
|
+
<div class="twin-ship-clock">
|
|
23
|
+
<span>{ui.travelingTwin}</span>
|
|
24
|
+
<strong id="twin-ship-age">30.0</strong>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
<svg class="twin-worldline" id="twin-worldline" viewBox="0 0 640 260" role="img" aria-label={ui.worldlineLabel}>
|
|
28
|
+
<g class="twin-lab-grid" id="twin-lab-grid" aria-hidden="true"></g>
|
|
29
|
+
<path class="twin-earth-line" d="M112 220 V38"></path>
|
|
30
|
+
<path class="twin-ship-line" id="twin-ship-line" d="M112 220 L350 74 L588 220"></path>
|
|
31
|
+
<circle class="twin-event" cx="112" cy="220" r="7"></circle>
|
|
32
|
+
<circle class="twin-event twin-event-return" id="twin-return-event" cx="588" cy="220" r="7"></circle>
|
|
33
|
+
</svg>
|
|
34
|
+
</section>
|
|
35
|
+
|
|
36
|
+
<section class="twin-console" aria-label={ui.controlsTitle}>
|
|
37
|
+
<div class="twin-presets">
|
|
38
|
+
<button type="button" data-velocity="0.50" data-years="12">{ui.presetCruise}</button>
|
|
39
|
+
<button type="button" data-velocity="0.86" data-years="20" class="active">{ui.presetRelativistic}</button>
|
|
40
|
+
<button type="button" data-velocity="0.98" data-years="40">{ui.presetExtreme}</button>
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
<label class="twin-field" for="twin-velocity">
|
|
44
|
+
<span>{ui.velocityLabel}</span>
|
|
45
|
+
<output id="twin-velocity-output">0.86c</output>
|
|
46
|
+
<input id="twin-velocity" type="range" min="0.05" max="0.99" value="0.86" step="0.01" />
|
|
47
|
+
</label>
|
|
48
|
+
|
|
49
|
+
<label class="twin-field" for="twin-years">
|
|
50
|
+
<span>{ui.earthYearsLabel}</span>
|
|
51
|
+
<output id="twin-years-output">20 {ui.yearsUnit}</output>
|
|
52
|
+
<input id="twin-years" type="range" min="2" max="80" value="20" step="1" />
|
|
53
|
+
</label>
|
|
54
|
+
|
|
55
|
+
<div class="twin-readout">
|
|
56
|
+
<div class="twin-reunion">
|
|
57
|
+
<span>{ui.ageGapLabel}</span>
|
|
58
|
+
<strong><span id="twin-age-gap-value">-</span><small>{ui.yearsShortUnit}</small></strong>
|
|
59
|
+
</div>
|
|
60
|
+
<div class="twin-results">
|
|
61
|
+
<div class="twin-metric">
|
|
62
|
+
<span>{ui.gammaLabel}</span>
|
|
63
|
+
<strong id="twin-gamma">-</strong>
|
|
64
|
+
</div>
|
|
65
|
+
<div class="twin-metric">
|
|
66
|
+
<span>{ui.shipTimeLabel}</span>
|
|
67
|
+
<strong id="twin-ship-time">-</strong>
|
|
68
|
+
</div>
|
|
69
|
+
<div class="twin-metric">
|
|
70
|
+
<span>{ui.distanceLabel}</span>
|
|
71
|
+
<strong id="twin-distance">-</strong>
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
</div>
|
|
75
|
+
</section>
|
|
76
|
+
</div>
|
|
77
|
+
|
|
78
|
+
<script>
|
|
79
|
+
import { calculateTwinParadox } from './logic';
|
|
80
|
+
|
|
81
|
+
const root = document.getElementById('twin-lab');
|
|
82
|
+
const velocityInput = document.getElementById('twin-velocity') as HTMLInputElement | null;
|
|
83
|
+
const yearsInput = document.getElementById('twin-years') as HTMLInputElement | null;
|
|
84
|
+
const velocityOutput = document.getElementById('twin-velocity-output');
|
|
85
|
+
const yearsOutput = document.getElementById('twin-years-output');
|
|
86
|
+
const earthAge = document.getElementById('twin-earth-age');
|
|
87
|
+
const shipAge = document.getElementById('twin-ship-age');
|
|
88
|
+
const ageGap = document.getElementById('twin-age-gap-value');
|
|
89
|
+
const gammaText = document.getElementById('twin-gamma');
|
|
90
|
+
const shipTime = document.getElementById('twin-ship-time');
|
|
91
|
+
const distanceText = document.getElementById('twin-distance');
|
|
92
|
+
const ship = document.getElementById('twin-ship');
|
|
93
|
+
const turnaround = document.getElementById('twin-turnaround');
|
|
94
|
+
const shipLine = document.getElementById('twin-ship-line');
|
|
95
|
+
const returnEvent = document.getElementById('twin-return-event');
|
|
96
|
+
const grid = document.getElementById('twin-lab-grid');
|
|
97
|
+
const worldline = document.getElementById('twin-worldline');
|
|
98
|
+
const presetButtons = document.querySelectorAll<HTMLButtonElement>('.twin-presets button');
|
|
99
|
+
const departureAge = 30;
|
|
100
|
+
const svgNamespace = 'http://www.w3.org/2000/svg';
|
|
101
|
+
const yearsUnit = root?.dataset.yearsUnit ?? '';
|
|
102
|
+
const yearsShortUnit = root?.dataset.yearsShortUnit ?? '';
|
|
103
|
+
|
|
104
|
+
function formatYears(value: number): string {
|
|
105
|
+
return value.toFixed(value >= 10 ? 1 : 2);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function setFill(input: HTMLInputElement) {
|
|
109
|
+
const min = Number(input.min);
|
|
110
|
+
const max = Number(input.max);
|
|
111
|
+
const value = Number(input.value);
|
|
112
|
+
const progress = ((value - min) / (max - min)) * 100;
|
|
113
|
+
input.style.setProperty('--fill', `${progress}%`);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function buildGrid() {
|
|
117
|
+
if (!grid) return;
|
|
118
|
+
|
|
119
|
+
for (let y = 44; y <= 220; y += 22) {
|
|
120
|
+
for (let x = 92; x <= 592; x += 28) {
|
|
121
|
+
const dot = document.createElementNS(svgNamespace, 'circle');
|
|
122
|
+
dot.setAttribute('cx', x.toString());
|
|
123
|
+
dot.setAttribute('cy', y.toString());
|
|
124
|
+
dot.setAttribute('r', ((x + y) % 3 === 0 ? 1.55 : 1.05).toString());
|
|
125
|
+
dot.dataset.x = x.toString();
|
|
126
|
+
dot.dataset.y = y.toString();
|
|
127
|
+
grid.append(dot);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function warpGrid(velocity: number, gamma: number) {
|
|
133
|
+
if (!grid || !worldline) return;
|
|
134
|
+
|
|
135
|
+
const contraction = 1 / gamma;
|
|
136
|
+
const skew = velocity * 0.32;
|
|
137
|
+
grid.querySelectorAll<SVGCircleElement>('circle').forEach((dot) => {
|
|
138
|
+
const rawX = Number(dot.dataset.x);
|
|
139
|
+
const rawY = Number(dot.dataset.y);
|
|
140
|
+
const centerX = 112;
|
|
141
|
+
const centerY = 220;
|
|
142
|
+
const dx = rawX - centerX;
|
|
143
|
+
const dy = rawY - centerY;
|
|
144
|
+
const warpedX = centerX + dx * (0.72 + contraction * 0.28) + dy * skew;
|
|
145
|
+
const warpedY = centerY + dy * (1.04 - velocity * 0.16);
|
|
146
|
+
dot.setAttribute('cx', warpedX.toFixed(2));
|
|
147
|
+
dot.setAttribute('cy', warpedY.toFixed(2));
|
|
148
|
+
dot.style.opacity = `${0.12 + velocity * 0.25}`;
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
worldline.style.setProperty('--grid-compression', contraction.toFixed(3));
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function update() {
|
|
155
|
+
if (!velocityInput || !yearsInput) return;
|
|
156
|
+
|
|
157
|
+
const velocity = Number(velocityInput.value);
|
|
158
|
+
const earthYears = Number(yearsInput.value);
|
|
159
|
+
const result = calculateTwinParadox({ earthYears, velocityFractionC: velocity });
|
|
160
|
+
const shipProgress = Math.min(94, Math.max(8, 9 + velocity * 72));
|
|
161
|
+
const bendY = Math.max(52, 168 - velocity * 104);
|
|
162
|
+
const returnX = Math.min(598, 270 + earthYears * 4);
|
|
163
|
+
|
|
164
|
+
velocityOutput!.textContent = `${velocity.toFixed(2)}c`;
|
|
165
|
+
yearsOutput!.textContent = `${earthYears} ${yearsUnit}`;
|
|
166
|
+
earthAge!.textContent = (departureAge + earthYears).toFixed(1);
|
|
167
|
+
shipAge!.textContent = (departureAge + result.shipYears).toFixed(1);
|
|
168
|
+
ageGap!.textContent = formatYears(result.ageGapYears);
|
|
169
|
+
gammaText!.textContent = `${result.gamma.toFixed(3)}x`;
|
|
170
|
+
shipTime!.textContent = `${formatYears(result.shipYears)} ${yearsShortUnit}`;
|
|
171
|
+
distanceText!.textContent = `${result.earthDistanceLightYears.toFixed(1)} ly`;
|
|
172
|
+
|
|
173
|
+
ship?.style.setProperty('--ship-progress', `${shipProgress}%`);
|
|
174
|
+
ship?.style.setProperty('--clock-rate', `"${result.shipClockRatePercent.toFixed(1)}%"`);
|
|
175
|
+
turnaround?.style.setProperty('--turnaround-progress', `${shipProgress}%`);
|
|
176
|
+
shipLine?.setAttribute('d', `M112 220 L350 ${bendY.toFixed(1)} L${returnX.toFixed(1)} 220`);
|
|
177
|
+
returnEvent?.setAttribute('cx', returnX.toFixed(1));
|
|
178
|
+
warpGrid(velocity, result.gamma);
|
|
179
|
+
setFill(velocityInput);
|
|
180
|
+
setFill(yearsInput);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
velocityInput?.addEventListener('input', () => {
|
|
184
|
+
presetButtons.forEach((button) => button.classList.remove('active'));
|
|
185
|
+
update();
|
|
186
|
+
});
|
|
187
|
+
yearsInput?.addEventListener('input', () => {
|
|
188
|
+
presetButtons.forEach((button) => button.classList.remove('active'));
|
|
189
|
+
update();
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
presetButtons.forEach((button) => {
|
|
193
|
+
button.addEventListener('click', () => {
|
|
194
|
+
if (!velocityInput || !yearsInput) return;
|
|
195
|
+
presetButtons.forEach((item) => item.classList.remove('active'));
|
|
196
|
+
button.classList.add('active');
|
|
197
|
+
velocityInput.value = button.dataset.velocity ?? velocityInput.value;
|
|
198
|
+
yearsInput.value = button.dataset.years ?? yearsInput.value;
|
|
199
|
+
update();
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
buildGrid();
|
|
204
|
+
update();
|
|
205
|
+
</script>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ScienceToolEntry } from '../../types';
|
|
2
|
+
|
|
3
|
+
export const twinParadoxVisualizer: ScienceToolEntry = {
|
|
4
|
+
id: 'twin-paradox-visualizer',
|
|
5
|
+
icons: {
|
|
6
|
+
bg: 'mdi:clock-time-eight-outline',
|
|
7
|
+
fg: 'mdi:rocket-outline',
|
|
8
|
+
},
|
|
9
|
+
i18n: {
|
|
10
|
+
de: () => import('./i18n/de').then((m) => m.content),
|
|
11
|
+
en: () => import('./i18n/en').then((m) => m.content),
|
|
12
|
+
es: () => import('./i18n/es').then((m) => m.content),
|
|
13
|
+
fr: () => import('./i18n/fr').then((m) => m.content),
|
|
14
|
+
id: () => import('./i18n/id').then((m) => m.content),
|
|
15
|
+
it: () => import('./i18n/it').then((m) => m.content),
|
|
16
|
+
ja: () => import('./i18n/ja').then((m) => m.content),
|
|
17
|
+
ko: () => import('./i18n/ko').then((m) => m.content),
|
|
18
|
+
nl: () => import('./i18n/nl').then((m) => m.content),
|
|
19
|
+
pl: () => import('./i18n/pl').then((m) => m.content),
|
|
20
|
+
pt: () => import('./i18n/pt').then((m) => m.content),
|
|
21
|
+
ru: () => import('./i18n/ru').then((m) => m.content),
|
|
22
|
+
sv: () => import('./i18n/sv').then((m) => m.content),
|
|
23
|
+
tr: () => import('./i18n/tr').then((m) => m.content),
|
|
24
|
+
zh: () => import('./i18n/zh').then((m) => m.content),
|
|
25
|
+
},
|
|
26
|
+
};
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
|
|
4
|
+
const slug = 'zwillingsparadoxon-visualisierer';
|
|
5
|
+
const title = 'Zwillingsparadoxon Visualisierer: Spezielle Relativitätstheorie Zeitdilatation';
|
|
6
|
+
const description = 'Visualisieren Sie, wie die spezielle Relativitätstheorie einen schnell reisenden Zwilling jünger zurückkehren lässt als den Zwilling, der auf der Erde geblieben ist.';
|
|
7
|
+
|
|
8
|
+
const howTo = [
|
|
9
|
+
{
|
|
10
|
+
name: 'Geschwindigkeit des Raumschiffs einstellen',
|
|
11
|
+
text: 'Nutzen Sie den Geschwindigkeitsregler, um einen Bruchteil der Lichtgeschwindigkeit zu wählen, und beobachten Sie, wie der Lorentzfaktor ansteigt.',
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
name: 'Missionsdauer im Erdsystem festlegen',
|
|
15
|
+
text: 'Stellen Sie ein, wie viele Jahre für den auf der Erde verbleibenden Zwilling während der gesamten Hin- und Rückreise vergehen.',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'Uhren und Weltlinien vergleichen',
|
|
19
|
+
text: 'Lesen Sie den Altersunterschied, die vergangene Zeit im Raumschiff, die Entfernung im Erdsystem und die gekrümmte Weltlinie ab, die den Wechsel des Inertialsystems des reisenden Zwillings markiert.',
|
|
20
|
+
},
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
const faq = [
|
|
24
|
+
{
|
|
25
|
+
question: 'Was ist das Zwillingsparadoxon in der speziellen Relativitätstheorie?',
|
|
26
|
+
answer: 'Das Zwillingsparadoxon ist ein Gedankenexperiment, bei dem ein Zwilling mit relativistischer Geschwindigkeit durch das Weltall reist und später jünger zur Erde zurückkehrt als der auf der Erde gebliebene Zwilling. Es erscheint paradox, weil zunächst jeder Zwilling den anderen als bewegt beschreiben kann, aber der reisende Zwilling beim Umkehren das Inertialsystem wechselt, sodass die beiden Pfade durch die Raumzeit nicht symmetrisch sind.',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
question: 'Warum altert der reisende Zwilling weniger?',
|
|
30
|
+
answer: 'In der speziellen Relativitätstheorie hängt die vergangene Eigenzeit vom Pfad durch die Raumzeit ab. Eine Uhr, die sich mit Geschwindigkeit v relativ zu einem Inertialsystem bewegt, tickt um den Lorentzfaktor gamma langsamer. Der Reisende sammelt auf dem Hin- und Rückweg weniger Eigenzeit an als der auf der Erde gebliebene Zwilling.',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
question: 'Verursacht die Beschleunigung den Altersunterschied?',
|
|
34
|
+
answer: 'Beschleunigung ist wichtig, da sie dem Reisenden ermöglicht, die Richtung umzukehren und zur Erde zurückzukehren, aber der Altersunterschied wird aus dem gesamten Raumzeitpfad berechnet, nicht allein aus der Beschleunigung. Selbst wenn die Umkehr sehr kurz wäre, würde der Reisepfad immer noch weniger Eigenzeit enthalten als der Pfad auf der Erde.',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
question: 'Was bedeutet der Lorentzfaktor gamma?',
|
|
38
|
+
answer: 'Der Lorentzfaktor gamma ist gleich 1 geteilt durch die Quadratwurzel aus 1 minus v Quadrat durch c Quadrat. Er gibt an, wie stark sich Zeitintervalle, Längen und Energien zwischen Inertialsystemen unterscheiden. Bei alltäglichen Geschwindigkeiten ist gamma fast 1, nahe der Lichtgeschwindigkeit steigt er jedoch stark an.',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
question: 'Kann dieser Effekt im wirklichen Leben gemessen werden?',
|
|
42
|
+
answer: 'Ja. Die Zeitdilatation wurde mit schnellen Teilchen, auf Flugzeugen mitgeführten Atomuhren, Satellitennavigationssystemen und Teilchenbeschleunigern gemessen. Das Zwillingsparadoxon verwendet eine extreme Reisegeschichte, aber der zugrunde liegende Uhreneffekt ist ein routinemäßig bestätigter Bestandteil der modernen Physik.',
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
export const content: ToolLocaleContent = {
|
|
47
|
+
slug,
|
|
48
|
+
title,
|
|
49
|
+
description,
|
|
50
|
+
ui: {
|
|
51
|
+
visualTitle: 'Raumzeit-Visualisierung des Zwillingsparadoxons',
|
|
52
|
+
controlsTitle: 'Steuerung des Zwillingsparadoxons',
|
|
53
|
+
worldlineLabel: 'Weltliniendiagramm für den Erdzwilling und den reisenden Zwilling',
|
|
54
|
+
earthTwin: 'Alter des Erdzwillings',
|
|
55
|
+
travelingTwin: 'Alter des Reisenden',
|
|
56
|
+
presetCruise: 'Reiseflug',
|
|
57
|
+
presetRelativistic: 'Relativistisch',
|
|
58
|
+
presetExtreme: 'Extrem',
|
|
59
|
+
velocityLabel: 'Schiffsgeschwindigkeit',
|
|
60
|
+
earthYearsLabel: 'Vergangene Zeit auf der Erde',
|
|
61
|
+
ageGapLabel: 'Altersunterschied bei der Rückkehr',
|
|
62
|
+
gammaLabel: 'Lorentzfaktor',
|
|
63
|
+
shipTimeLabel: 'Eigenzeit des Reisenden',
|
|
64
|
+
distanceLabel: 'Entfernung bis zum Wendepunkt',
|
|
65
|
+
yearsUnit: 'Jahre',
|
|
66
|
+
yearsShortUnit: 'Jahre',
|
|
67
|
+
},
|
|
68
|
+
seo: [
|
|
69
|
+
{
|
|
70
|
+
type: 'title',
|
|
71
|
+
text: 'Zwillingsparadoxon Rechner für die Spezielle Relativitätstheorie',
|
|
72
|
+
level: 2,
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
type: 'paragraph',
|
|
76
|
+
html: 'Der Zwillingsparadoxon Visualisierer verwandelt eine der berühmtesten Ideen der speziellen Relativitätstheorie in ein interaktives Raumzeitdiagramm. Stellen Sie eine Raumschiffgeschwindigkeit als Bruchteil der Lichtgeschwindigkeit ein, wählen Sie, wie viele Jahre auf der Erde vergehen, und der Rechner berechnet den Lorentzfaktor, die Eigenzeit des Reisenden, den Altersunterschied bei der Wiedervereinigung und die Entfernung bis zum Wendepunkt. Das visuelle Layout trennt die Erduhr von der Raumschiffuhr, sodass die Asymmetrie sichtbar wird, anstatt in Formeln versteckt zu sein.',
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
type: 'title',
|
|
80
|
+
text: 'Wie die Berechnung funktioniert',
|
|
81
|
+
level: 3,
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
type: 'paragraph',
|
|
85
|
+
html: 'Die zentrale Größe ist der Lorentzfaktor: gamma = 1 / sqrt(1 - v^2 / c^2). Für eine einfache Hin- und Rückreise mit konstanter Reisegeschwindigkeit ist die vom Reisenden erlebte Zeit die Missionsdauer im Erdsystem geteilt durch gamma. Der Unterschied zwischen diesen beiden Dauern ist der Altersunterschied bei der Wiedervereinigung der Zwillinge. Das Tool zeigt auch die Entfernung im Erdsystem bis zum Wendepunkt an, die der Hälfte der gesamten Erdzeit multipliziert mit der Schiffsgeschwindigkeit in Lichtjahren pro Jahr entspricht.',
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
type: 'table',
|
|
89
|
+
headers: ['Geschwindigkeit', 'Lorentzfaktor', 'Taktrate des Reisenden', 'Physikalische Bedeutung'],
|
|
90
|
+
rows: [
|
|
91
|
+
['0.50c', '1.155', '86.6% der Erdrate', 'Ein spürbarer, aber moderater relativistischer Effekt.'],
|
|
92
|
+
['0.86c', '1.960', '51.0% der Erdrate', 'Der Reisende altert während des Reiseflugs etwa halb so schnell.'],
|
|
93
|
+
['0.98c', '5.025', '19.9% der Erdrate', 'Extreme Zeitdilatation dominiert das Missionsergebnis.'],
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
type: 'title',
|
|
98
|
+
text: 'Warum die Situation nicht symmetrisch ist',
|
|
99
|
+
level: 3,
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
type: 'paragraph',
|
|
103
|
+
html: 'Auf den ersten Blick kann jeder Zwilling sagen, der andere bewege sich, was das Ergebnis widersprüchlich erscheinen lässt. Die Auflösung ist, dass der Erdzwilling näherungsweise in einem Inertialsystem verbleibt, während der reisende Zwilling aufbricht, die Richtung umkehrt und zurückkehrt. Dieser Wechsel des Inertialsystems führt zu einem anderen Pfad durch die Raumzeit für den Reisenden. Die vom Tool gezeichnete Weltlinie knickt am Wendepunkt ab, während die Weltlinie des Erdzwillings gerade bleibt.',
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
type: 'title',
|
|
107
|
+
text: 'Das Weltliniendiagramm lesen',
|
|
108
|
+
level: 3,
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
type: 'paragraph',
|
|
112
|
+
html: 'Eine Weltlinie ist eine Karte eines Objekts durch die Raumzeit und nicht nur durch den Raum. In diesem Visualisierer stellt die vertikale Erdinie den Zwilling dar, der zu Hause bleibt. Der abgewinkelte rote Pfad stellt den Reisenden dar, der die Erde verlässt und zurückkehrt. Höhere Geschwindigkeiten lassen den Reisepfad dramatischer abknicken und verringern die auf der Raumschiffuhr angesammelte Eigenzeit.',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
type: 'list',
|
|
116
|
+
items: [
|
|
117
|
+
'<strong>Altersunterschied:</strong> wie viel jünger der Reisende bei der Wiedervereinigung ist.',
|
|
118
|
+
'<strong>Lorentzfaktor:</strong> der Multiplikator, der die Zeit im Erdsystem mit der Eigenzeit des Reisenden verknüpft.',
|
|
119
|
+
'<strong>Eigenzeit des Reisenden:</strong> die tatsächlich vergangene Zeit, gemessen von einer Uhr an Bord des Raumschiffs.',
|
|
120
|
+
'<strong>Entfernung bis zum Wendepunkt:</strong> die Entfernung im Erdsystem, bevor der Reisende die Richtung umkehrt.',
|
|
121
|
+
],
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
type: 'title',
|
|
125
|
+
text: 'Praktische Beweise für die Zeitdilatation',
|
|
126
|
+
level: 3,
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
type: 'paragraph',
|
|
130
|
+
html: 'Das Zwillingsparadoxon ist ein klares Gedankenexperiment, aber die Zeitdilatation ist nicht spekulativ. Myonen, die in der oberen Atmosphäre entstehen, überleben lange genug, um den Boden zu erreichen, weil ihre bewegten Uhren aus Erdsicht dilatiert sind. Atomuhrexperimente in Flugzeugen und präzise Satellitennavigation erfordern ebenfalls relativistische Korrekturen. Dieselbe Mathematik, die hinter diesem Visualisierer steckt, ist Teil der Zeitmessinfrastruktur moderner GPS-Systeme.',
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
faq,
|
|
134
|
+
bibliography,
|
|
135
|
+
howTo,
|
|
136
|
+
schemas: [
|
|
137
|
+
{
|
|
138
|
+
'@context': 'https://schema.org',
|
|
139
|
+
'@type': 'SoftwareApplication',
|
|
140
|
+
name: title,
|
|
141
|
+
description,
|
|
142
|
+
applicationCategory: 'ScientificApplication',
|
|
143
|
+
operatingSystem: 'Any',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
'@context': 'https://schema.org',
|
|
147
|
+
'@type': 'FAQPage',
|
|
148
|
+
mainEntity: faq.map((item) => ({
|
|
149
|
+
'@type': 'Question',
|
|
150
|
+
name: item.question,
|
|
151
|
+
acceptedAnswer: {
|
|
152
|
+
'@type': 'Answer',
|
|
153
|
+
text: item.answer,
|
|
154
|
+
},
|
|
155
|
+
})),
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
'@context': 'https://schema.org',
|
|
159
|
+
'@type': 'HowTo',
|
|
160
|
+
name: title,
|
|
161
|
+
step: howTo.map((step) => ({
|
|
162
|
+
'@type': 'HowToStep',
|
|
163
|
+
name: step.name,
|
|
164
|
+
text: step.text,
|
|
165
|
+
})),
|
|
166
|
+
},
|
|
167
|
+
],
|
|
168
|
+
};
|