You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

302 lines
10 KiB
JavaScript

import { Cartographic } from "../../Source/Cesium.js";
import { Ellipsoid } from "../../Source/Cesium.js";
import { EllipsoidGeodesic } from "../../Source/Cesium.js";
import { Math as CesiumMath } from "../../Source/Cesium.js";
describe("Core/EllipsoidGeodesic", function () {
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 very close to equator", function () {
// See https://github.com/CesiumGS/cesium/issues/9248
var ellipsoid = new Ellipsoid(6, 6, 3);
var start = new Cartographic(-CesiumMath.EPSILON10, CesiumMath.EPSILON10);
var end = new Cartographic(+CesiumMath.EPSILON10, CesiumMath.EPSILON10);
var geodesic = new EllipsoidGeodesic(start, end, ellipsoid);
expect(geodesic.surfaceDistance).not.toBeNaN();
});
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
);
});
});