12#include "kstarsdata.h"
14#include "kspopupmenu.h"
16#include "skycomponents/skymapcomposite.h"
17#include "skycomponents/solarsystemcomposite.h"
18#include "texturemanager.h"
32#include <qtskipemptyparts.h>
59static const double MagArray[19] = { -12.7, -12.4, -12.1, -11.8, -11.5, -11.2, -11.0, -10.8, -10.4, -10.0,
60 -9.6, -9.2, -8.7, -8.2, -7.6, -6.7, -3.4, 0, 0
78 Q_ASSERT(
typeid(
this) ==
typeid(
static_cast<const KSMoon *
>(
this)));
85 if (instance_count <= 0)
93bool KSMoon::data_loaded =
false;
94int KSMoon::instance_count = 0;
106 if (KSUtils::openDataFile(f,
"moonLR.dat"))
109 while (!stream.
atEnd())
113 if (fields.size() == 6)
115 LRData.append(MoonLRData());
116 LRData.last().nd = fields[0].toInt();
117 LRData.last().nm = fields[1].toInt();
118 LRData.last().nm1 = fields[2].toInt();
119 LRData.last().nf = fields[3].toInt();
120 LRData.last().Li = fields[4].toDouble();
121 LRData.last().Ri = fields[5].toDouble();
129 if (KSUtils::openDataFile(f,
"moonB.dat"))
132 while (!stream.
atEnd())
136 if (fields.size() == 5)
138 BData.append(MoonBData());
139 BData.last().nd = fields[0].toInt();
140 BData.last().nm = fields[1].toInt();
141 BData.last().nm1 = fields[2].toInt();
142 BData.last().nf = fields[3].toInt();
143 BData.last().Bi = fields[4].toDouble();
159 double T, L, D, M, M1, F, A1, A2, A3;
160 double sumL, sumR, sumB;
165 double Et = 1.0 - 0.002516 * T - 0.0000074 * T * T;
168 L = degToRad(218.3164477 + 481267.88123421 * T - 0.0015786 * T * T + T * T * T / 538841.0 -
169 T * T * T * T / 65194000.0);
171 D = degToRad(297.8501921 + 445267.1114034 * T - 0.0018819 * T * T + T * T * T / 545868.0 -
172 T * T * T * T / 113065000.0);
174 M = degToRad(357.5291092 + 35999.0502909 * T - 0.0001536 * T * T + T * T * T / 24490000.0);
176 M1 = degToRad(134.9633964 + 477198.8675055 * T + 0.0087414 * T * T + T * T * T / 69699.0 -
177 T * T * T * T / 14712000.0);
179 F = degToRad(93.2720950 + 483202.0175233 * T - 0.0036539 * T * T - T * T * T / 3526000.0 +
180 T * T * T * T / 863310000.0);
182 A1 = degToRad(119.75 + 131.849 * T);
183 A2 = degToRad(53.09 + 479264.290 * T);
184 A3 = degToRad(313.45 + 481266.484 * T);
194 for (
const auto &mlrd : LRData)
201 if (abs(mlrd.nm) == 2)
204 sumL += E * mlrd.Li * sin(mlrd.nd * D + mlrd.nm * M + mlrd.nm1 * M1 + mlrd.nf * F);
205 sumR += E * mlrd.Ri * cos(mlrd.nd * D + mlrd.nm * M + mlrd.nm1 * M1 + mlrd.nf * F);
209 for (
const auto &mbd : BData)
216 if (abs(mbd.nm) == 2)
219 sumB += E * mbd.Bi * sin(mbd.nd * D + mbd.nm * M + mbd.nm1 * M1 + mbd.nf * F);
223 sumL += (3958.0 * sin(A1) + 1962.0 * sin(L - F) + 318.0 * sin(A2));
224 sumB += (-2235.0 * sin(L) + 382.0 * sin(A3) + 175.0 * sin(A1 - F) + 175.0 * sin(A1 + F) + 127.0 * sin(L - M1) -
225 115.0 * sin(L + M1));
230 Rearth = (385000.56 + sumR / 1000.0) / AU_KM;
240void KSMoon::findMagnitude(
const KSNumbers *)
259 int j = (i + 1 > 18) ? 18 : i + 1;
262 if (i >= 0 && j >= 0 && i <= 18 && j <= 18)
264 setMag(MagArray[i] + (MagArray[j] - MagArray[i]) * k / 10);
272 if (defaultSun ==
nullptr)
273 defaultSun = KStarsData::Instance()->skyComposite()->solarSystemComposite()->sun();
277 Q_ASSERT(Sun !=
nullptr);
283 iPhase = int(0.1 * DegPhase + 0.5) % 36;
291 double p = abs(
dms(Phase).reduce().Degrees());
295 return i18nc(
"moon phase, 100 percent illuminated",
"Full moon");
297 return i18nc(
"moon phase, 0 percent illuminated",
"New moon");
298 if (fabs(f - 0.50) < 0.06)
301 return i18nc(
"moon phase, half-illuminated and growing",
"First quarter");
303 return i18nc(
"moon phase, half-illuminated and shrinking",
"Third quarter");
308 return i18nc(
"moon phase between new moon and 1st quarter",
"Waxing crescent");
310 return i18nc(
"moon phase between 1st quarter and full moon",
"Waxing gibbous");
312 return i18nc(
"moon phase between full moon and 3rd quarter",
"Waning gibbous");
314 return i18nc(
"moon phase between 3rd quarter and new moon",
"Waning crescent");
317 return i18n(
"unknown");
325 pmenu->createMoonMenu(
this);
bool findGeocentricPosition(const KSNumbers *num, const KSPlanetBase *) override
Reimplemented from KSPlanetBase, this function employs unique algorithms for estimating the lunar coo...
KSMoon()
Default constructor.
QString phaseName() const
SkyObject::UID getUID() const override
Return UID for object.
bool loadData() override
reimplemented from KSPlanetBase
void initPopupMenu(KSPopupMenu *pmenu) override
Initialize the popup menut.
KSMoon * clone() const override
Create copy of object.
virtual void findPhase()
Determine the phase of the planet.
There are several time-dependent values used in position calculations, that are not specific to an ob...
const CachingDms * obliquity() const
double julianCenturies() const
UID solarsysUID(UID type) const
Compute high 32-bits of UID.
static const UID UID_SOL_BIGOBJ
Big object.
KSPlanetBase(const QString &s=i18n("unnamed"), const QString &image_file=QString(), const QColor &c=Qt::white, double pSize=0)
Constructor.
void findPA(const KSNumbers *num)
Determine the position angle of the planet for a given date (used internally by findPosition() )
void setEcLong(dms elong)
Set Ecliptic Geocentric Longitude according to argument.
const dms & ecLong() const
void EclipticToEquatorial(const CachingDms *Obliquity)
Convert Ecliptic longitude/latitude to Right Ascension/Declination.
void setEcLat(dms elat)
Set Ecliptic Geocentric Latitude according to argument.
Child class of KSPlanetBase; encapsulates information about the Sun.
void setMag(float m)
Set the object's sorting magnitude.
qint64 UID
Type for Unique object IDenticator.
void setType(int t)
Set the object's type identifier to the argument.
static const QImage & getImage(const QString &name)
Return texture image.
An angle, stored as degrees, but expressible in many ways.
const dms reduce() const
return the equivalent angle between 0 and 360 degrees.
static constexpr double PI
PI is a const static member; it's public so that it can be used anywhere, as long as dms....
const double & Degrees() const
static constexpr double DegToRad
DegToRad is a const static member equal to the number of radians in one degree (dms::PI/180....
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
constexpr double degToRad(double deg)
QStringList split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const const
QString readLine(qint64 maxlen)