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.

280 lines
7.3 KiB
JavaScript

import { Cartesian3 } from "../../Source/Cesium.js";
import { Ellipsoid } from "../../Source/Cesium.js";
import { Math as CesiumMath } from "../../Source/Cesium.js";
import { WallOutlineGeometry } from "../../Source/Cesium.js";
import createPackableSpecs from "../createPackableSpecs.js";
describe("Core/WallOutlineGeometry", function () {
var ellipsoid = Ellipsoid.WGS84;
it("throws with no positions", function () {
expect(function () {
return new WallOutlineGeometry();
}).toThrowDeveloperError();
});
it("throws when positions and minimumHeights length do not match", function () {
expect(function () {
return new WallOutlineGeometry({
positions: new Array(2),
minimumHeights: new Array(3),
});
}).toThrowDeveloperError();
});
it("throws when positions and maximumHeights length do not match", function () {
expect(function () {
return new WallOutlineGeometry({
positions: new Array(2),
maximumHeights: new Array(3),
});
}).toThrowDeveloperError();
});
it("returns undefined with less than 2 unique positions", function () {
var geometry = WallOutlineGeometry.createGeometry(
new WallOutlineGeometry({
positions: Cartesian3.fromDegreesArrayHeights([
49.0,
18.0,
1000.0,
49.0,
18.0,
5000.0,
49.0,
18.0,
1000.0,
]),
})
);
expect(geometry).toBeUndefined();
});
it("returns undefined with no heights", function () {
var geometry = WallOutlineGeometry.createGeometry(
new WallOutlineGeometry({
positions: Cartesian3.fromDegreesArray([
49.0,
18.0,
49.0,
18.0,
49.0,
18.0,
]),
})
);
expect(geometry).toBeUndefined();
geometry = WallOutlineGeometry.createGeometry(
new WallOutlineGeometry({
positions: Cartesian3.fromDegreesArray([
49.0,
18.0,
49.0,
18.0,
49.0,
18.0,
]),
maximumHeights: [0, 0, 0],
})
);
expect(geometry).toBeUndefined();
});
it("creates positions relative to ellipsoid", function () {
var w = WallOutlineGeometry.createGeometry(
new WallOutlineGeometry({
positions: Cartesian3.fromDegreesArrayHeights([
49.0,
18.0,
1000.0,
50.0,
18.0,
1000.0,
]),
granularity: Math.PI,
})
);
var positions = w.attributes.position.values;
expect(positions.length).toEqual(4 * 3);
expect(w.indices.length).toEqual(4 * 2);
var cartographic = ellipsoid.cartesianToCartographic(
Cartesian3.fromArray(positions, 0)
);
expect(cartographic.height).toEqualEpsilon(0.0, CesiumMath.EPSILON8);
cartographic = ellipsoid.cartesianToCartographic(
Cartesian3.fromArray(positions, 3)
);
expect(cartographic.height).toEqualEpsilon(1000.0, CesiumMath.EPSILON8);
});
it("creates positions with minimum and maximum heights", function () {
var w = WallOutlineGeometry.createGeometry(
new WallOutlineGeometry({
positions: Cartesian3.fromDegreesArrayHeights([
49.0,
18.0,
1000.0,
50.0,
18.0,
1000.0,
]),
minimumHeights: [1000.0, 2000.0],
maximumHeights: [3000.0, 4000.0],
granularity: Math.PI,
})
);
var positions = w.attributes.position.values;
expect(positions.length).toEqual(4 * 3);
expect(w.indices.length).toEqual(4 * 2);
var cartographic = ellipsoid.cartesianToCartographic(
Cartesian3.fromArray(positions, 0)
);
expect(cartographic.height).toEqualEpsilon(1000.0, CesiumMath.EPSILON8);
cartographic = ellipsoid.cartesianToCartographic(
Cartesian3.fromArray(positions, 3)
);
expect(cartographic.height).toEqualEpsilon(3000.0, CesiumMath.EPSILON8);
cartographic = ellipsoid.cartesianToCartographic(
Cartesian3.fromArray(positions, 6)
);
expect(cartographic.height).toEqualEpsilon(2000.0, CesiumMath.EPSILON8);
cartographic = ellipsoid.cartesianToCartographic(
Cartesian3.fromArray(positions, 9)
);
expect(cartographic.height).toEqualEpsilon(4000.0, CesiumMath.EPSILON8);
});
it("cleans positions with duplicates", function () {
var w = WallOutlineGeometry.createGeometry(
new WallOutlineGeometry({
positions: Cartesian3.fromDegreesArrayHeights([
49.0,
18.0,
1000.0,
49.0,
18.0,
2000.0,
50.0,
18.0,
1000.0,
50.0,
18.0,
1000.0,
50.0,
18.0,
1000.0,
51.0,
18.0,
1000.0,
51.0,
18.0,
1000.0,
]),
})
);
var positions = w.attributes.position.values;
expect(positions.length).toEqual(6 * 3);
expect(w.indices.length).toEqual(7 * 2); //3 vertical + 4 horizontal
var cartographic = ellipsoid.cartesianToCartographic(
Cartesian3.fromArray(positions, 0)
);
expect(cartographic.height).toEqualEpsilon(0.0, CesiumMath.EPSILON8);
cartographic = ellipsoid.cartesianToCartographic(
Cartesian3.fromArray(positions, 3)
);
expect(cartographic.height).toEqualEpsilon(2000.0, CesiumMath.EPSILON8);
});
it("fromConstantHeights throws without positions", function () {
expect(function () {
return WallOutlineGeometry.fromConstantHeights();
}).toThrowDeveloperError();
});
it("creates positions with constant minimum and maximum heights", function () {
var min = 1000.0;
var max = 2000.0;
var w = WallOutlineGeometry.createGeometry(
WallOutlineGeometry.fromConstantHeights({
positions: Cartesian3.fromDegreesArrayHeights([
49.0,
18.0,
1000.0,
50.0,
18.0,
1000.0,
]),
minimumHeight: min,
maximumHeight: max,
})
);
var positions = w.attributes.position.values;
expect(positions.length).toEqual(4 * 3);
expect(w.indices.length).toEqual(4 * 2);
var cartographic = ellipsoid.cartesianToCartographic(
Cartesian3.fromArray(positions, 0)
);
expect(cartographic.height).toEqualEpsilon(min, CesiumMath.EPSILON8);
cartographic = ellipsoid.cartesianToCartographic(
Cartesian3.fromArray(positions, 3)
);
expect(cartographic.height).toEqualEpsilon(max, CesiumMath.EPSILON8);
cartographic = ellipsoid.cartesianToCartographic(
Cartesian3.fromArray(positions, 6)
);
expect(cartographic.height).toEqualEpsilon(min, CesiumMath.EPSILON8);
cartographic = ellipsoid.cartesianToCartographic(
Cartesian3.fromArray(positions, 9)
);
expect(cartographic.height).toEqualEpsilon(max, CesiumMath.EPSILON8);
});
var positions = [
new Cartesian3(1.0, 0.0, 0.0),
new Cartesian3(0.0, 1.0, 0.0),
new Cartesian3(0.0, 0.0, 1.0),
];
var wall = new WallOutlineGeometry({
positions: positions,
granularity: 0.01,
ellipsoid: Ellipsoid.UNIT_SPHERE,
});
var packedInstance = [
3.0,
1.0,
0.0,
0.0,
0.0,
1.0,
0.0,
0.0,
0.0,
1.0,
0.0,
0.0,
1.0,
1.0,
1.0,
0.01,
];
createPackableSpecs(WallOutlineGeometry, wall, packedInstance);
});