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