defineSuite([ 'Core/EllipsoidGeodesic', 'Core/Cartographic', 'Core/Ellipsoid', 'Core/Math' ], function( EllipsoidGeodesic, Cartographic, Ellipsoid, CesiumMath) { 'use strict'; it('throws without start', function() { expect(function() { var elGeo = new EllipsoidGeodesic(); return elGeo.interpolateUsingSurfaceDistance(0); }).toThrowDeveloperError(); }); it('throws without end', function() { expect(function() { var elGeo = new EllipsoidGeodesic(new Cartographic(Math.PI, Math.PI)); return elGeo.interpolateUsingSurfaceDistance(0); }).toThrowDeveloperError(); }); it('throws without unique position', function() { expect(function() { var elGeo = new EllipsoidGeodesic(new Cartographic(Math.PI, Math.PI), new Cartographic(0, Math.PI)); return elGeo.interpolateUsingSurfaceDistance(0); }).toThrowDeveloperError(); }); it('setEndPoints throws without start', function() { expect(function() { var elGeo = new EllipsoidGeodesic(); elGeo.setEndPoints(); }).toThrowDeveloperError(); }); it('setEndPoints throws without end', function() { expect(function() { var start = new Cartographic(CesiumMath.PI_OVER_TWO, 0); var elGeo = new EllipsoidGeodesic(); elGeo.setEndPoints(start); return elGeo.interpolateUsingSurfaceDistance(0); }).toThrowDeveloperError(); }); it('getSurfaceDistance throws if start or end never defined', function() { expect(function() { var elGeo = new EllipsoidGeodesic(); return elGeo.surfaceDistance; }).toThrowDeveloperError(); }); it('getStartHeading throws if start or end never defined', function() { expect(function() { var elGeo = new EllipsoidGeodesic(); return elGeo.startHeading; }).toThrowDeveloperError(); }); it('getEndHeading throws if start or end never defined', function() { expect(function() { var elGeo = new EllipsoidGeodesic(); return elGeo.endHeading; }).toThrowDeveloperError(); }); it('works with two points', function() { var fifteenDegrees = Math.PI / 12; var start = new Cartographic(fifteenDegrees, fifteenDegrees); var thirtyDegrees = Math.PI / 6; var end = new Cartographic(thirtyDegrees, thirtyDegrees); var geodesic = new EllipsoidGeodesic(start, end); expect(start).toEqual(geodesic.start); expect(end).toEqual(geodesic.end); }); it('sets end points', function() { var start = new Cartographic(CesiumMath.PI_OVER_TWO, 0); var end = new Cartographic(CesiumMath.PI_OVER_TWO, CesiumMath.PI_OVER_TWO); var geodesic = new EllipsoidGeodesic(); geodesic.setEndPoints(start, end); expect(start).toEqual(geodesic.start); expect(end).toEqual(geodesic.end); }); it('gets start heading', function() { var ellipsoid = new Ellipsoid(6, 6, 3); var start = new Cartographic(CesiumMath.PI_OVER_TWO, 0); var end = new Cartographic(Math.PI, 0); var geodesic = new EllipsoidGeodesic(start, end, ellipsoid); expect(CesiumMath.PI_OVER_TWO).toEqualEpsilon(geodesic.startHeading, CesiumMath.EPSILON11); }); it('gets end heading', function() { var ellipsoid = new Ellipsoid(6, 6, 3); var start = new Cartographic(CesiumMath.PI_OVER_TWO, 0); var end = new Cartographic(Math.PI, 0); var geodesic = new EllipsoidGeodesic(start, end, ellipsoid); expect(CesiumMath.PI_OVER_TWO).toEqualEpsilon(geodesic.endHeading, CesiumMath.EPSILON11); }); it('computes distance at equator', function() { var ellipsoid = new Ellipsoid(6, 6, 3); var start = new Cartographic(CesiumMath.PI_OVER_TWO, 0); var end = new Cartographic(Math.PI, 0); var geodesic = new EllipsoidGeodesic(start, end, ellipsoid); expect(CesiumMath.PI_OVER_TWO * 6).toEqualEpsilon(geodesic.surfaceDistance, CesiumMath.EPSILON11); }); it('computes distance at meridian', function() { var ellipsoid = new Ellipsoid(6, 6, 6); var fifteenDegrees = Math.PI / 12; var start = new Cartographic(CesiumMath.PI_OVER_TWO, fifteenDegrees); var fortyfiveDegrees = Math.PI / 4; var end = new Cartographic(CesiumMath.PI_OVER_TWO, fortyfiveDegrees); var geodesic = new EllipsoidGeodesic(start, end, ellipsoid); var thirtyDegrees = Math.PI / 6; expect(thirtyDegrees * 6).toEqualEpsilon(geodesic.surfaceDistance, CesiumMath.EPSILON11); }); it('computes distance at pole', function() { var ellipsoid = new Ellipsoid(6, 6, 6); var seventyfiveDegrees = Math.PI / 12 * 5; var fortyfiveDegrees = Math.PI / 4; var start = new Cartographic(0, -fortyfiveDegrees); var end = new Cartographic(Math.PI, -seventyfiveDegrees); var geodesic = new EllipsoidGeodesic(start, end, ellipsoid); var sixtyDegrees = Math.PI / 3; expect(sixtyDegrees * 6).toEqualEpsilon(geodesic.surfaceDistance, CesiumMath.EPSILON11); }); it('interpolates start and end points', function() { var fifteenDegrees = Math.PI / 12; var start = new Cartographic(fifteenDegrees, fifteenDegrees); var thirtyDegrees = Math.PI / 6; var end = new Cartographic(thirtyDegrees, thirtyDegrees); var geodesic = new EllipsoidGeodesic(start, end); var distance = geodesic.surfaceDistance; var first = geodesic.interpolateUsingSurfaceDistance(0.0); var last = geodesic.interpolateUsingSurfaceDistance(distance); expect(start.longitude).toEqualEpsilon(first.longitude, CesiumMath.EPSILON13); expect(start.latitude).toEqualEpsilon(first.latitude, CesiumMath.EPSILON13); expect(end.longitude).toEqualEpsilon(last.longitude, CesiumMath.EPSILON13); expect(end.latitude).toEqualEpsilon(last.latitude, CesiumMath.EPSILON13); }); it('interpolates midpoint', function() { var fifteenDegrees = Math.PI / 12; var start = new Cartographic(fifteenDegrees, 0); var fortyfiveDegrees = Math.PI / 4; var end = new Cartographic(fortyfiveDegrees, 0); var thirtyDegrees = Math.PI / 6; var expectedMid = new Cartographic(thirtyDegrees, 0); var geodesic = new EllipsoidGeodesic(start, end); var distance = Ellipsoid.WGS84.radii.x * fifteenDegrees; var midpoint = geodesic.interpolateUsingSurfaceDistance(distance); expect(expectedMid.longitude).toEqualEpsilon(midpoint.longitude, CesiumMath.EPSILON13); expect(expectedMid.latitude).toEqualEpsilon(midpoint.latitude, CesiumMath.EPSILON13); }); it('interpolates start and end points using fraction', function() { var fifteenDegrees = Math.PI / 12; var start = new Cartographic(fifteenDegrees, fifteenDegrees); var thirtyDegrees = Math.PI / 6; var end = new Cartographic(thirtyDegrees, thirtyDegrees); var geodesic = new EllipsoidGeodesic(start, end); var first = geodesic.interpolateUsingFraction(0); var last = geodesic.interpolateUsingFraction(1); expect(start.longitude).toEqualEpsilon(first.longitude, CesiumMath.EPSILON13); expect(start.latitude).toEqualEpsilon(first.latitude, CesiumMath.EPSILON13); expect(end.longitude).toEqualEpsilon(last.longitude, CesiumMath.EPSILON13); expect(end.latitude).toEqualEpsilon(last.latitude, CesiumMath.EPSILON13); }); it('interpolates midpoint using fraction', function() { var fifteenDegrees = Math.PI / 12; var start = new Cartographic(fifteenDegrees, 0); var fortyfiveDegrees = Math.PI / 4; var end = new Cartographic(fortyfiveDegrees, 0); var thirtyDegrees = Math.PI / 6; var expectedMid = new Cartographic(thirtyDegrees, 0); var geodesic = new EllipsoidGeodesic(start, end); var midpoint = geodesic.interpolateUsingFraction(0.5); expect(expectedMid.longitude).toEqualEpsilon(midpoint.longitude, CesiumMath.EPSILON12); expect(expectedMid.latitude).toEqualEpsilon(midpoint.latitude, CesiumMath.EPSILON12); }); it('interpolates midpoint fraction using result parameter', function() { var fifteenDegrees = Math.PI / 12; var start = new Cartographic(fifteenDegrees, 0); var fortyfiveDegrees = Math.PI / 4; var end = new Cartographic(fortyfiveDegrees, 0); var thirtyDegrees = Math.PI / 6; var expectedMid = new Cartographic(thirtyDegrees, 0); var geodesic = new EllipsoidGeodesic(start, end); var result = new Cartographic(); var midpoint = geodesic.interpolateUsingFraction(0.5, result); expect(result).toBe(midpoint); expect(expectedMid.longitude).toEqualEpsilon(result.longitude, CesiumMath.EPSILON12); expect(expectedMid.latitude).toEqualEpsilon(result.latitude, CesiumMath.EPSILON12); }); it('interpolates midpoint using result parameter', function() { var fifteenDegrees = Math.PI / 12; var start = new Cartographic(fifteenDegrees, 0); var fortyfiveDegrees = Math.PI / 4; var end = new Cartographic(fortyfiveDegrees, 0); var thirtyDegrees = Math.PI / 6; var expectedMid = new Cartographic(thirtyDegrees, 0); var geodesic = new EllipsoidGeodesic(start, end); var distance = Ellipsoid.WGS84.radii.x * fifteenDegrees; var result = new Cartographic(); var midpoint = geodesic.interpolateUsingSurfaceDistance(distance, result); expect(result).toBe(midpoint); expect(expectedMid.longitude).toEqualEpsilon(result.longitude, CesiumMath.EPSILON13); expect(expectedMid.latitude).toEqualEpsilon(result.latitude, CesiumMath.EPSILON13); }); });