Initial commit

This commit is contained in:
2026-04-16 17:52:59 +02:00
parent 14b92848c7
commit 872de743ad
18 changed files with 1104 additions and 13 deletions

94
src/planetarytime/body.py Normal file
View File

@@ -0,0 +1,94 @@
from __future__ import annotations
from enum import Enum
from planetarytime.moon import (
ARIEL,
CALLISTO,
DEIMOS,
ENCELADUS,
EUROPA,
GANYMEDE,
IO,
MIRANDA,
Moon,
OBERON,
PHOBOS,
TITAN,
TITANIA,
TRITON,
UMBRIEL,
)
class Body(Enum):
"""Planetary body in the Solar System."""
MERCURY = "Mercury"
VENUS = "Venus"
MARS = "Mars"
JUPITER = "Jupiter"
SATURN = "Saturn"
URANUS = "Uranus"
NEPTUNE = "Neptune"
@property
def rotation_hours(self) -> float:
"""Sidereal rotation period in Earth hours."""
return _ROTATION_HOURS[self]
@property
def orbital_hours(self) -> float:
"""Orbital period around the Sun in Earth hours."""
return _ORBITAL_HOURS[self]
@property
def hours_per_sol(self) -> int:
"""Number of hours in one sol (rotation period rounded to nearest hour)."""
return round(self.rotation_hours)
@property
def sols_per_year(self) -> int:
"""Number of sols in one planetary year (orbital period / rotation period, rounded)."""
return round(self.orbital_hours / self.rotation_hours)
@property
def display_name(self) -> str:
return self.value
def __getitem__(self, index: int) -> Moon:
"""Return the moon at the given index for this body."""
return _MOONS[self][index]
_ROTATION_HOURS: dict[Body, float] = {
Body.MERCURY: 1407.6,
Body.VENUS: 5832.5,
Body.MARS: 24.6,
Body.JUPITER: 9.9,
Body.SATURN: 10.7,
Body.URANUS: 17.2,
Body.NEPTUNE: 16.1,
}
# Orbital periods in Earth hours
_ORBITAL_HOURS: dict[Body, float] = {
Body.MERCURY: 87.97 * 24,
Body.VENUS: 224.70 * 24,
Body.MARS: 686.97 * 24,
Body.JUPITER: 4332.59 * 24,
Body.SATURN: 10759.22 * 24,
Body.URANUS: 30688.50 * 24,
Body.NEPTUNE: 60182.00 * 24,
}
# Moons per body, ordered by orbital distance from the planet
_MOONS: dict[Body, list[Moon]] = {
Body.MERCURY: [],
Body.VENUS: [],
Body.MARS: [PHOBOS, DEIMOS],
Body.JUPITER: [IO, EUROPA, GANYMEDE, CALLISTO],
Body.SATURN: [TITAN, ENCELADUS],
Body.URANUS: [MIRANDA, ARIEL, UMBRIEL, TITANIA, OBERON],
Body.NEPTUNE: [TRITON],
}