ephem.Angle¶
PyEphem measures all angles in radians.
But rather than simply returning angles as bare Python floats,
it returns each of them as an ephem.Angle
which can print itself out in a more attractive format
than do raw floating-point numbers.
The vast majority of angles print as degrees. For example, the declination of Jupiter will print itself attractively as degrees, minutes of arc, and seconds of arc:
>>> import ephem
>>> j = ephem.Jupiter('1994/7/16 20:13:16')
>>> print(j.dec)
-12:09:28.2
But the real value is always in radians,
which you can view by using repr()
:
print repr(j.dec) # => -0.21219402907256785
Since its numeric value is in radians, printing the angle as degrees requires an extra step to convert the units.
>>> from math import pi
>>> print('Degrees: {:.4f}'.format(j.dec / pi * 180.0))
Degrees: -12.1578
The only kind of angle which does not use degrees for display is right ascension, which instead traditionally breaks the celestial equator into twenty-four “hours” which are each fifteen degress wide.
>>> print(j.ra)
14:12:45.77
As with PyEphem dates, doing math with a PyEphem angle results in an unadorned float in radians being returned.
>>> type(j.dec).__name__
'Angle'
>>> a = j.dec + 3.14
>>> type(a).__name__
'float'
Setting angles follows the same rules: a float is interpreted as radians while a string is parsed as degrees or hours, as appropriate.
>>> print(ephem.degrees('45.0'))
45:00:00.0
>>> print(ephem.degrees(3.141593))
180:00:00.1
If you want to display the result of a computation
as an attractively formatted angle,
you can convert the float back to a PyEphem angle type
using either the degrees()
function
or, for right ascension, the hours()
function.
For example,
here are the results of adding fifteen degrees
to both Jupiter’s declination and right ascension;
whereas the declination simply moves north by fifteen degrees
(passing north across the celestial equator into positive numbers),
the right ascension calls fifteen additional degrees “one hour” of motion:
>>> import math
>>> fifteen_degrees = ephem.degrees(math.pi / 12.)
>>> print('%s %s' % (j.dec, ephem.degrees(j.dec + fifteen_degrees)))
-12:09:28.2 2:50:31.8
>>> print('%s %s' % (j.ra, ephem.hours(j.ra + fifteen_degrees)))
14:12:45.77 15:12:45.77
Often when adding or subtracting with angles,
you will get a very large or small result
that you will want to normalize back to a respectable angle.
PyEphem angles offer two ways to make this convenient:
a norm
attribute that returns the angle
normalized to the interval [0, 2π)
and a znorm
attribute that returns the angle
normalized to the interval (-π, π] centered on zero.
>>> circle = 2 * math.pi
>>> a = + fifteen_degrees
>>> print('%s %s %s' % (a, a.norm, a.znorm))
15:00:00.0 15:00:00.0 15:00:00.0
>>> a = - fifteen_degrees
>>> print('%s %s %s' % (a, a.norm, a.znorm))
-15:00:00.0 345:00:00.0 -15:00:00.0
>>> a = ephem.degrees(circle - fifteen_degrees)
>>> print('%s %s %s' % (a, a.norm, a.znorm))
345:00:00.0 345:00:00.0 -15:00:00.0
>>> a = ephem.degrees(circle + fifteen_degrees)
>>> print('%s %s %s' % (a, a.norm, a.znorm))
375:00:00.0 15:00:00.0 15:00:00.0
>>> a = ephem.degrees(- circle + fifteen_degrees)
>>> print('%s %s %s' % (a, a.norm, a.znorm))
-345:00:00.0 15:00:00.0 15:00:00.0
>>> a = ephem.degrees(- circle - fifteen_degrees)
>>> print('%s %s %s' % (a, a.norm, a.znorm))
-375:00:00.0 345:00:00.0 -15:00:00.0
Note that you cannot instantiate a raw Angle
:
>>> ephem.Angle()
Traceback (most recent call last):
...
TypeError: you can only create an ephem.Angle through ephem.degrees() or ephem.hours()