Added an InternalError class to explicitly indicate that an exception occurs due to an internal assertion failure inside Astronomy Engine. Any InternalError should be considered a bug in Astronomy Engine, not a bug in calling code. Upon reviewing the code for searching moon phases, I discovered that there was inconsistent behavior in SearchMoonPhase. It was sometimes returning null, other times throwing an exception. Because the caller passes in `limitDays`, it makes sense to simply return `null` in any case where the search fails. This is to support callers that intentionally want to find whether or not a moon phase occurs in a given small window of time. Updated internal callers of SearchMoonPhase to throw an InternalError when they know they should always find an event. Internal function FindSeasonChange did not check to make sure SearchSunLongitude succeeded. There is no known case where this failure happens, but if it did, a null AstroTime would have been stored in SeasonsInfo. It is better to fail early with an explicit InternalError. Other miscellaneous C# code cleanup. In the Python code, I found a couple of `raise Error` that needed to be changed to `raise InternalError`.
Astronomy Engine examples in Python
Camera
Suppose you want to photograph the Moon, and you want to know what it will look like in the photo. Given a location on the Earth, and a date/time, this program calculates the orientation of the sunlit side of the Moon with respect to the top of your photo image. It assumes the camera faces directly toward the Moon's azimuth and tilts upward to its altitude angle above the horizon.
Constellation
This demo shows how to find what constellation a body is in at a given time. It also shows how to do a binary search to find the moment in time when a body moves across the border between constellations.
Culmination
Finds when the Sun, Moon, and planets reach their highest position in the sky on a given date, as seen by an observer at a specified location on the Earth. Culmination is also the moment a body crosses the meridian, the imaginary semicircle in the sky that passes from due north on the horizon, through the zenith (straight up), and then toward due south on the horizon.
Galactic to Horizontal Converter
A demonstration of how to convert galactic coordinates to horizontal coordinates. This could be useful for backyard radio astronomers who know the galactic coordinates of a distant radio source and want to aim a radio dish at it. Given the galactic coordinates, the geographic coordinates of the observer, and the date and time of the observation, this program shows how to obtain the altitude and azimuth to aim the dish at the radio source.
Horizon Intersection
This is a more advanced example. It shows how to use coordinate transforms to find where the ecliptic intersects with an observer's horizon at a given date and time.
Jupiter's Moons
Calculates the coordinates of Jupiter and its four major moons (Io, Europa, Ganymede, and Callisto) as seen from the Earth at a given date and time. This program illustrates how to correct for the delay caused by the time it takes for light to reach the Earth from the Jupiter system.
Lunar Angles
This is an example of how to implement your own custom search function using Astronomy Engine. This program searches for the next few times the Moon reaches a relative ecliptic longitude with respect to another body (as seen from the Earth) that is a multiple of 30 degrees.
Lunar Eclipse
Calculates details about the first 10 partial/total lunar eclipses after the given date and time.
Moon Phase Calculator
This example shows how to determine the Moon's current phase, and how to predict when the next few quarter phases will occur.
Positions
Calculates equatorial and horizontal coordinates of the Sun, Moon, and planets.
Rise/Set
Shows how to calculate sunrise, sunset, moonrise, and moonset times.
Seasons
Calculates the equinoxes and solstices for a given calendar year.
Triangulate
Given the geographic coordinates of two observers, and angular
directions they are looking in, determines geographic coordinates
of the point they are both looking at. This example demonstrates
use of the geoid functions VectorObserver and ObserverVector
that convert between geographic coordinates and vectors.
API Reference
Complete documentation for all the functions and types available in the Python version of Astronomy Engine.