debian-skyfield/skyfield/trigonometry.py

57 lines
2.2 KiB
Python

"""Routines whose currency is Angle objects."""
from numpy import arctan2, sin, cos, tan
from skyfield.constants import tau
from skyfield.units import Angle
def position_angle_of(anglepair1, anglepair2):
"""Return the position angle of one position with respect to another.
Each argument should be a tuple whose first two items are
:class:`~skyfield.units.Angle` objects, like the tuples returned by
:meth:`~skyfield.positionlib.ICRF.radec()`,
:meth:`~skyfield.positionlib.ICRF.ecliptic_latlon()`, and
:meth:`~skyfield.positionlib.Apparent.altaz()`.
If one of the two angle items is signed (if its ``.signed``
attribute is true), then that angle is used as the latitude and the
other as the longitude; otherwise the first argument is assumed to
be the latitude.
If the longitude has a ``.preference`` attribute of ``'hours'``, it
is assumed to be a right ascension which is positive towards the
east. The position angle returned will be 0 degrees if position #2
is directly north of position #1 on the celestial sphere, 90 degrees
if east, 180 if south, and 270 if west.
Otherwise, the longitude is assumed to be azimuth, which measures
north to east around the horizon. The position angle returned will
be 0 degrees if position #2 is directly above position #1 in the
sky, 90 degrees to its left, 180 if below, and 270 if to the right.
>>> from skyfield.trigonometry import position_angle_of
>>> from skyfield.units import Angle
>>> a = Angle(degrees=0), Angle(degrees=0)
>>> b = Angle(degrees=1), Angle(degrees=1)
>>> position_angle_of(a, b)
<Angle 315deg 00' 15.7">
"""
lat1, lon1 = anglepair1[0], anglepair1[1]
if lon1.signed:
lat1, lon1 = lon1, lat1
lat2, lon2 = anglepair2[0], anglepair2[1]
if lon2.signed:
lat2, lon2 = lon2, lat2
lat1 = lat1.radians
lon1 = lon1.radians if lon1.preference == 'hours' else -lon1.radians
lat2 = lat2.radians
lon2 = lon2.radians if lon2.preference == 'hours' else -lon2.radians
return Angle(radians=arctan2(
sin(lon2 - lon1),
cos(lat1) * tan(lat2) - sin(lat1) * cos(lon2 - lon1),
) % tau)