summaryrefslogtreecommitdiffstats
path: root/kstars/kstars/deepskyobject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kstars/kstars/deepskyobject.cpp')
-rw-r--r--kstars/kstars/deepskyobject.cpp245
1 files changed, 245 insertions, 0 deletions
diff --git a/kstars/kstars/deepskyobject.cpp b/kstars/kstars/deepskyobject.cpp
new file mode 100644
index 00000000..b189404f
--- /dev/null
+++ b/kstars/kstars/deepskyobject.cpp
@@ -0,0 +1,245 @@
+/***************************************************************************
+ deepskyobject.cpp - K Desktop Planetarium
+ -------------------
+ begin : Sun Feb 11 2001
+ copyright : (C) 2001 by Jason Harris
+ email : jharris@30doradus.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <kglobal.h>
+
+#include <qfile.h>
+#include <qregexp.h>
+#include <qpainter.h>
+#include <qimage.h>
+#include <qstring.h>
+
+#include "deepskyobject.h"
+#include "kstarsdata.h"
+#include "ksutils.h"
+#include "dms.h"
+#include "kspopupmenu.h"
+
+DeepSkyObject::DeepSkyObject( DeepSkyObject &o )
+ : SkyObject( o ) {
+ MajorAxis = o.a();
+ MinorAxis = o.b();
+ PositionAngle = o.pa();
+ UGC = o.ugc();
+ PGC = o.pgc();
+ setCatalog( o.catalog() );
+ Image = o.image();
+}
+
+DeepSkyObject::DeepSkyObject( int t, dms r, dms d, float m,
+ QString n, QString n2, QString lname, QString cat,
+ float a, float b, double pa, int pgc, int ugc )
+ : SkyObject( t, r, d, m, n, n2, lname ) {
+ MajorAxis = a;
+ MinorAxis = b;
+ PositionAngle = pa;
+ PGC = pgc;
+ UGC = ugc;
+ setCatalog( cat );
+ Image = 0;
+}
+
+DeepSkyObject::DeepSkyObject( int t, double r, double d, float m,
+ QString n, QString n2, QString lname, QString cat,
+ float a, float b, double pa, int pgc, int ugc )
+ : SkyObject( t, r, d, m, n, n2, lname ) {
+ MajorAxis = a;
+ MinorAxis = b;
+ PositionAngle = pa;
+ PGC = pgc;
+ UGC = ugc;
+ setCatalog( cat );
+ Image = 0;
+}
+
+float DeepSkyObject::e( void ) const {
+ if ( MajorAxis==0.0 || MinorAxis==0.0 ) return 1.0; //assume circular
+ return MinorAxis / MajorAxis;
+}
+
+QString DeepSkyObject::catalog() const {
+ if ( isCatalogM() ) return QString("M");
+ if ( isCatalogNGC() ) return QString("NGC");
+ if ( isCatalogIC() ) return QString("IC");
+ return QString("");
+}
+
+void DeepSkyObject::setCatalog( const QString &cat ) {
+ if ( cat.upper() == "M" ) Catalog = (unsigned char)CAT_MESSIER;
+ else if ( cat.upper() == "NGC" ) Catalog = (unsigned char)CAT_NGC;
+ else if ( cat.upper() == "IC" ) Catalog = (unsigned char)CAT_IC;
+ else Catalog = (unsigned char)CAT_UNKNOWN;
+}
+
+QImage* DeepSkyObject::readImage( void ) {
+ QFile file;
+ if ( Image==0 ) { //Image not currently set; try to load it from disk.
+ QString fname = name().lower().replace( QRegExp(" "), "" ) + ".png";
+
+ if ( KSUtils::openDataFile( file, fname ) ) {
+ file.close();
+ Image = new QImage( file.name(), "PNG" );
+ }
+ }
+
+ return Image;
+}
+
+void DeepSkyObject::deleteImage() { delete Image; Image = 0; }
+
+void DeepSkyObject::drawSymbol( QPainter &psky, int x, int y, double PositionAngle, double zoom, double scale ) {
+ // if size is 0.0 set it to 1.0, this are normally stars (type 0 and 1)
+ // if we use size 0.0 the star wouldn't be drawn
+ float majorAxis = a();
+ if ( majorAxis == 0.0 ) { majorAxis = 1.0; }
+
+ int size = int( scale * majorAxis * dms::PI * zoom / 10800.0 );
+ int dx1 = -size/2;
+ int dx2 = size/2;
+ int dy1 = int( -1.0*e()*size/2 );
+ int dy2 = int( e()*size/2 );
+ int x1 = x + dx1;
+ int x2 = x + dx2;
+ int y1 = y + dy1;
+ int y2 = y + dy2;
+
+ int dxa = -size/4;
+ int dxb = size/4;
+ int dya = int( -1.0*e()*size/4 );
+ int dyb = int( e()*size/4 );
+ int xa = x + dxa;
+ int xb = x + dxb;
+ int ya = y + dya;
+ int yb = y + dyb;
+
+ int psize;
+
+ QBrush tempBrush;
+
+ switch ( type() ) {
+ case 0:
+ case 1: //catalog star
+ //Some NGC/IC objects are stars...changed their type to 1 (was double star)
+ if (size<2) size = 2;
+ psky.drawEllipse( x1, y1, size/2, size/2 );
+ break;
+ case 2: //Planet
+ break;
+ case 3: //Open cluster
+ tempBrush = psky.brush();
+ psky.setBrush( psky.pen().color() );
+ psize = 2;
+ if ( size > 50 ) psize *= 2;
+ if ( size > 100 ) psize *= 2;
+ psky.drawEllipse( xa, y1, psize, psize ); // draw circle of points
+ psky.drawEllipse( xb, y1, psize, psize );
+ psky.drawEllipse( xa, y2, psize, psize );
+ psky.drawEllipse( xb, y2, psize, psize );
+ psky.drawEllipse( x1, ya, psize, psize );
+ psky.drawEllipse( x1, yb, psize, psize );
+ psky.drawEllipse( x2, ya, psize, psize );
+ psky.drawEllipse( x2, yb, psize, psize );
+ psky.setBrush( tempBrush );
+ break;
+ case 4: //Globular Cluster
+ if (size<2) size = 2;
+ psky.save();
+ psky.translate( x, y );
+ psky.rotate( PositionAngle ); //rotate the coordinate system
+ psky.drawEllipse( dx1, dy1, size, int( e()*size ) );
+ psky.moveTo( 0, dy1 );
+ psky.lineTo( 0, dy2 );
+ psky.moveTo( dx1, 0 );
+ psky.lineTo( dx2, 0 );
+ psky.restore(); //reset coordinate system
+ break;
+ case 5: //Gaseous Nebula
+ if (size <2) size = 2;
+ psky.save();
+ psky.translate( x, y );
+ psky.rotate( PositionAngle ); //rotate the coordinate system
+ psky.drawLine( dx1, dy1, dx2, dy1 );
+ psky.drawLine( dx2, dy1, dx2, dy2 );
+ psky.drawLine( dx2, dy2, dx1, dy2 );
+ psky.drawLine( dx1, dy2, dx1, dy1 );
+ psky.restore(); //reset coordinate system
+ break;
+ case 6: //Planetary Nebula
+ if (size<2) size = 2;
+ psky.save();
+ psky.translate( x, y );
+ psky.rotate( PositionAngle ); //rotate the coordinate system
+ psky.drawEllipse( dx1, dy1, size, int( e()*size ) );
+ psky.moveTo( 0, dy1 );
+ psky.lineTo( 0, dy1 - int( e()*size/2 ) );
+ psky.moveTo( 0, dy2 );
+ psky.lineTo( 0, dy2 + int( e()*size/2 ) );
+ psky.moveTo( dx1, 0 );
+ psky.lineTo( dx1 - size/2, 0 );
+ psky.moveTo( dx2, 0 );
+ psky.lineTo( dx2 + size/2, 0 );
+ psky.restore(); //reset coordinate system
+ break;
+ case 7: //Supernova remnant
+ if (size<2) size = 2;
+ psky.save();
+ psky.translate( x, y );
+ psky.rotate( PositionAngle ); //rotate the coordinate system
+ psky.moveTo( 0, dy1 );
+ psky.lineTo( dx2, 0 );
+ psky.lineTo( 0, dy2 );
+ psky.lineTo( dx1, 0 );
+ psky.lineTo( 0, dy1 );
+ psky.restore(); //reset coordinate system
+ break;
+ case 8: //Galaxy
+ if ( size <1 && zoom > 20*MINZOOM ) size = 3; //force ellipse above zoomFactor 20
+ if ( size <1 && zoom > 5*MINZOOM ) size = 1; //force points above zoomFactor 5
+ if ( size>2 ) {
+ psky.save();
+ psky.translate( x, y );
+ psky.rotate( PositionAngle ); //rotate the coordinate system
+ psky.drawEllipse( dx1, dy1, size, int( e()*size ) );
+ psky.restore(); //reset coordinate system
+
+ } else if ( size>0 ) {
+ psky.drawPoint( x, y );
+ }
+ break;
+ }
+}
+
+void DeepSkyObject::drawImage( QPainter &psky, int x, int y, double PositionAngle, double zoom, double scale ) {
+ QImage *image = readImage();
+ QImage ScaledImage;
+
+ if ( image ) {
+ int w = int( a() * scale * dms::PI * zoom/10800.0 );
+
+ if ( w < 0.75*psky.window().width() ) {
+ int h = int( w*image->height()/image->width() ); //preserve image's aspect ratio
+ int dx = int( 0.5*w );
+ int dy = int( 0.5*h );
+ ScaledImage = image->smoothScale( w, h );
+ psky.save();
+ psky.translate( x, y );
+ psky.rotate( PositionAngle ); //rotate the coordinate system
+ psky.drawImage( -dx, -dy, ScaledImage );
+ psky.restore();
+ }
+ }
+}