From 76754e0a3406b56c2003eede8ad40b606ceecd55 Mon Sep 17 00:00:00 2001
From: Luc Maisonobe <luc@orekit.org>
Date: Thu, 3 Sep 2015 17:30:07 +0200
Subject: [PATCH] =?UTF-8?q?Fixed=20an=20error=20with=20intersection=20impr?=
 =?UTF-8?q?ovement=20near=20180=C2=B0=20longitude.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../intersection/BasicScanAlgorithm.java      | 22 ++++++++++++++-----
 .../duvenhage/DuvenhageAlgorithm.java         | 21 +++++++++++++-----
 2 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/src/main/java/org/orekit/rugged/intersection/BasicScanAlgorithm.java b/src/main/java/org/orekit/rugged/intersection/BasicScanAlgorithm.java
index 743b4491..7a6301d2 100644
--- a/src/main/java/org/orekit/rugged/intersection/BasicScanAlgorithm.java
+++ b/src/main/java/org/orekit/rugged/intersection/BasicScanAlgorithm.java
@@ -136,7 +136,13 @@ public class BasicScanAlgorithm implements IntersectionAlgorithm {
                             final double        s         = Vector3D.dotProduct(delta, los) / los.getNormSq();
                             final GeodeticPoint projected = ellipsoid.transform(new Vector3D(1, position, s, los),
                                                                                 ellipsoid.getBodyFrame(), null);
-                            final NormalizedGeodeticPoint gpImproved = tile.cellIntersection(projected, ellipsoid.convertLos(projected, los), i, j);
+                            final NormalizedGeodeticPoint normalizedProjected = new NormalizedGeodeticPoint(projected.getLatitude(),
+                                                                                                            projected.getLongitude(),
+                                                                                                            projected.getAltitude(),
+                                                                                                            gp.getLongitude());
+                            final NormalizedGeodeticPoint gpImproved = tile.cellIntersection(normalizedProjected,
+                                                                                             ellipsoid.convertLos(normalizedProjected, los),
+                                                                                             i, j);
 
                             if (gpImproved != null) {
                                 final Vector3D point = ellipsoid.transform(gpImproved);
@@ -172,10 +178,16 @@ public class BasicScanAlgorithm implements IntersectionAlgorithm {
             final double        s         = Vector3D.dotProduct(delta, los) / los.getNormSq();
             final GeodeticPoint projected = ellipsoid.transform(new Vector3D(1, position, s, los),
                                                                 ellipsoid.getBodyFrame(), null);
-            final Tile          tile      = cache.getTile(projected.getLatitude(), projected.getLongitude());
-            return tile.cellIntersection(projected, ellipsoid.convertLos(projected, los),
-                                          tile.getFloorLatitudeIndex(projected.getLatitude()),
-                                          tile.getFloorLongitudeIndex(projected.getLongitude()));
+            final NormalizedGeodeticPoint normalizedProjected = new NormalizedGeodeticPoint(projected.getLatitude(),
+                                                                                            projected.getLongitude(),
+                                                                                            projected.getAltitude(),
+                                                                                            closeGuess.getLongitude());
+            final Tile          tile      = cache.getTile(normalizedProjected.getLatitude(),
+                                                          normalizedProjected.getLongitude());
+            return tile.cellIntersection(normalizedProjected,
+                                         ellipsoid.convertLos(normalizedProjected, los),
+                                         tile.getFloorLatitudeIndex(normalizedProjected.getLatitude()),
+                                         tile.getFloorLongitudeIndex(normalizedProjected.getLongitude()));
         } catch (OrekitException oe) {
             throw new RuggedException(oe, oe.getSpecifier(), oe.getParts());
         }
diff --git a/src/main/java/org/orekit/rugged/intersection/duvenhage/DuvenhageAlgorithm.java b/src/main/java/org/orekit/rugged/intersection/duvenhage/DuvenhageAlgorithm.java
index 24e756b8..e2088e4f 100644
--- a/src/main/java/org/orekit/rugged/intersection/duvenhage/DuvenhageAlgorithm.java
+++ b/src/main/java/org/orekit/rugged/intersection/duvenhage/DuvenhageAlgorithm.java
@@ -195,10 +195,15 @@ public class DuvenhageAlgorithm implements IntersectionAlgorithm {
                 final double        s         = Vector3D.dotProduct(delta, los) / los.getNormSq();
                 final GeodeticPoint projected = ellipsoid.transform(new Vector3D(1, position, s, los),
                                                                     ellipsoid.getBodyFrame(), null);
-                final Tile          tile      = cache.getTile(projected.getLatitude(), projected.getLongitude());
-                return tile.cellIntersection(projected, ellipsoid.convertLos(projected, los),
-                                              tile.getFloorLatitudeIndex(projected.getLatitude()),
-                                              tile.getFloorLongitudeIndex(projected.getLongitude()));
+                final NormalizedGeodeticPoint normalizedProjected = new NormalizedGeodeticPoint(projected.getLatitude(),
+                                                                                                projected.getLongitude(),
+                                                                                                projected.getAltitude(),
+                                                                                                closeGuess.getLongitude());
+                final Tile          tile      = cache.getTile(normalizedProjected.getLatitude(),
+                                                              normalizedProjected.getLongitude());
+                return tile.cellIntersection(normalizedProjected, ellipsoid.convertLos(normalizedProjected, los),
+                                              tile.getFloorLatitudeIndex(normalizedProjected.getLatitude()),
+                                              tile.getFloorLongitudeIndex(normalizedProjected.getLongitude()));
             }
         } catch (OrekitException oe) {
             throw new RuggedException(oe, oe.getSpecifier(), oe.getParts());
@@ -457,7 +462,13 @@ public class DuvenhageAlgorithm implements IntersectionAlgorithm {
                     final double        s         = Vector3D.dotProduct(delta, los) / los.getNormSq();
                     final GeodeticPoint projected = ellipsoid.transform(new Vector3D(1, position, s, los),
                                                                         ellipsoid.getBodyFrame(), null);
-                    final NormalizedGeodeticPoint gpImproved = tile.cellIntersection(projected, ellipsoid.convertLos(projected, los), i, j);
+                    final NormalizedGeodeticPoint normalizedProjected = new NormalizedGeodeticPoint(projected.getLatitude(),
+                                                                                                    projected.getLongitude(),
+                                                                                                    projected.getAltitude(),
+                                                                                                    gp.getLongitude());
+                    final NormalizedGeodeticPoint gpImproved = tile.cellIntersection(normalizedProjected,
+                                                                                     ellipsoid.convertLos(normalizedProjected, los),
+                                                                                     i, j);
 
                     if (gpImproved != null) {
                         final Vector3D point = ellipsoid.transform(gpImproved);
-- 
GitLab