From dd1c79a51fea7e140731100dca02b8abcd6965b8 Mon Sep 17 00:00:00 2001
From: Luc Maisonobe <luc@orekit.org>
Date: Wed, 14 May 2014 09:29:37 +0200
Subject: [PATCH] Fixed inverse localization.

---
 .../rugged/api/SensorMeanPlaneCrossing.java   | 41 ++++++++-----------
 .../org/orekit/rugged/api/RuggedTest.java     |  1 -
 2 files changed, 16 insertions(+), 26 deletions(-)

diff --git a/src/main/java/org/orekit/rugged/api/SensorMeanPlaneCrossing.java b/src/main/java/org/orekit/rugged/api/SensorMeanPlaneCrossing.java
index f211cc51..4be92b45 100644
--- a/src/main/java/org/orekit/rugged/api/SensorMeanPlaneCrossing.java
+++ b/src/main/java/org/orekit/rugged/api/SensorMeanPlaneCrossing.java
@@ -16,7 +16,7 @@
  */
 package org.orekit.rugged.api;
 
-import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 import org.apache.commons.math3.analysis.differentiation.DerivativeStructure;
@@ -33,17 +33,17 @@ import org.orekit.utils.PVCoordinates;
 /** Class dedicated to when ground point crosses mean sensor plane. */
 class SensorMeanPlaneCrossing {
 
-    /** Number of points for frames interpolation. */
-    private static final int INTERPOLATION_POINTS = 5;
+    /** Converter between spacecraft and body. */
+    private final SpacecraftToObservedBody scToBody;
 
     /** Line numbers of the middle sample point. */
-    private final int midLine;
+    private final double midLine;
 
     /** Transforms sample from observed body frame to inertial frame. */
     private final List<Transform> bodyToInertial;
 
-    /** Transforms sample from spacecraft frame to inertial frame. */
-    private final List<Transform> scToInertial;
+    /** Transform from inertial frame to spacecraft frame, for middle line. */
+    private final Transform midLineScToInert;
 
     /** Minimum line number in the search interval. */
     private final int minLine;
@@ -87,6 +87,7 @@ class SensorMeanPlaneCrossing {
         try {
 
             this.sensor                      = sensor;
+            this.scToBody                    = scToBody;
             this.minLine                     = minLine;
             this.maxLine                     = maxLine;
             this.lightTimeCorrection         = lightTimeCorrection;
@@ -94,21 +95,11 @@ class SensorMeanPlaneCrossing {
             this.maxEval                     = maxEval;
             this.accuracy                    = accuracy;
 
-            // compute one the transforms for middle line, as they will be reused
-            // as the start point for all searches
-            bodyToInertial = new ArrayList<Transform>(INTERPOLATION_POINTS);
-            scToInertial   = new ArrayList<Transform>(INTERPOLATION_POINTS);
-            int middle = -1;
-            for (int i = 0; i < INTERPOLATION_POINTS; ++i) {
-                final int line = (i * maxLine + (INTERPOLATION_POINTS - i) * minLine) / INTERPOLATION_POINTS;
-                if (i == INTERPOLATION_POINTS / 2) {
-                    middle = line;
-                }
-                final AbsoluteDate date = sensor.getDate(line);
-                bodyToInertial.add(scToBody.getInertialToBody(date).getInverse());
-                scToInertial.add(scToBody.getScToInertial(date));
-            }
-            midLine = middle;
+            midLine          = 0.5 * (minLine + maxLine);
+            bodyToInertial   = Arrays.asList(scToBody.getInertialToBody(sensor.getDate(minLine)).getInverse(),
+                                             scToBody.getInertialToBody(sensor.getDate(midLine)).getInverse(),
+                                             scToBody.getInertialToBody(sensor.getDate(maxLine)).getInverse());
+            midLineScToInert = scToBody.getScToInertial(sensor.getDate(midLine));
 
         } catch (OrekitException oe) {
             throw new RuggedException(oe, oe.getSpecifier(), oe.getParts());
@@ -184,8 +175,8 @@ class SensorMeanPlaneCrossing {
             // We expect two or three evaluations only. Each new evaluation shows up quickly in
             // the performances as it involves frames conversions
             double  crossingLine  = midLine;
-            Transform bodyToInert = bodyToInertial.get(INTERPOLATION_POINTS / 2);
-            Transform scToInert   = scToInertial.get(INTERPOLATION_POINTS / 2);
+            Transform bodyToInert = bodyToInertial.get(1);
+            Transform scToInert   = midLineScToInert;
             boolean atMin         = false;
             boolean atMax         = false;
             for (int i = 0; i < maxEval; ++i) {
@@ -224,8 +215,8 @@ class SensorMeanPlaneCrossing {
                 }
 
                 final AbsoluteDate date = sensor.getDate(crossingLine);
-                bodyToInert = Transform.interpolate(date, false, false, bodyToInertial);
-                scToInert   = Transform.interpolate(date, false, false, scToInertial);
+                bodyToInert = Transform.interpolate(date, true, true, bodyToInertial);
+                scToInert   = scToBody.getScToInertial(date);
             }
 
             return null;
diff --git a/src/test/java/org/orekit/rugged/api/RuggedTest.java b/src/test/java/org/orekit/rugged/api/RuggedTest.java
index f75497c1..982e087b 100644
--- a/src/test/java/org/orekit/rugged/api/RuggedTest.java
+++ b/src/test/java/org/orekit/rugged/api/RuggedTest.java
@@ -431,7 +431,6 @@ public class RuggedTest {
     // the following test is disabled by default
     // it is only used to check timings, and also create a small (2M) temporary file
     @Test
-    @Ignore
     public void testInverseLocalizationTiming()
         throws RuggedException, OrekitException, URISyntaxException {
 
-- 
GitLab