From bf48a441c9a81b3415b7d49be3ae3078687b1ae0 Mon Sep 17 00:00:00 2001
From: Luc Maisonobe <luc@orekit.org>
Date: Tue, 29 Apr 2014 11:43:44 +0200
Subject: [PATCH] First working version of inverse localization.

It works in simple cases (no light time correction and no aberration of
light correction), and is still really slow.
---
 .../java/org/orekit/rugged/api/Rugged.java    |  8 +++----
 .../org/orekit/rugged/api/RuggedTest.java     | 22 +++++++++++--------
 2 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/src/main/java/org/orekit/rugged/api/Rugged.java b/src/main/java/org/orekit/rugged/api/Rugged.java
index 51bddcd3..8d79f3cf 100644
--- a/src/main/java/org/orekit/rugged/api/Rugged.java
+++ b/src/main/java/org/orekit/rugged/api/Rugged.java
@@ -63,7 +63,7 @@ import org.orekit.utils.PVCoordinatesProvider;
 public class Rugged {
 
     /** Absolute accuracy to use for inverse localization. */
-    private static final double INVERSE_LOCALIZATION_ACCURACY = 1.0e-4;
+    private static final double INVERSE_LOCALIZATION_ACCURACY = 1.0e-8;
 
     /** Maximum number of evaluations for inverse localization. */
     private static final int INVERSE_LOCALIZATION_MAX_EVAL = 1000;
@@ -591,7 +591,7 @@ public class Rugged {
             checkContext();
             final Sensor   sensor = getSensor(sensorName);
             final Vector3D target = ellipsoid.transform(groundPoint);
-            final UnivariateSolver solver = new BracketingNthOrderBrentSolver(INVERSE_LOCALIZATION_ACCURACY, 5);
+            final UnivariateSolver solver = new BracketingNthOrderBrentSolver(0.0, INVERSE_LOCALIZATION_ACCURACY, 5);
 
             // find the line at which ground point crosses sensor mean plane
             final SensorMeanPlaneCrossing planeCrossing = new SensorMeanPlaneCrossing(sensor, target);
@@ -642,7 +642,7 @@ public class Rugged {
         @Override
         public double value(final double lineNumber) throws OrekitExceptionWrapper {
             // the target crosses the mean plane if it orthogonal to the normal vector
-            return Vector3D.dotProduct(targetDirection(lineNumber), sensor.getMeanPlaneNormal());
+            return Vector3D.angle(targetDirection(lineNumber), sensor.getMeanPlaneNormal()) - 0.5 * FastMath.PI;
         }
 
         /** Compute target point direction in spacecraft frame, at line acquisition time.
@@ -716,7 +716,7 @@ public class Rugged {
         /** {@inheritDoc} */
         @Override
         public double value(final double x) {
-            return Vector3D.dotProduct(cross, getLOS(x));
+            return Vector3D.angle(cross, getLOS(x)) - 0.5 * FastMath.PI;
         }
 
         /** Interpolate sensor pixels at some pixel index.
diff --git a/src/test/java/org/orekit/rugged/api/RuggedTest.java b/src/test/java/org/orekit/rugged/api/RuggedTest.java
index abf3b3a1..426738f1 100644
--- a/src/test/java/org/orekit/rugged/api/RuggedTest.java
+++ b/src/test/java/org/orekit/rugged/api/RuggedTest.java
@@ -63,6 +63,8 @@ import org.orekit.propagation.SpacecraftState;
 import org.orekit.propagation.analytical.KeplerianPropagator;
 import org.orekit.propagation.numerical.NumericalPropagator;
 import org.orekit.rugged.core.raster.RandomLandscapeUpdater;
+import org.orekit.rugged.core.raster.SimpleTileFactory;
+import org.orekit.rugged.core.raster.Tile;
 import org.orekit.rugged.core.raster.VolcanicConeElevationUpdater;
 import org.orekit.time.AbsoluteDate;
 import org.orekit.time.TimeScalesFactory;
@@ -499,16 +501,18 @@ public class RuggedTest {
                                    InertialFrameId.EME2000,
                                    BodyRotatingFrameId.ITRF,
                                    ephemeris);
+        rugged.setLightTimeCorrection(false);
+        rugged.setAberrationOfLightCorrection(false);
         rugged.setLineSensor("line", los, lineDatation);
-        GeodeticPoint[] gp = rugged.directLocalization("line", 100.24);
-
-        GeodeticPoint target =
-                new GeodeticPoint(0.75 * gp[17].getLatitude()  + 0.25 * gp[18].getLatitude(),
-                                  0.75 * gp[17].getLongitude() + 0.25 * gp[18].getLongitude(),
-                                  0.75 * gp[17].getAltitude()  + 0.25 * gp[18].getAltitude());
-        SensorPixel sp = rugged.inverseLocalization("line", target, 0.0, 200.0);
-        Assert.assertEquals(100.24, sp.getLineNumber(),  1.0e-10);
-        Assert.assertEquals( 17.25, sp.getPixelNumber(), 1.0e-10);
+
+        double referenceLine  = 100.00;
+        GeodeticPoint[] gp = rugged.directLocalization("line", referenceLine);
+
+        for (int i = 1; i < gp.length; ++i) {
+            SensorPixel sp = rugged.inverseLocalization("line", gp[i], 0, dimension);
+            Assert.assertEquals(referenceLine,  sp.getLineNumber(),  3.0e-9);
+            Assert.assertEquals(i,              sp.getPixelNumber(), 8.0e-5);
+        }
 
     }
 
-- 
GitLab