1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/************************************************************************
285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Copyright (C) 1996-2008, International Business Machines Corporation *
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * and others. All Rights Reserved.                                     *
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ************************************************************************
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *  2003-nov-07   srl       Port from Java
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef ASTRO_H
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define ASTRO_H
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "gregoimp.h"  // for Math
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/unistr.h"
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * <code>CalendarAstronomer</code> is a class that can perform the calculations to
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * determine the positions of the sun and moon, the time of sunrise and
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * sunset, and other astronomy-related data.  The calculations it performs
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * are in some cases quite complicated, and this utility class saves you
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * the trouble of worrying about them.
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * <p>
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * The measurement of time is a very important part of astronomy.  Because
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * astronomical bodies are constantly in motion, observations are only valid
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * at a given moment in time.  Accordingly, each <code>CalendarAstronomer</code>
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * object has a <code>time</code> property that determines the date
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * and time for which its calculations are performed.  You can set and
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * retrieve this property with {@link #setDate setDate}, {@link #getDate getDate}
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * and related methods.
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * <p>
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Almost all of the calculations performed by this class, or by any
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * astronomer, are approximations to various degrees of accuracy.  The
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * calculations in this class are mostly modelled after those described
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * in the book
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * <a href="http://www.amazon.com/exec/obidos/ISBN=0521356997" target="_top">
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Practical Astronomy With Your Calculator</a>, by Peter J.
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Duffett-Smith, Cambridge University Press, 1990.  This is an excellent
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * book, and if you want a greater understanding of how these calculations
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * are performed it a very good, readable starting point.
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * <p>
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * <strong>WARNING:</strong> This class is very early in its development, and
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * it is highly likely that its API will change to some degree in the future.
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * At the moment, it basically does just enough to support {@link IslamicCalendar}
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * and {@link ChineseCalendar}.
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @author Laura Werner
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @author Alan Liu
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass U_I18N_API CalendarAstronomer : public UMemory {
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  // some classes
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Represents the position of an object in the sky relative to the ecliptic,
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * the plane of the earth's orbit around the Sun.
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * This is a spherical coordinate system in which the latitude
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * specifies the position north or south of the plane of the ecliptic.
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * The longitude specifies the position along the ecliptic plane
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * relative to the "First Point of Aries", which is the Sun's position in the sky
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * at the Vernal Equinox.
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * <p>
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Note that Ecliptic objects are immutable and cannot be modified
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * once they are constructed.  This allows them to be passed and returned by
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * value without worrying about whether other code will modify them.
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see CalendarAstronomer.Equatorial
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see CalendarAstronomer.Horizon
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  class U_I18N_API Ecliptic : public UMemory {
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  public:
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Constructs an Ecliptic coordinate object.
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * <p>
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @param lat The ecliptic latitude, measured in radians.
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @param lon The ecliptic longitude, measured in radians.
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @internal
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Ecliptic(double lat = 0, double lon = 0) {
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      latitude = lat;
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      longitude = lon;
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Setter for Ecliptic Coordinate object
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @param lat The ecliptic latitude, measured in radians.
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @param lon The ecliptic longitude, measured in radians.
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @internal
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void set(double lat, double lon) {
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      latitude = lat;
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      longitude = lon;
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Return a string representation of this object
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @internal
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString toString() const;
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * The ecliptic latitude, in radians.  This specifies an object's
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * position north or south of the plane of the ecliptic,
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * with positive angles representing north.
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @internal
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    double latitude;
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * The ecliptic longitude, in radians.
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * This specifies an object's position along the ecliptic plane
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * relative to the "First Point of Aries", which is the Sun's position
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * in the sky at the Vernal Equinox,
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * with positive angles representing east.
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * <p>
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * A bit of trivia: the first point of Aries is currently in the
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * constellation Pisces, due to the precession of the earth's axis.
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @internal
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    double longitude;
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  };
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Represents the position of an
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * object in the sky relative to the plane of the earth's equator.
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * The <i>Right Ascension</i> specifies the position east or west
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * along the equator, relative to the sun's position at the vernal
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * equinox.  The <i>Declination</i> is the position north or south
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * of the equatorial plane.
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * <p>
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Note that Equatorial objects are immutable and cannot be modified
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * once they are constructed.  This allows them to be passed and returned by
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * value without worrying about whether other code will modify them.
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see CalendarAstronomer.Ecliptic
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see CalendarAstronomer.Horizon
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  class U_I18N_API Equatorial : public UMemory {
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  public:
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Constructs an Equatorial coordinate object.
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * <p>
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @param asc The right ascension, measured in radians.
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @param dec The declination, measured in radians.
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @internal
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Equatorial(double asc = 0, double dec = 0)
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      : ascension(asc), declination(dec) { }
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Setter
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @param asc The right ascension, measured in radians.
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @param dec The declination, measured in radians.
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @internal
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void set(double asc, double dec) {
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ascension = asc;
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      declination = dec;
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Return a string representation of this object, with the
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * angles measured in degrees.
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @internal
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString toString() const;
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Return a string representation of this object with the right ascension
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * measured in hours, minutes, and seconds.
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @internal
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    //String toHmsString() {
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    //return radToHms(ascension) + "," + radToDms(declination);
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    //}
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * The right ascension, in radians.
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * This is the position east or west along the equator
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * relative to the sun's position at the vernal equinox,
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * with positive angles representing East.
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @internal
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    double ascension;
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * The declination, in radians.
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * This is the position north or south of the equatorial plane,
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * with positive angles representing north.
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @internal
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    double declination;
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  };
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Represents the position of an  object in the sky relative to
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * the local horizon.
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * The <i>Altitude</i> represents the object's elevation above the horizon,
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * with objects below the horizon having a negative altitude.
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * The <i>Azimuth</i> is the geographic direction of the object from the
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * observer's position, with 0 representing north.  The azimuth increases
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * clockwise from north.
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * <p>
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Note that Horizon objects are immutable and cannot be modified
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * once they are constructed.  This allows them to be passed and returned by
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * value without worrying about whether other code will modify them.
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see CalendarAstronomer.Ecliptic
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see CalendarAstronomer.Equatorial
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  class U_I18N_API Horizon : public UMemory {
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  public:
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Constructs a Horizon coordinate object.
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * <p>
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @param alt  The altitude, measured in radians above the horizon.
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @param azim The azimuth, measured in radians clockwise from north.
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @internal
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Horizon(double alt=0, double azim=0)
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      : altitude(alt), azimuth(azim) { }
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Setter for Ecliptic Coordinate object
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @param alt  The altitude, measured in radians above the horizon.
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @param azim The azimuth, measured in radians clockwise from north.
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @internal
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void set(double alt, double azim) {
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      altitude = alt;
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      azimuth = azim;
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Return a string representation of this object, with the
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * angles measured in degrees.
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @internal
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString toString() const;
248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * The object's altitude above the horizon, in radians.
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @internal
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    double altitude;
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * The object's direction, in radians clockwise from north.
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @internal
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    double azimuth;
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  };
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //-------------------------------------------------------------------------
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  // Assorted private data used for conversions
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //-------------------------------------------------------------------------
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  // My own copies of these so compilers are more likely to optimize them away
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  static const double PI;
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * The average number of solar days from one new moon to the next.  This is the time
272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * it takes for the moon to return the same ecliptic longitude as the sun.
273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * It is longer than the sidereal month because the sun's longitude increases
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * during the year due to the revolution of the earth around the sun.
275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Approximately 29.53.
276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see #SIDEREAL_MONTH
278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @deprecated ICU 2.4. This class may be removed or modified.
280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  static const double SYNODIC_MONTH;
282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //-------------------------------------------------------------------------
284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  // Constructors
285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //-------------------------------------------------------------------------
286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Construct a new <code>CalendarAstronomer</code> object that is initialized to
289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * the current date and time.
290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  CalendarAstronomer();
293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Construct a new <code>CalendarAstronomer</code> object that is initialized to
296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * the specified date and time.
297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  CalendarAstronomer(UDate d);
300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Construct a new <code>CalendarAstronomer</code> object with the given
303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * latitude and longitude.  The object's time is set to the current
304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * date and time.
305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * <p>
306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @param longitude The desired longitude, in <em>degrees</em> east of
307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *                  the Greenwich meridian.
308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @param latitude  The desired latitude, in <em>degrees</em>.  Positive
310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *                  values signify North, negative South.
311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see java.util.Date#getTime()
313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  CalendarAstronomer(double longitude, double latitude);
316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Destructor
319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  ~CalendarAstronomer();
322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //-------------------------------------------------------------------------
324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  // Time and date getters and setters
325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //-------------------------------------------------------------------------
326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Set the current date and time of this <code>CalendarAstronomer</code> object.  All
329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * astronomical calculations are performed based on this time setting.
330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @param aTime the date and time, expressed as the number of milliseconds since
332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *              1/1/1970 0:00 GMT (Gregorian).
333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see #setDate
335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see #getTime
336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  void setTime(UDate aTime);
339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Set the current date and time of this <code>CalendarAstronomer</code> object.  All
343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * astronomical calculations are performed based on this time setting.
344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @param aTime the date and time, expressed as the number of milliseconds since
346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *              1/1/1970 0:00 GMT (Gregorian).
347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see #getTime
349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  void setDate(UDate aDate) { setTime(aDate); }
352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Set the current date and time of this <code>CalendarAstronomer</code> object.  All
355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * astronomical calculations are performed based on this time setting.
356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @param jdn   the desired time, expressed as a "julian day number",
358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *              which is the number of elapsed days since
359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *              1/1/4713 BC (Julian), 12:00 GMT.  Note that julian day
360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *              numbers start at <em>noon</em>.  To get the jdn for
361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *              the corresponding midnight, subtract 0.5.
362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see #getJulianDay
364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see #JULIAN_EPOCH_MS
365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  void setJulianDay(double jdn);
368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Get the current time of this <code>CalendarAstronomer</code> object,
371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * represented as the number of milliseconds since
372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * 1/1/1970 AD 0:00 GMT (Gregorian).
373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see #setTime
375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see #getDate
376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UDate getTime();
379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Get the current time of this <code>CalendarAstronomer</code> object,
382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * expressed as a "julian day number", which is the number of elapsed
383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * days since 1/1/4713 BC (Julian), 12:00 GMT.
384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see #setJulianDay
386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see #JULIAN_EPOCH_MS
387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double getJulianDay();
390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Return this object's time expressed in julian centuries:
393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * the number of centuries after 1/1/1900 AD, 12:00 GMT
394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see #getJulianDay
396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double getJulianCentury();
399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Returns the current Greenwich sidereal time, measured in hours
402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double getGreenwichSidereal();
405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruprivate:
407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double getSiderealOffset();
408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Returns the current local sidereal time, measured in hours
411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double getLocalSidereal();
414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Converts local sidereal time to Universal Time.
417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @param lst   The Local Sidereal Time, in hours since sidereal midnight
419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *              on this object's current date.
420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @return      The corresponding Universal Time, in milliseconds since
422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *              1 Jan 1970, GMT.
423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //private:
425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double lstToUT(double lst);
426ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Convert from ecliptic to equatorial coordinates.
430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @param ecliptic     The ecliptic
432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @param result       Fillin result
433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @return reference to result
434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  Equatorial& eclipticToEquatorial(Equatorial& result, const Ecliptic& ecliptic);
436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Convert from ecliptic to equatorial coordinates.
439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @param eclipLong     The ecliptic longitude
441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @param eclipLat      The ecliptic latitude
442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @return              The corresponding point in equatorial coordinates.
444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  Equatorial& eclipticToEquatorial(Equatorial& result, double eclipLong, double eclipLat);
447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Convert from ecliptic longitude to equatorial coordinates.
450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @param eclipLong     The ecliptic longitude
452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @return              The corresponding point in equatorial coordinates.
454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  Equatorial& eclipticToEquatorial(Equatorial& result, double eclipLong) ;
457ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
459ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  Horizon& eclipticToHorizon(Horizon& result, double eclipLong) ;
462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //-------------------------------------------------------------------------
464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  // The Sun
465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //-------------------------------------------------------------------------
466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * The longitude of the sun at the time specified by this object.
469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * The longitude is measured in radians along the ecliptic
470ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * from the "first point of Aries," the point at which the ecliptic
471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * crosses the earth's equatorial plane at the vernal equinox.
472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * <p>
473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Currently, this method uses an approximation of the two-body Kepler's
474ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * equation for the earth and the sun.  It does not take into account the
475ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * perturbations caused by the other planets, the moon, etc.
476ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
477ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
478ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double getSunLongitude();
479ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
480ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
481ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * TODO Make this public when the entire class is package-private.
482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /*public*/ void getSunLongitude(double julianDay, double &longitude, double &meanAnomaly);
484ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
485ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * The position of the sun at this object's current date and time,
487ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * in equatorial coordinates.
488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @param result fillin for the result
489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  Equatorial& getSunPosition(Equatorial& result);
492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
494ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
495ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Constant representing the vernal equinox.
496ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * For use with {@link #getSunTime getSunTime}.
497ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Note: In this case, "vernal" refers to the northern hemisphere's seasons.
498ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
499ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
500ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//  static double VERNAL_EQUINOX();
501ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
502ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
503ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Constant representing the summer solstice.
504ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * For use with {@link #getSunTime getSunTime}.
505ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Note: In this case, "summer" refers to the northern hemisphere's seasons.
506ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
507ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
508ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  static double SUMMER_SOLSTICE();
509ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
510ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
511ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Constant representing the autumnal equinox.
512ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * For use with {@link #getSunTime getSunTime}.
513ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Note: In this case, "autumn" refers to the northern hemisphere's seasons.
514ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
515ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
516ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//  static double AUTUMN_EQUINOX();
517ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
518ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
519ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Constant representing the winter solstice.
520ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * For use with {@link #getSunTime getSunTime}.
521ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Note: In this case, "winter" refers to the northern hemisphere's seasons.
522ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
523ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
52485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  static double WINTER_SOLSTICE();
525ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
526ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
527ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Find the next time at which the sun's ecliptic longitude will have
528ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * the desired value.
529ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
530ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
531ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UDate getSunTime(double desired, UBool next);
532ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
533ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
534ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Returns the time (GMT) of sunrise or sunset on the local date to which
535ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * this calendar is currently set.
536ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
537ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * NOTE: This method only works well if this object is set to a
538ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * time near local noon.  Because of variations between the local
539ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * official time zone and the geographic longitude, the
540ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * computation can flop over into an adjacent day if this object
541ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * is set to a time near local midnight.
542ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
543ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
544ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
545ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UDate getSunRiseSet(UBool rise);
546ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
547ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //-------------------------------------------------------------------------
548ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  // The Moon
549ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //-------------------------------------------------------------------------
550ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
551ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
552ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * The position of the moon at the time set on this
553ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * object, in equatorial coordinates.
554ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
555ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @return const reference to internal field of calendar astronomer. Do not use outside of the lifetime of this astronomer.
556ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
557ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  const Equatorial& getMoonPosition();
558ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
559ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
560ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * The "age" of the moon at the time specified in this object.
561ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * This is really the angle between the
562ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * current ecliptic longitudes of the sun and the moon,
563ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * measured in radians.
564ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
565ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see #getMoonPhase
566ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
567ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
568ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double getMoonAge();
569ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
570ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
571ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Calculate the phase of the moon at the time set in this object.
572ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * The returned phase is a <code>double</code> in the range
573ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * <code>0 <= phase < 1</code>, interpreted as follows:
574ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * <ul>
575ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * <li>0.00: New moon
576ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * <li>0.25: First quarter
577ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * <li>0.50: Full moon
578ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * <li>0.75: Last quarter
579ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * </ul>
580ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
581ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see #getMoonAge
582ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
583ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
584ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double getMoonPhase();
585ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
586ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  class U_I18N_API MoonAge : public UMemory {
587ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  public:
588ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    MoonAge(double l)
589ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      :  value(l) { }
590ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void set(double l) { value = l; }
591ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    double value;
592ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  };
593ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
594ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
595ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Constant representing a new moon.
596ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * For use with {@link #getMoonTime getMoonTime}
597ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
598ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
59985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho  static const MoonAge NEW_MOON();
600ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
601ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
602ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Constant representing the moon's first quarter.
603ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * For use with {@link #getMoonTime getMoonTime}
604ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
605ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
606ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//  static const MoonAge FIRST_QUARTER();
607ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
608ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
609ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Constant representing a full moon.
610ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * For use with {@link #getMoonTime getMoonTime}
611ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
612ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
613ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  static const MoonAge FULL_MOON();
614ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
615ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
616ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Constant representing the moon's last quarter.
617ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * For use with {@link #getMoonTime getMoonTime}
618ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
619ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
620ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//  static const MoonAge LAST_QUARTER();
621ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
622ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
623ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Find the next or previous time at which the Moon's ecliptic
624ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * longitude will have the desired value.
625ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * <p>
626ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @param desired   The desired longitude.
627ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @param next      <tt>true</tt> if the next occurrance of the phase
628ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *                  is desired, <tt>false</tt> for the previous occurrance.
629ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
630ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
631ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UDate getMoonTime(double desired, UBool next);
632ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UDate getMoonTime(const MoonAge& desired, UBool next);
633ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
634ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
635ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Returns the time (GMT) of sunrise or sunset on the local date to which
636ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * this calendar is currently set.
637ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
638ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
639ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UDate getMoonRiseSet(UBool rise);
640ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
641ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //-------------------------------------------------------------------------
642ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  // Interpolation methods for finding the time at which a given event occurs
643ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //-------------------------------------------------------------------------
644ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
645ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  // private
646ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  class AngleFunc : public UMemory {
647ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  public:
648ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual double eval(CalendarAstronomer&) = 0;
649ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual ~AngleFunc();
650ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  };
651ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  friend class AngleFunc;
652ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
653ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UDate timeOfAngle(AngleFunc& func, double desired,
654ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    double periodDays, double epsilon, UBool next);
655ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
656ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  class CoordFunc : public UMemory {
657ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  public:
658ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual void eval(Equatorial& result, CalendarAstronomer&) = 0;
659ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual ~CoordFunc();
660ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  };
661ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  friend class CoordFunc;
662ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
663ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double riseOrSet(CoordFunc& func, UBool rise,
664ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   double diameter, double refraction,
665ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   double epsilon);
666ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
667ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //-------------------------------------------------------------------------
668ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  // Other utility methods
669ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //-------------------------------------------------------------------------
670ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruprivate:
671ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
672ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
673ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Return the obliquity of the ecliptic (the angle between the ecliptic
674ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * and the earth's equator) at the current time.  This varies due to
675ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * the precession of the earth's axis.
676ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *
677ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @return  the obliquity of the ecliptic relative to the equator,
678ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   *          measured in radians.
679ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
680ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double eclipticObliquity();
681ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
682ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //-------------------------------------------------------------------------
683ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  // Private data
684ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //-------------------------------------------------------------------------
685ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruprivate:
686ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
687ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * Current time in milliseconds since 1/1/1970 AD
688ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @see java.util.Date#getTime
689ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
690ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UDate fTime;
691ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
692ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /* These aren't used yet, but they'll be needed for sunset calculations
693ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * and equatorial to horizon coordinate conversions
694ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
695ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double fLongitude;
696ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double fLatitude;
697ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double fGmtOffset;
698ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
699ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //
700ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  // The following fields are used to cache calculated results for improved
701ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  // performance.  These values all depend on the current time setting
702ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  // of this object, so the clearCache method is provided.
703ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  //
704ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
705ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double    julianDay;
706ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double    julianCentury;
707ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double    sunLongitude;
708ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double    meanAnomalySun;
709ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double    moonLongitude;
710ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double    moonEclipLong;
711ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double    meanAnomalyMoon;
712ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double    eclipObliquity;
713ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double    siderealT0;
714ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  double    siderealTime;
715ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
716ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  void clearCache();
717ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
718ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  Equatorial  moonPosition;
719ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UBool       moonPositionSet;
720ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
721ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
722ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * @internal
723ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
724ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//  UDate local(UDate localMillis);
725ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
726ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
727ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_END
728ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
729ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct UHashtable;
730ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
731ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN
732ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
733ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
734ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Cache of month -> julian day
735ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal
736ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
737ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass CalendarCache : public UMemory {
738ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
739ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  static int32_t get(CalendarCache** cache, int32_t key, UErrorCode &status);
740ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  static void put(CalendarCache** cache, int32_t key, int32_t value, UErrorCode &status);
741ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  virtual ~CalendarCache();
742ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruprivate:
743ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  CalendarCache(int32_t size, UErrorCode& status);
744ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  static void createCache(CalendarCache** cache, UErrorCode& status);
745ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  /**
746ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   * not implemented
747ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
748ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  CalendarCache();
749ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UHashtable *fTable;
750ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
751ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
752ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_END
753ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
754ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
755ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
756