diff --git a/src/main/java/org/orekit/rugged/linesensor/SensorMeanPlaneCrossing.java b/src/main/java/org/orekit/rugged/linesensor/SensorMeanPlaneCrossing.java index ce2d0659dd0bda4f73986feaf092e782a61fb6d3..7357b189502e1a47b454a4e47ae158cd2607a014 100644 --- a/src/main/java/org/orekit/rugged/linesensor/SensorMeanPlaneCrossing.java +++ b/src/main/java/org/orekit/rugged/linesensor/SensorMeanPlaneCrossing.java @@ -308,17 +308,24 @@ public class SensorMeanPlaneCrossing { Transform scToInert = midScToInert; boolean atMin = false; boolean atMax = false; + double deltaL = Double.NaN; for (int i = 0; i < maxEval; ++i) { final FieldVector3D<DerivativeStructure> targetDirection = evaluateLine(crossingLine, targetPV, bodyToInert, scToInert); final DerivativeStructure beta = FieldVector3D.angle(targetDirection, meanPlaneNormal); - final double deltaL = (0.5 * FastMath.PI - beta.getValue()) / beta.getPartialDerivative(1); + final double previousDeltaL = deltaL; + deltaL = (0.5 * FastMath.PI - beta.getValue()) / beta.getPartialDerivative(1); if (FastMath.abs(deltaL) <= accuracy) { // return immediately, without doing any additional evaluation! return new CrossingResult(sensor.getDate(crossingLine), crossingLine, targetDirection); } + if (FastMath.abs(deltaL + previousDeltaL) <= 0.01 * FastMath.abs(deltaL)) { + // we are stuck in a loop between two values! + // try to escape from the loop by targeting the middle point + deltaL = 0.5 * deltaL; + } crossingLine += deltaL; if (crossingLine < minLine) {