• Skip to content
  • Skip to link menu
KDE 3.5 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

kstars

deepskyobject.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002                           deepskyobject.cpp  -  K Desktop Planetarium
00003                              -------------------
00004     begin                : Sun Feb 11 2001
00005     copyright            : (C) 2001 by Jason Harris
00006     email                : jharris@30doradus.org
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
00015  *                                                                         *
00016  ***************************************************************************/
00017 
00018 #include <kglobal.h>
00019 
00020 #include <qfile.h>
00021 #include <qregexp.h>
00022 #include <qpainter.h>
00023 #include <qimage.h>
00024 #include <qstring.h>
00025 
00026 #include "deepskyobject.h"
00027 #include "kstarsdata.h"
00028 #include "ksutils.h"
00029 #include "dms.h"
00030 #include "kspopupmenu.h"
00031 
00032 DeepSkyObject::DeepSkyObject( DeepSkyObject &o )
00033     : SkyObject( o ) {
00034     MajorAxis = o.a();
00035     MinorAxis = o.b();
00036     PositionAngle = o.pa();
00037     UGC = o.ugc();
00038     PGC = o.pgc();
00039     setCatalog( o.catalog() );
00040     Image = o.image();
00041 }
00042 
00043 DeepSkyObject::DeepSkyObject( int t, dms r, dms d, float m,
00044             QString n, QString n2, QString lname, QString cat,
00045             float a, float b, double pa, int pgc, int ugc )
00046     : SkyObject( t, r, d, m, n, n2, lname ) {
00047     MajorAxis = a;
00048     MinorAxis = b;
00049     PositionAngle = pa;
00050     PGC = pgc;
00051     UGC = ugc;
00052     setCatalog( cat );
00053     Image = 0;
00054 }
00055 
00056 DeepSkyObject::DeepSkyObject( int t, double r, double d, float m,
00057             QString n, QString n2, QString lname, QString cat,
00058             float a, float b, double pa, int pgc, int ugc )
00059     : SkyObject( t, r, d, m, n, n2, lname ) {
00060     MajorAxis = a;
00061     MinorAxis = b;
00062     PositionAngle = pa;
00063     PGC = pgc;
00064     UGC = ugc;
00065     setCatalog( cat );
00066     Image = 0;
00067 }
00068 
00069 float DeepSkyObject::e( void ) const {
00070     if ( MajorAxis==0.0 || MinorAxis==0.0 ) return 1.0; //assume circular
00071     return MinorAxis / MajorAxis;
00072 }
00073 
00074 QString DeepSkyObject::catalog() const {
00075     if ( isCatalogM() ) return QString("M");
00076     if ( isCatalogNGC() ) return QString("NGC");
00077     if ( isCatalogIC() ) return QString("IC");
00078     return QString("");
00079 }
00080 
00081 void DeepSkyObject::setCatalog( const QString &cat ) {
00082     if ( cat.upper() == "M" ) Catalog = (unsigned char)CAT_MESSIER;
00083     else if ( cat.upper() == "NGC" ) Catalog = (unsigned char)CAT_NGC;
00084     else if ( cat.upper() == "IC"  ) Catalog = (unsigned char)CAT_IC;
00085     else Catalog = (unsigned char)CAT_UNKNOWN;
00086 }
00087 
00088 QImage* DeepSkyObject::readImage( void ) {
00089     QFile file;
00090     if ( Image==0 ) { //Image not currently set; try to load it from disk.
00091         QString fname = name().lower().replace( QRegExp(" "), "" ) + ".png";
00092 
00093         if ( KSUtils::openDataFile( file, fname ) ) {
00094             file.close();
00095             Image = new QImage( file.name(), "PNG" );
00096         }
00097     }
00098 
00099     return Image;
00100 }
00101 
00102 void DeepSkyObject::deleteImage() { delete Image; Image = 0; }
00103 
00104 void DeepSkyObject::drawSymbol( QPainter &psky, int x, int y, double PositionAngle, double zoom, double scale ) {
00105     // if size is 0.0 set it to 1.0, this are normally stars (type 0 and 1)
00106     // if we use size 0.0 the star wouldn't be drawn
00107     float majorAxis = a();
00108     if ( majorAxis == 0.0 ) {   majorAxis = 1.0; }
00109 
00110     int size = int( scale * majorAxis * dms::PI * zoom / 10800.0 );
00111     int dx1 = -size/2;
00112     int dx2 =  size/2;
00113     int dy1 = int( -1.0*e()*size/2 );
00114     int dy2 = int( e()*size/2 );
00115     int x1 = x + dx1;
00116     int x2 = x + dx2;
00117     int y1 = y + dy1;
00118     int y2 = y + dy2;
00119 
00120     int dxa = -size/4;
00121     int dxb =  size/4;
00122     int dya = int( -1.0*e()*size/4 );
00123     int dyb = int( e()*size/4 );
00124     int xa = x + dxa;
00125     int xb = x + dxb;
00126     int ya = y + dya;
00127     int yb = y + dyb;
00128 
00129     int psize;
00130 
00131     QBrush tempBrush;
00132     
00133     switch ( type() ) {
00134         case 0:
00135         case 1: //catalog star
00136             //Some NGC/IC objects are stars...changed their type to 1 (was double star)
00137             if (size<2) size = 2;
00138             psky.drawEllipse( x1, y1, size/2, size/2 );
00139             break;
00140         case 2: //Planet
00141             break;
00142         case 3: //Open cluster
00143             tempBrush = psky.brush();
00144             psky.setBrush( psky.pen().color() );
00145             psize = 2;
00146             if ( size > 50 )  psize *= 2;
00147             if ( size > 100 ) psize *= 2;
00148             psky.drawEllipse( xa, y1, psize, psize ); // draw circle of points
00149             psky.drawEllipse( xb, y1, psize, psize );
00150             psky.drawEllipse( xa, y2, psize, psize );
00151             psky.drawEllipse( xb, y2, psize, psize );
00152             psky.drawEllipse( x1, ya, psize, psize );
00153             psky.drawEllipse( x1, yb, psize, psize );
00154             psky.drawEllipse( x2, ya, psize, psize );
00155             psky.drawEllipse( x2, yb, psize, psize );
00156             psky.setBrush( tempBrush );
00157             break;
00158         case 4: //Globular Cluster
00159             if (size<2) size = 2;
00160             psky.save();
00161             psky.translate( x, y );
00162             psky.rotate( PositionAngle );  //rotate the coordinate system
00163             psky.drawEllipse( dx1, dy1, size, int( e()*size ) );
00164             psky.moveTo( 0, dy1 );
00165             psky.lineTo( 0, dy2 );
00166             psky.moveTo( dx1, 0 );
00167             psky.lineTo( dx2, 0 );
00168             psky.restore(); //reset coordinate system
00169             break;
00170         case 5: //Gaseous Nebula
00171             if (size <2) size = 2;
00172             psky.save();
00173             psky.translate( x, y );
00174             psky.rotate( PositionAngle );  //rotate the coordinate system
00175             psky.drawLine( dx1, dy1, dx2, dy1 );
00176             psky.drawLine( dx2, dy1, dx2, dy2 );
00177             psky.drawLine( dx2, dy2, dx1, dy2 );
00178             psky.drawLine( dx1, dy2, dx1, dy1 );
00179             psky.restore(); //reset coordinate system
00180             break;
00181         case 6: //Planetary Nebula
00182             if (size<2) size = 2;
00183             psky.save();
00184             psky.translate( x, y );
00185             psky.rotate( PositionAngle );  //rotate the coordinate system
00186             psky.drawEllipse( dx1, dy1, size, int( e()*size ) );
00187             psky.moveTo( 0, dy1 );
00188             psky.lineTo( 0, dy1 - int( e()*size/2 ) );
00189             psky.moveTo( 0, dy2 );
00190             psky.lineTo( 0, dy2 + int( e()*size/2 ) );
00191             psky.moveTo( dx1, 0 );
00192             psky.lineTo( dx1 - size/2, 0 );
00193             psky.moveTo( dx2, 0 );
00194             psky.lineTo( dx2 + size/2, 0 );
00195             psky.restore(); //reset coordinate system
00196             break;
00197         case 7: //Supernova remnant
00198             if (size<2) size = 2;
00199             psky.save();
00200             psky.translate( x, y );
00201             psky.rotate( PositionAngle );  //rotate the coordinate system
00202             psky.moveTo( 0, dy1 );
00203             psky.lineTo( dx2, 0 );
00204             psky.lineTo( 0, dy2 );
00205             psky.lineTo( dx1, 0 );
00206             psky.lineTo( 0, dy1 );
00207             psky.restore(); //reset coordinate system
00208             break;
00209         case 8: //Galaxy
00210             if ( size <1 && zoom > 20*MINZOOM ) size = 3; //force ellipse above zoomFactor 20
00211             if ( size <1 && zoom > 5*MINZOOM ) size = 1; //force points above zoomFactor 5
00212             if ( size>2 ) {
00213                 psky.save();
00214                 psky.translate( x, y );
00215                 psky.rotate( PositionAngle );  //rotate the coordinate system
00216                 psky.drawEllipse( dx1, dy1, size, int( e()*size ) );
00217                 psky.restore(); //reset coordinate system
00218 
00219             } else if ( size>0 ) {
00220                 psky.drawPoint( x, y );
00221             }
00222             break;
00223     }
00224 }
00225 
00226 void DeepSkyObject::drawImage( QPainter &psky, int x, int y, double PositionAngle, double zoom, double scale ) {
00227     QImage *image = readImage();
00228     QImage ScaledImage;
00229     
00230     if ( image ) {
00231         int w = int( a() * scale * dms::PI * zoom/10800.0 );
00232 
00233         if ( w < 0.75*psky.window().width() ) {
00234             int h = int( w*image->height()/image->width() ); //preserve image's aspect ratio
00235             int dx = int( 0.5*w );
00236             int dy = int( 0.5*h );
00237             ScaledImage = image->smoothScale( w, h );
00238             psky.save();
00239             psky.translate( x, y );
00240             psky.rotate( PositionAngle );  //rotate the coordinate system
00241             psky.drawImage( -dx, -dy, ScaledImage );
00242             psky.restore();
00243         }
00244     }
00245 }

kstars

Skip menu "kstars"
  • Main Page
  • Modules
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

API Reference

Skip menu "API Reference"
  • keduca
  • kstars
Generated for API Reference by doxygen 1.5.9
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal