moved kdeaccessibility kdeaddons kdeadmin kdeartwork kdebindings kdeedu kdegames...
[kdeedu.git] / kstars / kstars / tools / jmoontool.cpp
blob76d4aa6761b870a3be8d4a869e250b8a3e591914
1 /***************************************************************************
2 jmoontool.cpp - Display overhead view of the solar system
3 -------------------
4 begin : Sun May 25 2003
5 copyright : (C) 2003 by Jason Harris
6 email : jharris@30doradus.org
7 ***************************************************************************/
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
17 #include <qlayout.h>
18 #include <qlabel.h>
20 #include <kdebug.h>
21 #include <klocale.h>
23 #include "jmoontool.h"
24 #include "jupitermoons.h"
25 #include "kstars.h"
26 #include "kstarsdata.h"
27 #include "ksplanet.h"
28 #include "simclock.h"
29 #include "planetcatalog.h"
30 #include "dms.h"
31 #include "ksnumbers.h"
33 JMoonTool::JMoonTool(QWidget *parent, const char *name)
34 : KDialogBase( KDialogBase::Plain, i18n("Jupiter Moons Tool"), Close, Close, parent, name )
36 ksw = (KStars*)parent;
38 QFrame *page = plainPage();
39 QVBoxLayout *vlay = new QVBoxLayout( page, 0, 0 );
41 colJp = "White";
42 colIo = "Red";
43 colEu = "Yellow";
44 colGn = "Orange";
45 colCa = "YellowGreen";
47 QLabel *labIo = new QLabel( "Io", page );
48 QLabel *labEu = new QLabel( "Europa", page );
49 QLabel *labGn = new QLabel( "Ganymede", page );
50 QLabel *labCa = new QLabel( "Callisto", page );
52 labIo->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
53 labEu->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
54 labGn->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
55 labCa->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
56 labIo->setAlignment( AlignHCenter );
57 labEu->setAlignment( AlignHCenter );
58 labGn->setAlignment( AlignHCenter );
59 labCa->setAlignment( AlignHCenter );
61 labIo->setPaletteForegroundColor( colIo );
62 labEu->setPaletteForegroundColor( colEu );
63 labGn->setPaletteForegroundColor( colGn );
64 labCa->setPaletteForegroundColor( colCa );
65 labIo->setPaletteBackgroundColor( "Black" );
66 labEu->setPaletteBackgroundColor( "Black" );
67 labGn->setPaletteBackgroundColor( "Black" );
68 labCa->setPaletteBackgroundColor( "Black" );
70 QGridLayout *glay = new QGridLayout( 2, 2, 0 );
71 glay->addWidget( labIo, 0, 0 );
72 glay->addWidget( labEu, 1, 0 );
73 glay->addWidget( labGn, 0, 1 );
74 glay->addWidget( labCa, 1, 1 );
76 pw = new KStarsPlotWidget( 0.0, 1.0, 0.0, 1.0, page );
77 pw->setShowGrid( false );
78 pw->setYAxisType0( KStarsPlotWidget::TIME );
79 pw->setLimits( -12.0, 12.0, -240.0, 240.0 );
80 pw->setXAxisLabel( i18n( "offset from Jupiter (arcmin)" ) );
81 pw->setYAxisLabel( i18n( "time since now (days)" ) );
82 vlay->addLayout( glay );
83 vlay->addWidget( pw );
84 resize( 250, 500 );
86 initPlotObjects();
87 update();
90 JMoonTool::~JMoonTool()
94 void JMoonTool::initPlotObjects() {
95 KPlotObject *orbit[4];
96 KPlotObject *jpath;
97 long double jd0 = ksw->data()->ut().djd();
98 KSSun *ksun = (KSSun*)ksw->data()->PCat->findByName( "Sun" );
99 KSPlanet *jup = (KSPlanet*)ksw->data()->PCat->findByName( "Jupiter" );
100 JupiterMoons jm;
102 if ( pw->objectCount() ) pw->clearObjectList();
104 orbit[0] = new KPlotObject( "io", colIo, KPlotObject::CURVE, 1, KPlotObject::SOLID );
105 orbit[1] = new KPlotObject( "europa", colEu, KPlotObject::CURVE, 1, KPlotObject::SOLID );
106 orbit[2] = new KPlotObject( "ganymede", colGn, KPlotObject::CURVE, 1, KPlotObject::SOLID );
107 orbit[3] = new KPlotObject( "callisto", colCa, KPlotObject::CURVE, 1, KPlotObject::SOLID );
108 jpath = new KPlotObject( "jupiter", colJp, KPlotObject::CURVE, 1, KPlotObject::SOLID );
110 double dy = 0.01*pw->dataHeight();
112 //t is the offset from jd0, in hours.
113 for ( double t=pw->y(); t<=pw->y2(); t+=dy ) {
114 KSNumbers num( jd0 + t/24.0 );
115 jm.findPosition( &num, jup, ksun );
117 //jm.x(i) tells the offset from Jupiter, in units of Jupiter's angular radius.
118 //multiply by 0.5*jup->angSize() to get arcminutes
119 for ( unsigned int i=0; i<4; ++i )
120 orbit[i]->addPoint( new DPoint( 0.5*jup->angSize()*jm.x(i), t ) );
122 jpath->addPoint( new DPoint( 0.0, t ) );
125 for ( unsigned int i=0; i<4; ++i )
126 pw->addObject( orbit[i] );
128 pw->addObject( jpath );
131 void JMoonTool::keyPressEvent( QKeyEvent *e ) {
132 switch ( e->key() ) {
133 case Key_BracketRight:
135 double dy = 0.02*pw->dataHeight();
136 pw->setLimits( pw->x(), pw->x2(), pw->y()+dy, pw->y2()+dy );
137 initPlotObjects();
138 pw->update();
139 break;
141 case Key_BracketLeft:
143 double dy = 0.02*pw->dataHeight();
144 pw->setLimits( pw->x(), pw->x2(), pw->y()-dy, pw->y2()-dy );
145 initPlotObjects();
146 pw->update();
147 break;
149 case Key_Plus:
150 case Key_Equal:
152 if ( pw->dataHeight() > 48.0 ) {
153 double dy = 0.45*pw->dataHeight();
154 double y0 = pw->y() + 0.5*pw->dataHeight();
155 pw->setLimits( pw->x(), pw->x2(), y0-dy, y0+dy );
156 initPlotObjects();
157 pw->update();
159 break;
161 case Key_Minus:
162 case Key_Underscore:
164 if ( pw->dataHeight() < 960.0 ) {
165 double dy = 0.55*pw->dataHeight();
166 double y0 = pw->y() + 0.5*pw->dataHeight();
167 pw->setLimits( pw->x(), pw->x2(), y0-dy, y0+dy );
168 initPlotObjects();
169 pw->update();
171 break;
173 case Key_Escape:
175 close();
176 break;
179 default: { e->ignore(); break; }
183 #include "jmoontool.moc"