LCOV - code coverage report
Current view: top level - intl/icu/source/i18n - astro.h (source / functions) Hit Total Coverage
Test: output.info Lines: 0 12 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 4 0.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.13