[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdeedu/kstars/kstars
From:       Alexey Khudyakov <alexey.skladnoy () gmail ! com>
Date:       2011-03-11 16:56:07
Message-ID: 20110311165607.CD644AC8CE () svn ! kde ! org
[Download RAW message or body]

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 <QRegExp>
 #include <kdebug.h>
+#include <QMap>
 
 #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<QChar,qint64> 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.
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic