00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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;
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 ) {
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
00106
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:
00136
00137 if (size<2) size = 2;
00138 psky.drawEllipse( x1, y1, size/2, size/2 );
00139 break;
00140 case 2:
00141 break;
00142 case 3:
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 );
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:
00159 if (size<2) size = 2;
00160 psky.save();
00161 psky.translate( x, y );
00162 psky.rotate( PositionAngle );
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();
00169 break;
00170 case 5:
00171 if (size <2) size = 2;
00172 psky.save();
00173 psky.translate( x, y );
00174 psky.rotate( PositionAngle );
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();
00180 break;
00181 case 6:
00182 if (size<2) size = 2;
00183 psky.save();
00184 psky.translate( x, y );
00185 psky.rotate( PositionAngle );
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();
00196 break;
00197 case 7:
00198 if (size<2) size = 2;
00199 psky.save();
00200 psky.translate( x, y );
00201 psky.rotate( PositionAngle );
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();
00208 break;
00209 case 8:
00210 if ( size <1 && zoom > 20*MINZOOM ) size = 3;
00211 if ( size <1 && zoom > 5*MINZOOM ) size = 1;
00212 if ( size>2 ) {
00213 psky.save();
00214 psky.translate( x, y );
00215 psky.rotate( PositionAngle );
00216 psky.drawEllipse( dx1, dy1, size, int( e()*size ) );
00217 psky.restore();
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() );
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 );
00241 psky.drawImage( -dx, -dy, ScaledImage );
00242 psky.restore();
00243 }
00244 }
00245 }