### Question:
GeographicBody3D extends AbstractGeographicProjection { public static LatLonAlt greatCircleInterpolate(LatLonAlt start, LatLonAlt end, double percent) { double azimuthD = greatCircleAzimuthD(start, end); double lengthR = greatCircleDistanceR(start, end) * percent; LatLonAlt lla = greatCircleEndPosition(start, azimuthD * MathUtil.DEG_TO_RAD, lengthR); double alt = MathUtil.lerp(percent, start.getAltM(), end.getAltM()); return LatLonAlt.createFromDegreesMeters(lla.getLatD(), lla.getLonD(), alt, start.getAltitudeReference()); } GeographicBody3D(String name, Shape shape); static double greatCircleAzimuthD(LatLonAlt start, LatLonAlt end); static double greatCircleDistanceM(LatLonAlt start, LatLonAlt end, double radiusM); static double greatCircleDistanceR(LatLonAlt start, LatLonAlt end); static LatLonAlt greatCircleEndPosition(LatLonAlt start, double greatCircleAzimuthR, double pathLengthR); static LatLonAlt greatCircleEndPosition(LatLonAlt start, double greatCircleAzimuthR, double radiusM,
            double pathLengthM); static LatLonAlt greatCircleInterpolate(LatLonAlt start, LatLonAlt end, double percent); @Override ElevationManager getElevationManager(); @Override String getName(); Shape getShape(); @Override Vector3d getSurfaceIntersection(Vector3d pointA, Vector3d pointB); @Override Vector3d getTerrainIntersection(Ray3d ray, Viewer view);  }### Answer:
@Test public void testMatchingStartAndEnd() { LatLonAlt start = LatLonAlt.createFromDegrees(0., 0.); LatLonAlt end = LatLonAlt.createFromDegrees(0., 0.); double percent = 0.5; LatLonAlt interp = GeographicBody3D.greatCircleInterpolate(start, end, percent); Assert.assertEquals(interp.equals(start), true); }