Skip to content

Commit

Permalink
Merge 709146f into 0289a4f
Browse files Browse the repository at this point in the history
  • Loading branch information
Deuchnord committed Aug 15, 2021
2 parents 0289a4f + 709146f commit 5845fe8
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 3 deletions.
8 changes: 8 additions & 0 deletions kosmorrolib/enum.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,14 @@ class EventType(Enum):
MOON_PERIGEE = 5
MOON_APOGEE = 6
SEASON_CHANGE = 7
LUNAR_ECLIPSE = 8


class LunarEclipseType(Enum):
"""An enumeration of lunar eclipse types"""
PENUMBRAL = 0
PARTIAL = 1
TOTAL = 2


class ObjectType(Enum):
Expand Down
58 changes: 55 additions & 3 deletions kosmorrolib/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,13 @@
from skyfield.errors import EphemerisRangeError
from skyfield.timelib import Time
from skyfield.searchlib import find_discrete, find_maxima, find_minima
from skyfield import almanac
from skyfield.units import Angle
from skyfield import almanac, eclipselib
from numpy import pi

from kosmorrolib.model import Event, Star, Planet, ASTERS
from kosmorrolib.model import Event, Star, Planet, ASTERS, EARTH
from kosmorrolib.dateutil import translate_to_timezone
from kosmorrolib.enum import EventType, ObjectIdentifier, SeasonType
from kosmorrolib.enum import EventType, ObjectIdentifier, SeasonType, LunarEclipseType
from kosmorrolib.exceptions import OutOfRangeDateError
from kosmorrolib.core import get_timescale, get_skf_objects, flatten_list

Expand Down Expand Up @@ -318,6 +319,56 @@ def _search_earth_season_change(
return events


def _search_lunar_eclipse(start_time: Time, end_time: Time, timezone: int) -> [Event]:
moon = ASTERS[1]
events = []
t, y, details = eclipselib.lunar_eclipses(start_time, end_time, get_skf_objects())

for ti, yi in zip(t, y):
penumbra_radius = Angle(radians=details['penumbra_radius_radians'][0])
_, max_lon, _ = EARTH.get_skyfield_object().at(ti).observe(moon.get_skyfield_object()).apparent().ecliptic_latlon()
print("max_lon : %s" % max_lon.radians)

def is_in_penumbra(time: Time):
_, lon, _ = EARTH.get_skyfield_object() \
.at(time) \
.observe(moon.get_skyfield_object()) \
.apparent() \
.ecliptic_latlon()

print("lon : %s" % lon.radians)

moon_radius = Angle(degrees=moon.get_apparent_radius(time, EARTH.get_skyfield_object())).radians
print("moon_radius : %s" % moon_radius.radians)

return abs(max_lon.radians - lon.radians) < penumbra_radius.radians + moon_radius

is_in_penumbra.rough_period = 60.

print("START")
eclipse_start, _ = find_discrete(start_time, ti, is_in_penumbra)
print("END")
eclipse_end, blob = find_discrete(ti, end_time, is_in_penumbra)

print(end_time.utc_datetime())

print("Start: %s // End: %s" % (eclipse_start.utc_datetime()[0], eclipse_end.utc_datetime()[0]))

events.append(Event(
EventType.LUNAR_ECLIPSE,
[moon],
start_time=translate_to_timezone(ti.utc_datetime(), timezone),
end_time=translate_to_timezone(ti.utc_datetime(), timezone),
details={'type': LunarEclipseType(yi), 'maximum': translate_to_timezone(ti.utc_datetime(), timezone)}
))

print(ti.utc_strftime('%Y-%m-%d %H:%M'),
'y={}'.format(yi),
eclipselib.LUNAR_ECLIPSES[yi])

return events


def get_events(for_date: date = date.today(), timezone: int = 0) -> [Event]:
"""Calculate and return a list of events for the given date, adjusted to the given timezone if any.
Expand Down Expand Up @@ -363,6 +414,7 @@ def get_events(for_date: date = date.today(), timezone: int = 0) -> [Event]:
_search_moon_apogee,
_search_moon_perigee,
_search_earth_season_change,
_search_lunar_eclipse,
]:
found_events.append(fun(start_time, end_time, timezone))

Expand Down

0 comments on commit 5845fe8

Please sign in to comment.