/*************************************************************************** deepskyobject.cpp - Trinity 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 #include #include #include #include #include #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, TQString n, TQString n2, TQString lname, TQString 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, TQString n, TQString n2, TQString lname, TQString 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; } TQString DeepSkyObject::catalog() const { if ( isCatalogM() ) return TQString("M"); if ( isCatalogNGC() ) return TQString("NGC"); if ( isCatalogIC() ) return TQString("IC"); return TQString(""); } void DeepSkyObject::setCatalog( const TQString &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; } TQImage* DeepSkyObject::readImage( void ) { TQFile file; if ( Image==0 ) { //Image not currently set; try to load it from disk. TQString fname = name().lower().replace( TQRegExp(" "), "" ) + ".png"; if ( KSUtils::openDataFile( file, fname ) ) { file.close(); Image = new TQImage( file.name(), "PNG" ); } } return Image; } void DeepSkyObject::deleteImage() { delete Image; Image = 0; } void DeepSkyObject::drawSymbol( TQPainter &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; TQBrush 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( TQPainter &psky, int x, int y, double PositionAngle, double zoom, double scale ) { TQImage *image = readImage(); TQImage 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(); } } }