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()