Source code for stellium.utils.houses
"""House calculation utilities."""
[docs]
def find_house_for_longitude(longitude: float, cusps: tuple[float, ...]) -> int:
"""
Find which house a longitude falls into.
This function determines which of the 12 houses a given ecliptic longitude
occupies, based on the house cusp positions. It correctly handles houses
that wrap around the 360°/0° boundary.
Args:
longitude: Ecliptic longitude in degrees (0-360°)
cusps: Tuple of 12 house cusp longitudes (in degrees)
Returns:
House number (1-12)
Example:
>>> cusps = (0.0, 30.0, 60.0, 90.0, 120.0, 150.0,
... 180.0, 210.0, 240.0, 270.0, 300.0, 330.0)
>>> find_house_for_longitude(45.0, cusps)
2
>>> find_house_for_longitude(355.0, cusps) # Wraps around
12
Note:
A planet at the exact cusp belongs to the house it's entering,
not the one it's leaving. The logic uses cusp_start <= longitude < cusp_end.
"""
for i in range(12):
cusp_start = cusps[i]
cusp_end = cusps[(i + 1) % 12]
# Handle houses that wrap around 360°/0°
if cusp_start < cusp_end:
# Normal case: cusp doesn't wrap (e.g., 30° to 60°)
if cusp_start <= longitude < cusp_end:
return i + 1
else:
# Wraps around 0° (e.g., 350° to 10°)
if longitude >= cusp_start or longitude < cusp_end:
return i + 1
# Fallback (should never happen with valid cusps)
# If we get here, return house 1 as a safe default
return 1