diff --git a/core/src/test/java/org/orekit/rugged/intersection/duvenhage/DuvenhageAlgorithmTest.java b/core/src/test/java/org/orekit/rugged/intersection/duvenhage/DuvenhageAlgorithmTest.java index ec3a2e1b5f473586bbffd732c91b4a41269037eb..c4e10014bb1fddd64d30798c76f5d54359e577da 100644 --- a/core/src/test/java/org/orekit/rugged/intersection/duvenhage/DuvenhageAlgorithmTest.java +++ b/core/src/test/java/org/orekit/rugged/intersection/duvenhage/DuvenhageAlgorithmTest.java @@ -17,6 +17,10 @@ package org.orekit.rugged.intersection.duvenhage; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + import org.apache.commons.math3.geometry.euclidean.threed.Vector3D; import org.apache.commons.math3.util.FastMath; import org.junit.Assert; @@ -27,8 +31,12 @@ import org.orekit.rugged.api.RuggedException; import org.orekit.rugged.api.RuggedMessages; import org.orekit.rugged.intersection.AbstractAlgorithmTest; import org.orekit.rugged.intersection.IntersectionAlgorithm; +import org.orekit.rugged.raster.CheckedPatternElevationUpdater; +import org.orekit.rugged.raster.Tile; import org.orekit.rugged.raster.TileUpdater; import org.orekit.rugged.raster.UpdatableTile; +import org.orekit.rugged.utils.ExtendedEllipsoid; +import org.orekit.rugged.utils.NormalizedGeodeticPoint; public class DuvenhageAlgorithmTest extends AbstractAlgorithmTest { @@ -103,4 +111,141 @@ public class DuvenhageAlgorithmTest extends AbstractAlgorithmTest { } } + @Test + public void testPureEastWestLOS() throws RuggedException, OrekitException { + updater = new CheckedPatternElevationUpdater(FastMath.toRadians(1.0),1201, 41.0, 1563.0); + final IntersectionAlgorithm algorithm = createAlgorithm(updater, 8); + NormalizedGeodeticPoint gp = + algorithm.intersection(earth, + new Vector3D(-3041185.154503948, 6486750.132281409, -32335.022880173332), + new Vector3D(0.5660218606298548 , -0.8233939240951769, 0.040517885584811814)); + Assert.assertEquals(1164.339, gp.getAltitude(), 1.0e-3); + } + + @Test + public void testParallelLOS() throws RuggedException, OrekitException { + double size = 0.125; + int n = 129; + double elevation1 = 0.0; + double elevation2 = 100.0; + updater = new CheckedPatternElevationUpdater(size, n, elevation1, elevation2); + MinMaxTreeTile northTile = new MinMaxTreeTileFactory().createTile(); + updater.updateTile((3 * size) / 2, (3 * size) / 2, northTile); + MinMaxTreeTile southTile = new MinMaxTreeTileFactory().createTile(); + updater.updateTile((-3 * size) / 2, (3 * size) / 2, southTile); + IntersectionAlgorithm algorithm = createAlgorithm(updater, 8); + + // line of sight in the South West corner + Assert.assertEquals(northTile.getMinimumLongitude() - 0.0625 * northTile.getLongitudeStep(), + findExit(algorithm, northTile, + new Vector3D( 6278799.86896170100, 788574.17965500170, 796074.70414069280), + new Vector3D( 0.09416282233912959, 0.01183204230132312, -0.99548649697728680)).getLongitude(), + 1.0e-6); + + // line of sight in the West column + Assert.assertEquals(northTile.getMinimumLongitude() - 0.0625 * northTile.getLongitudeStep(), + findExit(algorithm, northTile, + new Vector3D(6278799.868961701, 788574.17965500171, 796074.7041406928), + new Vector3D(0.09231669916268806, 0.011600067441452849, -0.9956621241621375)).getLongitude(), + 1.0e-6); + + // line of sight in the North-West corner + Assert.assertEquals(northTile.getMinimumLongitude() - 0.0625 * northTile.getLongitudeStep(), + findExit(algorithm, northTile, + new Vector3D( 6133039.79342824500, 770267.71434489540, 1568158.38266382620), + new Vector3D(-0.52028845147300570, -0.06537691642830394, -0.85148446025875800)).getLongitude(), + 1.0e-6); + // line of sight in the North-East corner + Assert.assertEquals(northTile.getMaximumLongitude() + 0.0625 * northTile.getLongitudeStep(), + findExit(algorithm, northTile, + new Vector3D( 5988968.17708294100, 1529624.01701343130, 1568158.38266382620), + new Vector3D(-0.93877408645552440, -0.23970837882807683, -0.24747344851359457)).getLongitude(), + 1.0e-6); + + // line of sight in the East column + Assert.assertEquals(northTile.getMaximumLongitude() + 0.0625 * northTile.getLongitudeStep(), + findExit(algorithm, northTile, + new Vector3D( 6106093.15406747100, 1559538.54861392200, 979886.66862965740), + new Vector3D(-0.18115090486319424, -0.04625542007869719, 0.98236693031707310)).getLongitude(), + 1.0e-6); + + // line of sight in the South-East corner + Assert.assertEquals(northTile.getMaximumLongitude() + 0.0625 * northTile.getLongitudeStep(), + findExit(algorithm, northTile, + new Vector3D( 6131304.19368509600, 1565977.62301751650, 796074.70414069280), + new Vector3D( 0.09195297594530785, 0.02347944953986664, -0.99548649697728530)).getLongitude(), + 1.0e-6); + + // line of sight in the South row + Assert.assertEquals(northTile.getMinimumLatitude() - 0.0625 * northTile.getLatitudeStep(), + findExit(algorithm, northTile, + new Vector3D(6251729.731998736, 984354.4963428857, 789526.5774750853), + new Vector3D(-0.15561499277355603, 0.9878177838164719, 0.0)).getLatitude(), + 1.0e-6); + + // line of sight in the North row +// Assert.assertEquals(southTile.getMaximumLatitude() + 0.0625 * southTile.getLatitudeStep(), +// findExit(algorithm, southTile, 128.0625, 32.0).getLatitude(), +// 1.0e-6); + Assert.assertEquals(southTile.getMaximumLatitude() + 0.0625 * southTile.getLatitudeStep(), + findExit(algorithm, southTile, + new Vector3D(6251729.731998736, 984354.4963428857, -789526.5774750853), + new Vector3D(-0.15561499277355603, 0.9878177838164719, 0.0)).getLatitude(), + 1.0e-6); + + } + +// private NormalizedGeodeticPoint findExit(IntersectionAlgorithm algorithm, Tile tile, +// double exitLat, double exitLon) +// throws RuggedException, OrekitException { +// +// double latX = tile.getMinimumLatitude() + exitLat * tile.getLatitudeStep(); +// double lonX = tile.getMinimumLongitude() + exitLon * tile.getLongitudeStep(); +// GeodeticPoint exitGP = new GeodeticPoint(latX, lonX, tile.getMinElevation() - 0.01); +// Vector3D exit = earth.transform(exitGP); +// final Vector3D zenith = exitGP.getZenith(); +// final Vector3D los = Vector3D.crossProduct(Vector3D.PLUS_K, zenith).normalize(); +// NormalizedGeodeticPoint gp = findExit(algorithm, tile, new Vector3D(1, exit, -500, los), los); +// System.out.println(gp.getLatitude() - exitGP.getLatitude()); +// System.out.println(gp.getLongitude() - exitGP.getLongitude()); +// System.out.println(gp.getAltitude() - exitGP.getAltitude()); +// return gp; +// +// } + + private NormalizedGeodeticPoint findExit(IntersectionAlgorithm algorithm, Tile tile, Vector3D position, Vector3D los) + throws RuggedException, OrekitException { + + try { + Method findExit = DuvenhageAlgorithm.class.getDeclaredMethod("findExit", + Tile.class, + ExtendedEllipsoid.class, + Vector3D.class, Vector3D.class); + findExit.setAccessible(true); + Object limitPoint = findExit.invoke(algorithm, tile, earth, position, los); + Class<?> limitPointCls = DuvenhageAlgorithm.class.getDeclaredClasses()[0]; + Field pointField = limitPointCls.getDeclaredField("point"); + pointField.setAccessible(true); + return (NormalizedGeodeticPoint) pointField.get(limitPoint); + + } catch (NoSuchMethodException nsme) { + Assert.fail(nsme.getLocalizedMessage()); + } catch (SecurityException se) { + Assert.fail(se.getLocalizedMessage()); + } catch (IllegalAccessException iae) { + Assert.fail(iae.getLocalizedMessage()); + } catch (IllegalArgumentException iae) { + Assert.fail(iae.getLocalizedMessage()); + } catch (NoSuchFieldException nsfe) { + Assert.fail(nsfe.getLocalizedMessage()); + } catch (InvocationTargetException e) { + if (e.getCause() instanceof RuggedException) { + throw (RuggedException) e.getCause(); + } else { + throw (OrekitException) e.getCause(); + } + } + return null; + } + }