Вычислите наклон лунного серпа

Можно ли рассчитать наклон лунного серпа с помощью Skyfield? Или напрямую? Я знаю, что полумесяц качается взад и вперед, и я хотел бы отобразить его правильно.

https://www.calsky.com/cs.cgi/Moon/15?obs=4311082095747103&c=

# https://rhodesmill.org/skyfield/toc.html 
from skyfield import api

tmsc = api.load.timescale()
planets = api.load('de421.bsp')

import datetime
import pytz

toposloc = api.Topos('50.9409116 N', '6.9576131 E') # Köln local position on earth
toposabs = planets['earth'] + toposloc # absolute position incl earth 
DTUTC = datetime.datetime.now(datetime.timezone.utc)

# calc moon
astro = toposabs.at(tmsc.utc(DTUTC.year, DTUTC.month, DTUTC.day, DTUTC.hour, DTUTC.minute, DTUTC.second)).observe(planets['moon'])
app = astro.apparent()
alt, azi, distance = app.altaz()
altazmoon=[alt.degrees, azi.degrees] # save for later
_, lonmoon, _ = app.ecliptic_latlon()

person SirDagen    schedule 04.12.2019    source источник
comment
Вдохновленный вашим вопросом, следующий выпуск Skyfield будет включать функцию, которая вычисляет для вас угол положения. Вот предварительный просмотр документации, в которой показано, как использовать эту функцию: -это-солнце-полумесяц" rel="nofollow noreferrer">github.com/skyfielders/python-skyfield/blob/   -  person Brandon Rhodes    schedule 06.12.2019
comment
О, вы разработчик Skyfield. Как приятно познакомиться. Также спасибо за это новое дополнение. Мне очень-очень нравится Скайфилд.   -  person SirDagen    schedule 07.12.2019


Ответы (1)


Хорошо, благодаря рекомендациям stackoverflows я нашел здесь этот ответ, который может быть тем, что я ищу

Вычисление вращения лица луны как функции Земные координаты

В настоящее время я тестирую это. По крайней мере, на сегодняшний день это выглядит очень точно, если я смотрю в окно. Путь!

[править:] Я тестировал его уже неделю и обновил приведенный ниже код. Теперь вроде все на месте. Спасибо

import math

def moontilt(altazsun, altazmoon): # mathematical angle where the sun light shines from onto the moon disc (measured from 3 o’clock anticlockwise)
    dLon = math.radians(altazsun[1]-altazmoon[1])
    radaltsun = math.radians(altazsun[0])
    radaltmoon = math.radians(altazmoon[0])
    cosaltsun = math.cos(radaltsun)
    y = math.sin(dLon) * cosaltsun
    x = math.cos(radaltmoon) * math.sin(radaltsun) - math.sin(radaltmoon) * cosaltsun * math.cos(dLon)
    brng = math.atan2(y, x)
    return 90-math.degrees(brng) 

# calc sun
astro = toposabs.at(tmsc.utc(DTUTC.year, DTUTC.month, DTUTC.day, DTUTC.hour, DTUTC.minute, DTUTC.second)).observe(planets['sun'])
app = astro.apparent()
alt, azi, distance = app.altaz()
altazsun=[alt.degrees, azi.degrees] # save for later
_, lonsun, _ = app.ecliptic_latlon()

# get moon phase
moonphase = ((lonmoon.degrees - lonsun.degrees) % 360.0) / 360 #  0: new moon, 0.5: full moon, 1: new moon

# this should be the tilt from the standard displaying symbols in degrees of the crescent I draw with PIL
tilt=-moontilt(altazsun, altazmoon) # PIL.ImageDraw.Draw.chord measures angles increasing clockwise. Thus minus
if moonphase>0.5: tilt+=180 # after full moon the light is expected to shine from the opposite side of the moon (which is already taken into account in the standard moon icons)
person SirDagen    schedule 04.12.2019
comment
Если это поможет упростить ваш код, обратите внимание, что alt.radians и azi.radians дадут вам радианы напрямую и позволят вам избежать вызовов math.radians. (Но, может быть, вы предпочитаете значения, которые имеют смысл, если вам нужно распечатать их во время отладки?) - person Brandon Rhodes; 05.12.2019
comment
Большое спасибо, что указали на это, Брэндон. Наверняка имеет смысл работать в rad. (Моя программа все еще находится в экспериментальном состоянии, и в настоящее время мне проще работать в степенях.) - person SirDagen; 05.12.2019