Kstars

ksplanetbase.h
1 /*
2  SPDX-FileCopyrightText: 2002 Mark Hollomon <[email protected]>
3 
4  SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #pragma once
8 
9 #include "trailobject.h"
10 #include "kstarsdata.h"
11 
12 #include <QColor>
13 #include <QDebug>
14 #include <QImage>
15 #include <QList>
16 
17 class KSNumbers;
18 
19 /**
20  * @class EclipticPosition
21  * @short The ecliptic position of a planet (Longitude, Latitude, and distance from Sun).
22  * @author Mark Hollomon
23  * @version 1.0
24  */
26 {
27  public:
28  dms longitude;
29  dms latitude;
30  double radius;
31 
32  /**Constructor. */
33  explicit EclipticPosition(dms plong = dms(), dms plat = dms(), double prad = 0.0)
34  : longitude(plong), latitude(plat), radius(prad)
35  {
36  }
37 };
38 
39 /**
40  * @class KSPlanetBase
41  * A subclass of TrailObject that provides additional information needed for most solar system
42  * objects. This is a base class for KSSun, KSMoon, KSPlanet, KSAsteroid and KSComet.
43  * Those classes cover all solar system objects except planetary moons, which are
44  * derived directly from TrailObject
45  * @short Provides necessary information about objects in the solar system.
46  * @author Mark Hollomon
47  * @version 1.0
48  */
49 class KSPlanetBase : public TrailObject
50 {
51  public:
52  /**
53  * Constructor. Calls SkyObject constructor with type=2 (planet),
54  * coordinates=0.0, mag=0.0, primary name s, and all other QStrings empty.
55  * @param s Name of planet
56  * @param image_file filename of the planet's image
57  * @param c color of the symbol to use for this planet
58  * @param pSize the planet's physical size, in km
59  */
60  explicit KSPlanetBase(const QString &s = i18n("unnamed"), const QString &image_file = QString(),
61  const QColor &c = Qt::white, double pSize = 0);
62 
63  /** Destructor (empty) */
64  ~KSPlanetBase() override = default;
65 
66  void init(const QString &s, const QString &image_file, const QColor &c, double pSize);
67 
68  //enum Planets { MERCURY=0, VENUS=1, MARS=2, JUPITER=3, SATURN=4, URANUS=5, NEPTUNE=6, PLUTO=7, SUN=8, MOON=9, UNKNOWN_PLANET };
69  enum Planets
70  {
71  MERCURY = 0,
72  VENUS = 1,
73  MARS = 2,
74  JUPITER = 3,
75  SATURN = 4,
76  URANUS = 5,
77  NEPTUNE = 6,
78  SUN = 7,
79  MOON = 8,
80  EARTH_SHADOW = 9,
81  UNKNOWN_PLANET
82  };
83 
84  static KSPlanetBase *createPlanet(int n);
85 
86  static QVector<QColor> planetColor;
87 
88  virtual bool loadData() = 0;
89 
90  /** @return pointer to Ecliptic Longitude coordinate */
91  const dms &ecLong() const { return ep.longitude; }
92 
93  /** @return pointer to Ecliptic Latitude coordinate */
94  const dms &ecLat() const { return ep.latitude; }
95 
96  /**
97  * @short Set Ecliptic Geocentric Longitude according to argument.
98  * @param elong Ecliptic Longitude
99  */
100  void setEcLong(dms elong) { ep.longitude = elong; }
101 
102  /**
103  * @short Set Ecliptic Geocentric Latitude according to argument.
104  * @param elat Ecliptic Latitude
105  */
106  void setEcLat(dms elat) { ep.latitude = elat; }
107 
108  /** @return pointer to Ecliptic Heliocentric Longitude coordinate */
109  const dms &helEcLong() const { return helEcPos.longitude; }
110 
111  /** @return pointer to Ecliptic Heliocentric Latitude coordinate */
112  const dms &helEcLat() const { return helEcPos.latitude; }
113 
114  /**
115  * @short Convert Ecliptic longitude/latitude to Right Ascension/Declination.
116  * @param Obliquity current Obliquity of the Ecliptic (angle from Equator)
117  */
118  void EclipticToEquatorial(const CachingDms *Obliquity);
119 
120  /**
121  * @short Convert Right Ascension/Declination to Ecliptic longitude/latitude.
122  * @param Obliquity current Obliquity of the Ecliptic (angle from Equator)
123  */
124  void EquatorialToEcliptic(const CachingDms *Obliquity);
125 
126  /** @return pointer to this planet's texture */
127  const QImage &image() const { return m_image; }
128 
129  /** @return distance from Sun, in Astronomical Units (1 AU is Earth-Sun distance) */
130  double rsun() const { return ep.radius; }
131 
132  /**
133  * @short Set the solar distance in AU.
134  * @param r the new solar distance in AU
135  */
136  void setRsun(double r) { ep.radius = r; }
137 
138  /** @return distance from Earth, in Astronomical Units (1 AU is Earth-Sun distance) */
139  double rearth() const { return Rearth; }
140 
141  /**
142  * @short Set the distance from Earth, in AU.
143  * @param r the new earth-distance in AU
144  */
145  void setRearth(double r) { Rearth = r; }
146 
147  /**
148  * @short compute and set the distance from Earth, in AU.
149  * @param Earth pointer to the Earth from which to calculate the distance.
150  */
151  void setRearth(const KSPlanetBase *Earth);
152 
153  /**
154  * Update position of the planet (reimplemented from SkyPoint)
155  * @param num current KSNumbers object
156  * @param includePlanets this function does nothing if includePlanets=false
157  * @param lat pointer to the geographic latitude; if nullptr, we skip localizeCoords()
158  * @param LST pointer to the local sidereal time; if nullptr, we skip localizeCoords()
159  * @param forceRecompute defines whether the data should be recomputed forcefully
160  */
161  void updateCoords(const KSNumbers *num, bool includePlanets = true, const CachingDms *lat = nullptr,
162  const CachingDms *LST = nullptr, bool forceRecompute = false) override;
163 
164  /**
165  * @short Find position, including correction for Figure-of-the-Earth.
166  * @param num KSNumbers pointer for the target date/time
167  * @param lat pointer to the geographic latitude; if nullptr, we skip localizeCoords()
168  * @param LST pointer to the local sidereal time; if nullptr, we skip localizeCoords()
169  * @param Earth pointer to the Earth (not used for the Moon)
170  */
171  void findPosition(const KSNumbers *num, const CachingDms *lat = nullptr, const CachingDms *LST = nullptr,
172  const KSPlanetBase *Earth = nullptr);
173 
174  /** @return the Planet's position angle. */
175  double pa() const override { return PositionAngle; }
176 
177  /**
178  * @short Set the Planet's position angle.
179  * @param p the new position angle
180  */
181  void setPA(double p) { PositionAngle = p; }
182 
183  /** @return the Planet's angular size, in arcminutes */
184  double angSize() const { return AngularSize; }
185 
186  /** @short set the planet's angular size, in km.
187  * @param size the planet's size, in km
188  */
189  void setAngularSize(double size) { AngularSize = size; }
190 
191  /** @return the Planet's physical size, in km */
192  double physicalSize() const { return PhysicalSize; }
193 
194  /** @short set the planet's physical size, in km.
195  * @param size the planet's size, in km
196  */
197  void setPhysicalSize(double size) { PhysicalSize = size; }
198 
199  /** @return the phase angle of this planet */
200  inline dms phase() { return dms(Phase); }
201 
202  /** @return the color for the planet symbol */
203  QColor &color() { return m_Color; }
204 
205  /** @short Set the color for the planet symbol */
206  void setColor(const QColor &c) { m_Color = c; }
207 
208  /** @return true if the KSPlanet is one of the eight major planets */
209  bool isMajorPlanet() const;
210 
211  /** @return the pixel distance for offseting the object's name label */
212  double labelOffset() const override;
213 
214  protected:
215  /** Big object. Planet, Moon, Sun. */
216  static const UID UID_SOL_BIGOBJ;
217  /** Asteroids */
218  static const UID UID_SOL_ASTEROID;
219  /** Comets */
220  static const UID UID_SOL_COMET;
221 
222  /** Compute high 32-bits of UID. */
223  inline UID solarsysUID(UID type) const { return (SkyObject::UID_SOLARSYS << 60) | (type << 56); }
224 
225  /**
226  * @short find the object's current geocentric equatorial coordinates (RA and Dec)
227  * This function is pure virtual; it must be overloaded by subclasses.
228  * This function is private; it is called by the public function findPosition()
229  * which also includes the figure-of-the-earth correction, localizeCoords().
230  * @param num pointer to current KSNumbers object
231  * @param Earth pointer to planet Earth (needed to calculate geocentric coords)
232  * @return true if position was successfully calculated.
233  */
234  virtual bool findGeocentricPosition(const KSNumbers *num, const KSPlanetBase *Earth = nullptr) = 0;
235 
236  /**
237  * @short Computes the visual magnitude for the major planets.
238  * @param num pointer to a ksnumbers object. Needed for the saturn rings contribution to
239  * saturn's magnitude.
240  */
241  virtual void findMagnitude(const KSNumbers *num) = 0;
242 
243  /**
244  * Determine the position angle of the planet for a given date
245  * (used internally by findPosition() )
246  */
247  void findPA(const KSNumbers *num);
248 
249  /** Determine the phase of the planet. */
250  virtual void findPhase();
251 
252  virtual double findAngularSize() { return asin(physicalSize() / Rearth / AU_KM) * 60. * 180. / dms::PI; }
253  // Geocentric ecliptic position, but distance to the Sun
254  EclipticPosition ep;
255 
256  // Heliocentric ecliptic position referred to the equinox of the epoch
257  // as obtained from VSOP.
258  EclipticPosition helEcPos;
259  double Rearth {NaN::d};
260  double Phase {NaN::d};
261  QImage m_image;
262 
263  private:
264  /**
265  * @short correct the position for the fact that the location is not at the center of the Earth,
266  * but a position on its surface. This causes a small parallactic shift in a solar system
267  * body's apparent position. The effect is most significant for the Moon.
268  * This function is private, and should only be called from the public findPosition() function.
269  * @param num pointer to a ksnumbers object for the target date/time
270  * @param lat pointer to the geographic latitude of the location.
271  * @param LST pointer to the local sidereal time.
272  */
273  void localizeCoords(const KSNumbers *num, const CachingDms *lat, const CachingDms *LST);
274 
275  double PositionAngle, AngularSize, PhysicalSize;
276  QColor m_Color;
277 };
void setPA(double p)
Set the Planet's position angle.
Definition: ksplanetbase.h:181
KSPlanetBase(const QString &s=i18n("unnamed"), const QString &image_file=QString(), const QColor &c=Qt::white, double pSize=0)
Constructor.
static constexpr double PI
PI is a const static member; it's public so that it can be used anywhere, as long as dms....
Definition: dms.h:385
const dms & helEcLong() const
Definition: ksplanetbase.h:109
double labelOffset() const override
void setColor(const QColor &c)
Set the color for the planet symbol.
Definition: ksplanetbase.h:206
QColor & color()
Definition: ksplanetbase.h:203
virtual void findPhase()
Determine the phase of the planet.
a dms subclass that caches its sine and cosine values every time the angle is changed.
Definition: cachingdms.h:18
void findPosition(const KSNumbers *num, const CachingDms *lat=nullptr, const CachingDms *LST=nullptr, const KSPlanetBase *Earth=nullptr)
Find position, including correction for Figure-of-the-Earth.
virtual bool findGeocentricPosition(const KSNumbers *num, const KSPlanetBase *Earth=nullptr)=0
find the object's current geocentric equatorial coordinates (RA and Dec) This function is pure virtua...
double rsun() const
Definition: ksplanetbase.h:130
double rearth() const
Definition: ksplanetbase.h:139
void setEcLat(dms elat)
Set Ecliptic Geocentric Latitude according to argument.
Definition: ksplanetbase.h:106
const dms & helEcLat() const
Definition: ksplanetbase.h:112
qint64 UID
Type for Unique object IDenticator.
Definition: skyobject.h:49
int type(void) const
Definition: skyobject.h:188
void updateCoords(const KSNumbers *num, bool includePlanets=true, const CachingDms *lat=nullptr, const CachingDms *LST=nullptr, bool forceRecompute=false) override
Update position of the planet (reimplemented from SkyPoint)
void setEcLong(dms elong)
Set Ecliptic Geocentric Longitude according to argument.
Definition: ksplanetbase.h:100
The ecliptic position of a planet (Longitude, Latitude, and distance from Sun).
Definition: ksplanetbase.h:25
QString i18n(const char *text, const TYPE &arg...)
const QImage & image() const
Definition: ksplanetbase.h:127
Store several time-dependent astronomical quantities.
Definition: ksnumbers.h:42
static const UID UID_SOL_ASTEROID
Asteroids.
Definition: ksplanetbase.h:218
void setRearth(double r)
Set the distance from Earth, in AU.
Definition: ksplanetbase.h:145
provides a SkyObject with an attachable Trail
Definition: trailobject.h:21
virtual void findMagnitude(const KSNumbers *num)=0
Computes the visual magnitude for the major planets.
const dms & ecLong() const
Definition: ksplanetbase.h:91
~KSPlanetBase() override=default
Destructor (empty)
UID solarsysUID(UID type) const
Compute high 32-bits of UID.
Definition: ksplanetbase.h:223
double physicalSize() const
Definition: ksplanetbase.h:192
double pa() const override
Definition: ksplanetbase.h:175
An angle, stored as degrees, but expressible in many ways.
Definition: dms.h:37
double angSize() const
Definition: ksplanetbase.h:184
void EquatorialToEcliptic(const CachingDms *Obliquity)
Convert Right Ascension/Declination to Ecliptic longitude/latitude.
void setAngularSize(double size)
set the planet's angular size, in km.
Definition: ksplanetbase.h:189
void setRsun(double r)
Set the solar distance in AU.
Definition: ksplanetbase.h:136
void setPhysicalSize(double size)
set the planet's physical size, in km.
Definition: ksplanetbase.h:197
void EclipticToEquatorial(const CachingDms *Obliquity)
Convert Ecliptic longitude/latitude to Right Ascension/Declination.
static const UID UID_SOL_COMET
Comets.
Definition: ksplanetbase.h:220
const dms & ecLat() const
Definition: ksplanetbase.h:94
static const UID UID_SOL_BIGOBJ
Big object.
Definition: ksplanetbase.h:216
void findPA(const KSNumbers *num)
Determine the position angle of the planet for a given date (used internally by findPosition() )
bool isMajorPlanet() const
Provides necessary information about objects in the solar system.
Definition: ksplanetbase.h:49
EclipticPosition(dms plong=dms(), dms plat=dms(), double prad=0.0)
Constructor.
Definition: ksplanetbase.h:33
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Fri Sep 22 2023 03:57:55 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.