moved kdeaccessibility kdeaddons kdeadmin kdeartwork kdebindings kdeedu kdegames...
[kdeedu.git] / kstars / kstars / planetcatalog.cpp
bloba3b2b43552d1a82536a602f4c280565d6c6e8129
1 /***************************************************************************
2 planetcatalog.cpp - description
3 -------------------
4 begin : Mon Feb 18 2002
5 copyright : (C) 2002 by Mark Hollomon
6 email : mhh@mindspring.com
7 ***************************************************************************/
9 /***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
18 #include <qstring.h>
20 #include "planetcatalog.h"
21 #include "dms.h"
22 #include "kstarsdata.h"
23 #include "ksnumbers.h"
24 #include "ksplanetbase.h"
25 #include "ksplanet.h"
26 #include "kssun.h"
27 #include "kspluto.h"
28 #include "skypoint.h"
29 #include "skyobject.h"
30 #include "objectnamelist.h"
32 PlanetCatalog::PlanetCatalog(KStarsData *dat) : Earth(0), Sun(0), kd(dat) {
33 planets.setAutoDelete(true);
36 PlanetCatalog::~PlanetCatalog() {
38 // do NOT delete Sun. It is also in the QList
39 // and will be deleted automatically.
41 delete Earth;
46 bool PlanetCatalog::initialize() {
47 KSPlanetBase *ksp;
49 Earth = new KSPlanet( kd, I18N_NOOP( "Earth" ), "", 12756.28 /*diameter in km*/ );
50 if (!Earth->loadData())
51 return false;
53 Sun = new KSSun( kd, "sun.png", 1392000. /*diameter in km*/ );
54 if (Sun->loadData()) {
55 planets.append(Sun);
58 ksp = new KSPluto( kd, "pluto.png", 2320. /*diameter in km*/ );
59 if (ksp->loadData()) {
60 planets.append(ksp);
63 ksp = new KSPlanet( kd, I18N_NOOP( "Mercury" ), "mercury.png", 4879.4 /*diameter in km*/ );
64 if (ksp->loadData()) {
65 planets.append(ksp);
68 ksp = new KSPlanet( kd, I18N_NOOP( "Venus" ), "venus.png", 12103.6 /*diameter in km*/ );
69 if (ksp->loadData()) {
70 planets.append(ksp);
73 ksp = new KSPlanet( kd, I18N_NOOP( "Mars" ), "mars.png", 6792.4 /*diameter in km*/ );
74 if (ksp->loadData()) {
75 planets.append(ksp);
78 ksp = new KSPlanet( kd, I18N_NOOP( "Jupiter" ), "jupiter.png", 142984. /*diameter in km*/ );
79 if (ksp->loadData()) {
80 planets.append(ksp);
83 ksp = new KSPlanet( kd, I18N_NOOP( "Saturn" ), "saturn.png", 120536. /*diameter in km*/ );
84 if (ksp->loadData()) {
85 planets.append(ksp);
88 ksp = new KSPlanet( kd, I18N_NOOP( "Uranus" ), "uranus.png", 51118. /*diameter in km*/ );
89 if (ksp->loadData()) {
90 planets.append(ksp);
93 ksp = new KSPlanet( kd, I18N_NOOP( "Neptune" ), "neptune.png", 49572. /*diameter in km*/ );
94 if (ksp->loadData()) {
95 planets.append(ksp);
98 return true;
101 void PlanetCatalog::addObject( ObjectNameList &ObjNames ) const {
102 QPtrListIterator<KSPlanetBase> it(planets);
104 for (KSPlanetBase *ksp = it.toFirst(); ksp != 0; ksp = ++it) {
105 ObjNames.append( ksp );
109 void PlanetCatalog::findPosition( const KSNumbers *num, const dms *lat, const dms *LST ) {
110 Earth->findPosition(num);
111 for (KSPlanetBase * ksp = planets.first(); ksp != 0; ksp = planets.next()) {
112 ksp->findPosition(num, lat, LST, Earth);
116 void PlanetCatalog::EquatorialToHorizontal( dms *LST, const dms *lat ) {
117 for (KSPlanetBase * ksp = planets.first(); ksp != 0; ksp = planets.next()) {
118 ksp->EquatorialToHorizontal( LST, lat);
119 if ( ksp->hasTrail() ) ksp->updateTrail( LST, lat );
123 bool PlanetCatalog::isPlanet(SkyObject *so) const {
124 if (so == Earth)
125 return true;
127 QPtrListIterator<KSPlanetBase> it(planets);
129 for (KSPlanetBase *ksp = it.toFirst(); ksp != 0; ksp = ++it) {
130 if (so == ksp)
131 return true;
134 return false;
137 KSPlanetBase *PlanetCatalog::findByName( const QString n) const {
138 if (n == "Earth")
139 return Earth;
141 QPtrListIterator<KSPlanetBase> it(planets);
143 for (KSPlanetBase *ksp = it.toFirst(); ksp != 0; ksp = ++it) {
144 if (ksp->name() == n)
145 return ksp;
148 kdDebug() << k_funcinfo << "could not find planet named " << n << endl;
150 return 0;
153 static double dist_squared(const SkyPoint *a, const SkyPoint *b) {
154 double dRA = a->ra()->Hours() - b->ra()->Hours();
155 double dDec = a->dec()->Degrees() - b->dec()->Degrees();
156 double f = 15.0*cos( a->dec()->radians() );
158 return f*f*dRA*dRA + dDec*dDec;
161 SkyObject *PlanetCatalog::findClosest(const SkyPoint *p, double &r) const {
162 QPtrListIterator<KSPlanetBase> it(planets);
163 SkyObject *found = 0;
164 double trialr = 0.0;
165 double rmin = 100000.0;
167 for (KSPlanetBase *ksp = it.toFirst(); ksp != 0; ksp = ++it) {
168 trialr = dist_squared(ksp, p);
169 if (trialr < rmin) {
170 rmin = trialr;
171 found = ksp;
175 r = rmin;
176 return found;
180 #include "planetcatalog.moc"