From kde-commits Fri Mar 11 16:56:07 2011 From: Alexey Khudyakov Date: Fri, 11 Mar 2011 16:56:07 +0000 To: kde-commits Subject: KDE/kdeedu/kstars/kstars Message-Id: <20110311165607.CD644AC8CE () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=129986263530925 SVN commit 1224506 by khudyakov: First implementation of UIDs for comets. It's messy and I presume buggy M +1 -1 skycomponents/cometscomponent.cpp M +75 -3 skyobjects/kscomet.cpp M +1 -0 skyobjects/kscomet.h M +1 -1 skyobjects/ksplanetbase.h --- trunk/KDE/kdeedu/kstars/kstars/skycomponents/cometscomponent.cpp #1224505:1224506 @@ -82,7 +82,7 @@ line = fileReader.readLine(); - name = line.mid( 3, 35 ).trimmed(); + name = line.mid( 0, 38 ).trimmed(); mJD = line.mid( 38, 5 ).toInt(); q = line.mid( 44, 10 ).toDouble(); e = line.mid( 55, 10 ).toDouble(); --- trunk/KDE/kdeedu/kstars/kstars/skyobjects/kscomet.cpp #1224505:1224506 @@ -17,19 +17,46 @@ #include "kscomet.h" +#include #include +#include #include "kstarsdata.h" #include "kstarsdatetime.h" #include "ksnumbers.h" #include "dms.h" +namespace { + int letterToNum(QChar c) + { + char l = c.toAscii(); + if( l < 'A' || l > 'Z' || l == 'I') + return 0; + if( l > 'I' ) + return l - 'A'; + return l - 'A' + 1; + } + // Convert letter designation like "AZ" to number. + int letterDesigToN(QString s) { + int n = 0; + foreach(QChar c, s) { + int nl = letterToNum(c); + if( nl == 0 ) + return 0; + n = n*25 + nl; + } + return n; + } + + QMap cometType; +} + KSComet::KSComet( const QString &_s, const QString &imfile, long double _JD, double _q, double _e, dms _i, dms _w, dms _Node, double Tp, float _H, float _G ) : KSPlanetBase(_s, imfile), JD(_JD), q(_q), e(_e), H(_H), G(_G), i(_i), w(_w), N(_Node) { - setType( 9 ); //Comet + setType( SkyObject::COMET ); //Find the Julian Day of Perihelion from Tp //Tp is a double which encodes a date like: YYYYMMDD.DDDDD (e.g., 19730521.33333 @@ -55,8 +82,54 @@ setName( name().mid( name().indexOf("/") + 1 ) ); } + // Try to calculate UID for comets. It's derived from comet designation. + // To parge name string regular exressions are used. Not really readable. + // And its make strong assumtions about format of comets' names. + // Probably come better algotrithm should be used. + + // Periodic comet. Designation like: 12P or 12P-C + QRegExp rePer("^(\\d+)[PD](-([A-Z]+))?"); + if( rePer.indexIn(_s) != -1 ) { + // Comet number + qint64 num = rePer.cap(1).toInt(); + // Fragment number + qint64 fragmentN = letterDesigToN( rePer.cap(2) ); + // Set UID + uidPart = num << 16 | fragmentN; + return; } + // Non periodic comet or comets with single approach + // Designations like C/(2006 A7) + QRegExp rePro("^([PCXDA])/.*\\((\\d{4}) ([A-Z])(\\d+)(-([A-Z]+))?\\)"); + if( rePro.indexIn(_s) != -1 ) { + // Fill comet type + if( cometType.empty() ) { + cometType.insert('P',0); + cometType.insert('C',1); + cometType.insert('X',2); + cometType.insert('D',3); + cometType.insert('A',4); + } + qint64 type = cometType[ rePro.cap(1)[0] ]; // Type of comet + qint64 year = rePro.cap(2).toInt(); // Year of discovery + qint64 halfMonth = letterToNum( rePro.cap(3)[0] ); + qint64 nHalfMonth = rePro.cap(4).toInt(); + qint64 fragment = letterDesigToN( rePro.cap(6) ); + + uidPart = + 1 << 43 | + type << 40 | // Bits 40-42 (3) + halfMonth << 33 | // Bits 33-39 (7) Hope this is enough + nHalfMonth << 28 | // Bits 28-32 (5) + year << 16 | // Bits 16-27 (12) + fragment; // Bits 0-15 (16) + return; + } + uidPart = 0; + kDebug() << "Didn't get it: " << _s; +} + KSComet* KSComet::clone() const { return new KSComet(*this); @@ -190,6 +263,5 @@ SkyObject::UID KSComet::getUID() const { - // FIXME: create sensible algorithm. - return SkyObject::invalidUID; + return solarsysUID(UID_SOL_COMET) | uidPart; } --- trunk/KDE/kdeedu/kstars/kstars/skyobjects/kscomet.h #1224505:1224506 @@ -142,6 +142,7 @@ float H, G; dms i, w, N; + qint64 uidPart; // Part of UID }; #endif --- trunk/KDE/kdeedu/kstars/kstars/skyobjects/ksplanetbase.h #1224505:1224506 @@ -208,7 +208,7 @@ static const UID UID_SOL_COMET; /** Compute high 32-bits of UID. */ - inline UID solarsysUID(UID type) const { return (SkyObject::UID_SOLARSYS << 60) | (type << 52); } + inline UID solarsysUID(UID type) const { return (SkyObject::UID_SOLARSYS << 60) | (type << 56); } /**@short find the object's current geocentric equatorial coordinates (RA and Dec) * This function is pure virtual; it must be overloaded by subclasses.