📄 astronomicalmath.hpp
字号:
//
// AstronomicalMath.hpp
//
// Copyright (C) 2006 Sophia Cradle Incorporated
#ifndef __ASTRONOMICAL_MATH_HPP
#define __ASTRONOMICAL_MATH_HPP
#include <SophiaFramework.hpp>
#include "Array.hpp"
#define ASTRONOMICALMATH_DEFAULT_H 0.0 // 娤應抧揰偺崅搙 (m) 偺婛掕抣
#define ASTRONOMICALMATH_DEFAULT_R 0.585556 // 戝婥嵎偺婛掕抣
#define ASTRONOMICALMATH_PI 3.141592653589793238462643383280
#define ASTRONOMICALMATH_EQ_EPS 1.0E-5 // 婡夿僀僾僔儘儞
#define ASTRONOMICALMATH_SUN_MOON_ANGLE_EPS 0.05 // 嶑偲傒側偡墿宱偺斖埻
SFMTYPEDEFCLASS(AstronomicalMath)
class AstronomicalMath {
SFMSEALCONSTRUCT(AstronomicalMath)
public:
SFMTYPEDEFCLASS(DateDuration)
// 擔晅僋儔僗
SFMTYPEDEFCLASS(Date)
class Date {
private:
mutable UInt16 _year;
mutable UInt16 _month;
mutable UInt16 _day;
mutable UInt16 _hour;
mutable UInt16 _minute;
mutable UInt16 _second;
Float64 _days; // 2001/01/01 00:00:00 (GMT) 偐傜偺宱夁擔悢
mutable Float64 _j2000; // J2000.0 偐傜偺宱夁儐儕僂僗擭
mutable Bool _dateUpdated; // 擔晅偑峏怴嵪傒偐偳偆偐
mutable Bool _j2000Updated; // J2000.0 偑峏怴嵪傒偐偳偆偐
public:
Void Set(UInt16 year, UInt16 month, UInt16 day, UInt16 hour, UInt16 minute, UInt16 second);
Void Set(SFXDateConstRef date);
Void Set(Float64 days);
Void Set(DateConstRef ob);
explicit Date(Void);
explicit Date(UInt16 year, UInt16 month, UInt16 day, UInt16 hour, UInt16 minute, UInt16 second);
explicit Date(SFXDateConstRef date);
explicit Date(Float64 days);
Date(DateConstRef ob);
virtual ~Date(Void);
DateConstRef operator=(SFXDateConstRef date);
DateConstRef operator=(DateConstRef ob);
UInt16 GetYear(Void) const;
UInt16 GetMonth(Void) const;
UInt16 GetDay(Void) const;
UInt16 GetHour(Void) const;
UInt16 GetMinute(Void) const;
UInt16 GetSecond(Void) const;
Float64 Get(Void) const;
Float64 GetJ2000Year(Void) const;
SFXDate GetSFXDate(Void) const;
static Date GetMidpoint(DateConstRef date1, DateConstRef date2);
Bool operator==(SFXDateConstRef date) const;
Bool operator==(DateConstRef date) const;
Bool operator!=(SFXDateConstRef date) const;
Bool operator!=(DateConstRef date) const;
Bool operator>=(SFXDateConstRef date) const;
Bool operator>=(DateConstRef date) const;
Bool operator>(SFXDateConstRef date) const;
Bool operator>(DateConstRef date) const;
Bool operator<=(SFXDateConstRef date) const;
Bool operator<=(DateConstRef date) const;
Bool operator<(SFXDateConstRef date) const;
Bool operator<(DateConstRef date) const;
Date operator+(DateDurationConstRef duration) const;
Date operator+(SFXDateDurationConstRef duration) const;
Date operator-(DateDurationConstRef duration) const;
Date operator-(SFXDateDurationConstRef durarion) const;
DateDuration operator-(DateConstRef date) const;
DateDuration operator-(SFXDateConstRef date) const;
DateConstRef operator+=(DateDurationConstRef duration);
DateConstRef operator+=(SFXDateDurationConstRef duration);
DateConstRef operator-=(DateDurationConstRef duration);
DateConstRef operator-=(SFXDateDurationConstRef duration);
private:
Void CalcDate(Void) const;
Void CalcJ2000Year(Void) const;
};
// 擔悢傪庢傝埖偆僋儔僗
class DateDuration {
private:
Float64 _duration;
public:
Void Set(SInt32 days, UInt16 hour, UInt16 minute, UInt16 second);
Void Set(Float64 days);
Void Set(SFXDateDurationConstRef duration);
Void Set(DateDurationConstRef ob);
explicit DateDuration(Void);
explicit DateDuration(SInt32 days, UInt16 hour, UInt16 minute, UInt16 second);
explicit DateDuration(Float64 days);
explicit DateDuration(SFXDateDurationConstRef duration);
DateDuration(DateDurationConstRef ob);
virtual ~DateDuration(Void);
DateDurationConstRef operator=(SFXDateDurationConstRef duration);
DateDurationConstRef operator=(DateDurationConstRef ob);
Float64 Get(Void) const;
SInt32 GetDays(Void) const;
UInt16 GetHour(Void) const;
UInt16 GetMinute(Void) const;
UInt16 GetSecond(Void) const;
SFXDateDuration GetSFXDateDuration(Void) const;
Bool operator==(SFXDateDurationConstRef duration) const;
Bool operator==(DateDurationConstRef duration) const;
Bool operator!=(SFXDateDurationConstRef duration) const;
Bool operator!=(DateDurationConstRef duration) const;
Bool operator>=(SFXDateDurationConstRef duration) const;
Bool operator>=(DateDurationConstRef duration) const;
Bool operator>(SFXDateDurationConstRef duration) const;
Bool operator>(DateDurationConstRef duration) const;
Bool operator<=(SFXDateDurationConstRef duration) const;
Bool operator<=(DateDurationConstRef duration) const;
Bool operator<(SFXDateDurationConstRef duration) const;
Bool operator<(DateDurationConstRef duration) const;
Date operator+(DateConstRef date) const;
Date operator+(SFXDateConstRef date) const;
DateDuration operator+(DateDurationConstRef duration) const;
DateDuration operator+(SFXDateDurationConstRef duration) const;
DateDuration operator-(DateDurationConstRef duration) const;
DateDuration operator-(SFXDateDurationConstRef duration) const;
DateDurationConstRef operator+=(DateDurationConstRef duration);
DateDurationConstRef operator+=(SFXDateDurationConstRef duration);
DateDurationConstRef operator-=(DateDurationConstRef duration);
DateDurationConstRef operator-=(SFXDateDurationConstRef duration);
};
// 揤媴嵗昗偱偺揤懱偺埵抲
SFMTYPEDEFSTRUCT(AstronomicalPoint)
struct AstronomicalPoint {
Float64 Longitude; // 宱搙
Float64 Latitude; // 堒搙
};
SFMTYPEDEFCLASS(SunRiseSunSet)
SFMTYPEDEFCLASS(MoonRiseMoonSet)
// 惎偵娭偡傞忣曬傪曐帩偡傞僋儔僗
SFMTYPEDEFCLASS(Star)
class Star {
private:
friend class SunRiseSunSet;
friend class MoonRiseMoonSet;
friend class AstronomicalMath;
protected:
Date _gmtDate; // 擔帪
AstronomicalPoint _eclipticPosition; // 墿摴嵗昗宯偱偺惎偺埵抲
Float64 _PI; // 帇嵎
public:
virtual Void Set(DateConstRef gmtDate);
explicit Star(Void);
Star(DateConstRef gmtDate);
DateConstRef GetGMTDate(Void) const;
AstronomicalPointConstRef GetEclipticPosition(Void) const;
Float64 GetParallax(Void) const;
AstronomicalPoint GetEquatorialPosition(Void) const;
protected:
virtual Float64 CalcEclipticLongitude(Float64 T) const = 0;
virtual Float64 CalcEclipticLatitude(Float64 T) const = 0;
virtual Float64 CalcParallax(Float64 T) const = 0;
};
friend class Star;
// 懢梲偺忣曬傪曐帩偡傞僋儔僗
SFMTYPEDEFCLASS(Sun)
class Sun : public Star {
private:
Float64 _S; // 懢梲偺帇敿宎
friend class SunRiseSunSet;
public:
virtual Void Set(DateConstRef gmtDate);
explicit Sun(Void);
Sun(DateConstRef gmtDate);
protected:
virtual Float64 CalcEclipticLongitude(Float64 T) const;
virtual Float64 CalcEclipticLatitude(Float64 /* T */) const;
virtual Float64 CalcParallax(Float64 /* T */) const;
Float64 CalcDistance(Float64 T) const;
};
friend class Sun;
// 寧偺忣曬傪曐帩偡傞僋儔僗
SFMTYPEDEFCLASS(Moon)
class Moon : public Star {
public:
explicit Moon(DateConstRef gmtDate);
protected:
virtual Float64 CalcEclipticLongitude(Float64 T) const;
virtual Float64 CalcEclipticLatitude(Float64 T) const;
virtual Float64 CalcParallax(Float64 T) const;
};
friend class Moon;
// 惎偺弌杤傪寁嶼偡傞僋儔僗
SFMTYPEDEFCLASS(StarRiseSet)
class StarRiseSet {
protected:
Date _gmtDate; // 擔晅 (偙偙偐傜 24 帪娫偺斖埻偱弌杤帪崗傪寁嶼偡傞)
Float64 _E; // 娤應抧揰偺抧暯慄偺暁妏
Float64 _R; // 戝婥嵎
AstronomicalPoint _position; // 娤應抧揰偺宱搙丒堒搙
Array<Date> _riseDate; // 弌帪崗
Array<Date> _setDate; // 杤帪崗
typedef Float64 (StarRiseSet::*PFUNC_EQUATION)(DateConstRef gmtTime) const;
public:
Void Set(DateConstRef gmtDate, AstronomicalPointConstRef position, Float64 H = ASTRONOMICALMATH_DEFAULT_H, Float64 R = ASTRONOMICALMATH_DEFAULT_R);
Void Set(DateConstRef gmtDate, Float64 lambda, Float64 phi, Float64 H = ASTRONOMICALMATH_DEFAULT_H, Float64 R = ASTRONOMICALMATH_DEFAULT_R);
explicit StarRiseSet(Void);
explicit StarRiseSet(DateConstRef gmtDate, AstronomicalPointConstRef position, Float64 H = ASTRONOMICALMATH_DEFAULT_H, Float64 R = ASTRONOMICALMATH_DEFAULT_R);
explicit StarRiseSet(DateConstRef gmtDate, Float64 lambda, Float64 phi, Float64 H = ASTRONOMICALMATH_DEFAULT_H, Float64 R = ASTRONOMICALMATH_DEFAULT_R);
Void Compute(Void);
SInt32 GetRiseDateSize(Void) const;
DateConstRef GetRiseDate(SInt32 index) const;
SInt32 GetSetDateSize(Void) const;
DateConstRef GetSetDate(SInt32 index) const;
protected:
virtual Float64 Equation(DateConstRef gmtDate) const = 0;
Float64 DiffEquation(DateConstRef gmtDate) const;
Date SolveEquation(PFUNC_EQUATION equation, DateConstRef initial, DateConstRef final) const;
};
friend class StarRiseSet;
// 擔弌杤帪崗傪寁嶼偡傞僋儔僗
class SunRiseSunSet : public StarRiseSet {
public:
explicit SunRiseSunSet(Void);
explicit SunRiseSunSet(DateConstRef gmtDate, AstronomicalPointConstRef position, Float64 H = ASTRONOMICALMATH_DEFAULT_H, Float64 R = ASTRONOMICALMATH_DEFAULT_R);
explicit SunRiseSunSet(DateConstRef gmtDate, Float64 lambda, Float64 phi, Float64 H = ASTRONOMICALMATH_DEFAULT_H, Float64 R = ASTRONOMICALMATH_DEFAULT_R);
protected:
virtual Float64 Equation(DateConstRef gmtDate) const;
};
friend class SunRiseSunSet;
// 寧弌杤帪崗傪寁嶼偡傞僋儔僗
class MoonRiseMoonSet : public StarRiseSet {
public:
explicit MoonRiseMoonSet(Void);
explicit MoonRiseMoonSet(DateConstRef gmtDate, AstronomicalPointConstRef position, Float64 H = ASTRONOMICALMATH_DEFAULT_H, Float64 R = ASTRONOMICALMATH_DEFAULT_R);
explicit MoonRiseMoonSet(DateConstRef gmtDate, Float64 lambda, Float64 phi, Float64 H = ASTRONOMICALMATH_DEFAULT_H, Float64 R = ASTRONOMICALMATH_DEFAULT_R);
protected:
virtual Float64 Equation(DateConstRef gmtDate) const;
};
friend class MoonRiseMoonSet;
private:
static Float64 DegreeToRadian(Float64 x);
static Float64 RadianToDegree(Float64 x);
static Float64 CalcObliquityOfTheEcliptic(Float64 T);
static Bool DifferentSign(Float64 a, Float64 b);
public:
static Float64 GetSiderealTime(DateConstRef gmtDate, Float64 lambda);
static Float64 GetMoonAge(DateConstRef gmtDate);
};
Bool operator==(SFXDateConstRef date1, AstronomicalMath::DateConstRef date2);
Bool operator!=(SFXDateConstRef date1, AstronomicalMath::DateConstRef date2);
Bool operator>=(SFXDateConstRef date1, AstronomicalMath::DateConstRef date2);
Bool operator>(SFXDateConstRef date1, AstronomicalMath::DateConstRef date2);
Bool operator<=(SFXDateConstRef date1, AstronomicalMath::DateConstRef date2);
Bool operator<(SFXDateConstRef date1, AstronomicalMath::DateConstRef date2);
Bool operator==(SFXDateDurationConstRef duration1, AstronomicalMath::DateDurationConstRef duration2);
Bool operator!=(SFXDateDurationConstRef duration1, AstronomicalMath::DateDurationConstRef duration2);
Bool operator>=(SFXDateDurationConstRef duration1, AstronomicalMath::DateDurationConstRef duration2);
Bool operator>(SFXDateDurationConstRef duration1, AstronomicalMath::DateDurationConstRef duration2);
Bool operator<=(SFXDateDurationConstRef duration1, AstronomicalMath::DateDurationConstRef duration2);
Bool operator<(SFXDateDurationConstRef duration1, AstronomicalMath::DateDurationConstRef duration2);
AstronomicalMath::Date operator+(SFXDateDurationConstRef duration, AstronomicalMath::DateConstRef date);
AstronomicalMath::DateDuration operator-(SFXDateConstRef date1, AstronomicalMath::DateConstRef date2);
AstronomicalMath::Date operator+(SFXDateConstRef date, AstronomicalMath::DateDurationConstRef duration);
AstronomicalMath::DateDuration operator+(SFXDateDurationConstRef duration1, AstronomicalMath::DateDurationConstRef duration2);
AstronomicalMath::DateDuration operator-(SFXDateDurationConstRef duration1, AstronomicalMath::DateDurationConstRef duration2);
inline Float64 AstronomicalMath::DegreeToRadian(Float64 x)
{
return (ASTRONOMICALMATH_PI / 180.0) * x;
}
inline Float64 AstronomicalMath::RadianToDegree(Float64 x)
{
return (180.0 / ASTRONOMICALMATH_PI) * x;
}
inline Void AstronomicalMath::Date::Set(Float64 days)
{
_days = days;
_dateUpdated = false;
_j2000Updated = false;
}
inline AstronomicalMath::DateConstRef AstronomicalMath::Date::operator=(SFXDateConstRef date)
{
Set(date);
return *this;
}
inline AstronomicalMath::DateConstRef AstronomicalMath::Date::operator=(DateConstRef ob)
{
Set(ob);
return *this;
}
inline UInt16 AstronomicalMath::Date::GetYear(Void) const
{
CalcDate();
return _year;
}
inline UInt16 AstronomicalMath::Date::GetMonth(Void) const
{
CalcDate();
return _month;
}
inline UInt16 AstronomicalMath::Date::GetDay(Void) const
{
CalcDate();
return _day;
}
inline UInt16 AstronomicalMath::Date::GetHour(Void) const
{
CalcDate();
return _hour;
}
inline UInt16 AstronomicalMath::Date::GetMinute(Void) const
{
CalcDate();
return _minute;
}
inline UInt16 AstronomicalMath::Date::GetSecond(Void) const
{
CalcDate();
return _second;
}
inline Float64 AstronomicalMath::Date::Get(Void) const
{
return _days;
}
inline Float64 AstronomicalMath::Date::GetJ2000Year(Void) const
{
CalcJ2000Year();
return _j2000;
}
inline SFXDate AstronomicalMath::Date::GetSFXDate(Void) const
{
CalcDate();
return SFXDate(_year, _month, _day, _hour, _minute, _second);
}
inline AstronomicalMath::Date AstronomicalMath::Date::GetMidpoint(DateConstRef date1, DateConstRef date2)
{
return Date((date1._days + date2._days) / 2.0);
}
inline Bool AstronomicalMath::Date::operator==(SFXDateConstRef date) const
{
return operator==(Date(date));
}
inline Bool AstronomicalMath::Date::operator==(DateConstRef date) const
{
return _days == date._days;
}
inline Bool operator==(SFXDateConstRef date1, AstronomicalMath::DateConstRef date2)
{
return date2.operator==(date1);
}
inline Bool AstronomicalMath::Date::operator!=(SFXDateConstRef date) const
{
return operator!=(Date(date));
}
inline Bool AstronomicalMath::Date::operator!=(DateConstRef date) const
{
return _days != date._days;
}
inline Bool operator!=(SFXDateConstRef date1, AstronomicalMath::DateConstRef date2)
{
return date2.operator!=(date1);
}
inline Bool AstronomicalMath::Date::operator>=(SFXDateConstRef date) const
{
return operator>=(Date(date));
}
inline Bool AstronomicalMath::Date::operator>=(DateConstRef date) const
{
return _days >= date._days;
}
inline Bool operator>=(SFXDateConstRef date1, AstronomicalMath::DateConstRef date2)
{
return date2.operator<=(date1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -