[Kstars-devel] KDE/kdeedu/kstars/kstars/tools

Akarsh Simha akarshsimha at gmail.com
Wed Jul 2 14:33:34 CEST 2008


SVN commit 827206 by asimha:

Making major bugfixes to the conjunction tool.

+ Applying Jason's patch. Thanks Jason!

+ Jason's patch revealed a few more bugs, fixing them.

+ Reducing the tolerance of findPrecise() to 1 minute instead of 1
  hour, so that predictions are accurate enough even with the moon.

CCMAIL: kstars-devel at kde.org



 M  +51 -20    ksconjunct.cpp  


--- trunk/KDE/kdeedu/kstars/kstars/tools/ksconjunct.cpp #827205:827206
@@ -35,46 +35,74 @@
   QPair<long double, dms> extremum;
   dms Dist;
   dms prevDist;
-  double step;
+  double step, step0;
   int Sign, prevSign;
-  long double jd;
 
-  jd = startJD;
   ksdata = KStarsData::Instance();
-  prevDist = findDistance(jd, &Object1, &Object2);
   //  kDebug() << "Entered KSConjunct::findClosestApproach() with startJD = " << (double)startJD;
   //  kDebug() << "Initial Positional Information: \n";
   //  kDebug() << Object1.name() << ": RA = " << Object1.ra() -> toHMSString() << "; Dec = " << Object1.dec() -> toDMSString() << "\n";
   //  kDebug() << Object2.name() << ": RA = " << Object2.ra() -> toHMSString() << "; Dec = " << Object2.dec() -> toDMSString() << "\n";
   prevSign = 0;
   
-  step = (stopJD - startJD) / 4.0;
+  step0 = (stopJD - startJD) / 4.0;
   if(Object1.name() == "Mars" || Object2.name() == "Mars")
-    if (step > 10.0)
-      step = 10.0;
+    if (step0 > 10.0)
+      step0 = 10.0;
   if(Object1.name() == "Venus" || Object1.name() == "Mercury" || Object2.name() == "Mercury" || Object2.name() == "Venus") 
-    if (step > 5.0)
-      step = 5.0;
+    if (step0 > 5.0)
+      step0 = 5.0;
   if(Object1.name() == "Moon" || Object2.name() == "Moon")
-    if (step > 0.25)
-      step = 0.25;
+    if (step0 > 0.25)
+      step0 = 0.25;
 
+  step = step0;
+  
   //  kDebug() << "Initial Separation between " << Object1.name() << " and " << Object2.name() << " = " << (prevDist.toDMSString());
 
-  for(jd = startJD + step; jd <= stopJD; jd += step) {
+  long double jd = startJD;
+  prevDist = findDistance(jd, &Object1, &Object2);
+  jd += step;
+  while ( jd <= stopJD ) {
     Dist = findDistance(jd, &Object1, &Object2);
-    //    kDebug() << "Dist = " << Dist.toDMSString() << "; prevDist = " << prevDist.toDMSString() << "; Difference = " << (Dist - prevDist).toDMSString();
     Sign = sgn(Dist.Degrees() - prevDist.Degrees()); 
+    //    kDebug() << "Dist = " << Dist.toDMSString() << "; prevDist = " << prevDist.toDMSString() << "; Difference = " << (Dist.Degrees() - prevDist.Degrees()) << "; Step = " << step;
 
-    if( Sign != prevSign ) {   
-      //      kDebug() << "Sign = " << Sign << " and " << "prevSign = " << prevSign << ": Entering findPrecise()\n";
-      if(findPrecise(&extremum, &Object1, &Object2, jd, step, prevSign))
-        if(extremum.second.radians() < maxSeparation.radians())
-          Separations.insert(extremum.first, extremum.second);
+    //How close are we to a conjunction, and how fast are we approaching one?
+    double factor = fabs( Dist.Degrees() / (Dist.Degrees() - prevDist.Degrees()) );
+    if ( factor > 10.0 ) { //let's go faster!
+        step = step0 * factor/10.0;
+    } else { //slow down, we're getting close!
+        step = step0;
     }
+    
+    if( Sign != prevSign && prevSign == -1) { //all right, we may have just passed a conjunction
+        if ( step > step0 ) { //mini-loop to back up and make sure we're close enough
+            //            kDebug() << "Entering slow loop: " << endl;
+            jd -= step;
+            step = step0;
+            Sign = prevSign;
+            while ( jd <= stopJD ) {
+                Dist = findDistance(jd, &Object1, &Object2);
+                Sign = sgn(Dist.Degrees() - prevDist.Degrees()); 
+                //                kDebug() << "Dist=" << Dist.toDMSString() << "; prevDist=" << prevDist.toDMSString() << "; Diff=" << (Dist.Degrees() - prevDist.Degrees()) << "djd=" << (int)(jd - startJD);
+                if ( Sign != prevSign ) break;
+                
+                prevDist = Dist;
+                prevSign = Sign;
+                jd += step;
+            }
+        }
+        
+        //        kDebug() << "Sign = " << Sign << " and " << "prevSign = " << prevSign << ": Entering findPrecise()\n";
+        if(findPrecise(&extremum, &Object1, &Object2, jd, step, Sign))
+            if(extremum.second.radians() < maxSeparation.radians())
+                Separations.insert(extremum.first, extremum.second);
+    }
 
     prevDist = Dist;
     prevSign = Sign;
+    jd += step;
   }
 
   return Separations;
@@ -108,7 +136,7 @@
   dms Dist;
 
   if( out == NULL ) {
-    kDebug() << "Argument out to KSConjunct::findPrecise(...) was NULL!";
+    kDebug() << "ERROR: Argument out to KSConjunct::findPrecise(...) was NULL!";
     return false;
   }
 
@@ -120,8 +148,9 @@
   while(true) {
     jd += step;
     Dist = findDistance(jd, Object1, Object2);
+    //    kDebug() << "Dist=" << Dist.toDMSString() << "; prevDist=" << prevDist.toDMSString() << "; Diff=" << (Dist.Degrees() - prevDist.Degrees()) << "step=" << step;
 
-    if(fabs(step) < 1.0 / 24.0) {
+    if(fabs(step) < 1.0 / (24.0 * 60.0) ) {
       out -> first = jd - step / 2.0;
       out -> second = findDistance(jd - step/2.0, Object1, Object2);
       if(out -> second.radians() < findDistance(jd - 5.0, Object1, Object2).radians())
@@ -147,3 +176,5 @@
   return ((a.radians() > 0)?1:((a.radians() < 0)?-1:0));
 
 }
+
+


More information about the Kstars-devel mailing list