diff --git a/src/main/java/org/orekit/rugged/core/ExtendedEllipsoid.java b/src/main/java/org/orekit/rugged/core/ExtendedEllipsoid.java
index bb267bd3766eaabd62e479955361824ed982f89b..e092e05acdbba37b2e0e774c4a2e7d00bc0c4604 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 5dfa5fd3a6f38dcb8d4145df5391127efdef5e3f..6f04136ee9d0edecd0837f03302eada7f5b5b8d7 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 dca151846c64cbb2c04c32d5605b8d62f62fe563..b81cb98d565cd04a2fb2c7e0cba32f3bcd7d57e9 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());