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
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
|
|
);
|
|
});
|
|
});
|