From 8d0b513e6b0e75e66103e4fd1ba9983f3ee51714 Mon Sep 17 00:00:00 2001
From: Luc Maisonobe <luc@orekit.org>
Date: Wed, 2 Apr 2014 11:20:30 +0200
Subject: [PATCH] Slight speed-up with a dedicated pointOnGround method.

---
 .../org/orekit/rugged/core/ExtendedEllipsoid.java   | 13 +++++++++++++
 .../org/orekit/rugged/core/IgnoreDEMAlgorithm.java  |  3 +--
 .../rugged/core/duvenhage/DuvenhageAlgorithm.java   |  3 +--
 3 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/src/main/java/org/orekit/rugged/core/ExtendedEllipsoid.java b/src/main/java/org/orekit/rugged/core/ExtendedEllipsoid.java
index bb267bd3..e092e05a 100644
--- a/src/main/java/org/orekit/rugged/core/ExtendedEllipsoid.java
+++ b/src/main/java/org/orekit/rugged/core/ExtendedEllipsoid.java
@@ -16,6 +16,7 @@
  */
 package org.orekit.rugged.core;
 
+import org.apache.commons.math3.geometry.euclidean.threed.Line;
 import org.apache.commons.math3.geometry.euclidean.threed.Vector3D;
 import org.apache.commons.math3.util.FastMath;
 import org.orekit.bodies.GeodeticPoint;
@@ -145,6 +146,18 @@ public class ExtendedEllipsoid extends OneAxisEllipsoid {
 
     }
 
+    /** Get point on ground along a pixel line of sight.
+     * @param position pixel position (in body frame)
+     * @param los pixel line-of-sight, not necessarily normalized (in body frame)
+     * @return point on ground
+     * @exception OrekitException if no such point exists (typically line-of-sight missing body)
+     */
+    public GeodeticPoint pointOnGround(final Vector3D position, final Vector3D los)
+        throws OrekitException {
+        return getIntersectionPoint(new Line(position, new Vector3D(1, position, 1e6, los), 1.0e-12),
+                                    position, getBodyFrame(), null);
+    }
+
     /** Get point at some altitude along a pixel line of sight.
      * @param position pixel position (in body frame)
      * @param los pixel line-of-sight, not necessarily normalized (in body frame)
diff --git a/src/main/java/org/orekit/rugged/core/IgnoreDEMAlgorithm.java b/src/main/java/org/orekit/rugged/core/IgnoreDEMAlgorithm.java
index 5dfa5fd3..6f04136e 100644
--- a/src/main/java/org/orekit/rugged/core/IgnoreDEMAlgorithm.java
+++ b/src/main/java/org/orekit/rugged/core/IgnoreDEMAlgorithm.java
@@ -48,8 +48,7 @@ public class IgnoreDEMAlgorithm implements IntersectionAlgorithm {
                                       final Vector3D position, final Vector3D los)
         throws RuggedException {
         try {
-            return ellipsoid.transform(ellipsoid.pointAtAltitude(position, los, 0.0),
-                                       ellipsoid.getBodyFrame(), null);
+            return ellipsoid.pointOnGround(position, los);
         } catch (OrekitException oe) {
             // this should never happen
             throw new RuggedException(oe, oe.getSpecifier(), oe.getParts());
diff --git a/src/main/java/org/orekit/rugged/core/duvenhage/DuvenhageAlgorithm.java b/src/main/java/org/orekit/rugged/core/duvenhage/DuvenhageAlgorithm.java
index dca15184..b81cb98d 100644
--- a/src/main/java/org/orekit/rugged/core/duvenhage/DuvenhageAlgorithm.java
+++ b/src/main/java/org/orekit/rugged/core/duvenhage/DuvenhageAlgorithm.java
@@ -63,8 +63,7 @@ public class DuvenhageAlgorithm implements IntersectionAlgorithm {
         try {
 
             // compute intersection with ellipsoid
-            final Vector3D      p0  = ellipsoid.pointAtAltitude(position, los, 0.0);
-            final GeodeticPoint gp0 = ellipsoid.transform(p0, ellipsoid.getBodyFrame(), null);
+            final GeodeticPoint gp0 = ellipsoid.pointOnGround(position, los);
 
             // locate the entry tile along the line-of-sight
             MinMaxTreeTile tile = cache.getTile(gp0.getLatitude(), gp0.getLongitude());
-- 
GitLab