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.
396 lines
11 KiB
JavaScript
396 lines
11 KiB
JavaScript
import { Cartesian2 } from "../../Source/Cesium.js";
|
|
import { Cartesian3 } from "../../Source/Cesium.js";
|
|
import { Ellipsoid } from "../../Source/Cesium.js";
|
|
import { Math as CesiumMath } from "../../Source/Cesium.js";
|
|
import { PolygonPipeline } from "../../Source/Cesium.js";
|
|
import { WindingOrder } from "../../Source/Cesium.js";
|
|
|
|
describe("Core/PolygonPipeline", function () {
|
|
beforeEach(function () {
|
|
CesiumMath.setRandomNumberSeed(0.0);
|
|
});
|
|
|
|
it("computeArea2D computes a positive area", function () {
|
|
var area = PolygonPipeline.computeArea2D([
|
|
new Cartesian2(0.0, 0.0),
|
|
new Cartesian2(2.0, 0.0),
|
|
new Cartesian2(2.0, 1.0),
|
|
new Cartesian2(0.0, 1.0),
|
|
]);
|
|
|
|
expect(area).toEqual(2.0);
|
|
});
|
|
|
|
it("computeArea2D computes a negative area", function () {
|
|
var area = PolygonPipeline.computeArea2D([
|
|
new Cartesian2(0.0, 0.0),
|
|
new Cartesian2(0.0, 2.0),
|
|
new Cartesian2(1.0, 2.0),
|
|
new Cartesian2(1.0, 0.0),
|
|
]);
|
|
|
|
expect(area).toEqual(-2.0);
|
|
});
|
|
|
|
it("computeArea2D throws without positions", function () {
|
|
expect(function () {
|
|
PolygonPipeline.computeArea2D();
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("computeArea2D throws without three positions", function () {
|
|
expect(function () {
|
|
PolygonPipeline.computeArea2D([Cartesian3.ZERO, Cartesian3.ZERO]);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
it("computeWindingOrder2D computes counter-clockwise", function () {
|
|
var area = PolygonPipeline.computeWindingOrder2D([
|
|
new Cartesian2(0.0, 0.0),
|
|
new Cartesian2(2.0, 0.0),
|
|
new Cartesian2(2.0, 1.0),
|
|
new Cartesian2(0.0, 1.0),
|
|
]);
|
|
|
|
expect(area).toEqual(WindingOrder.COUNTER_CLOCKWISE);
|
|
});
|
|
|
|
it("computeWindingOrder2D computes clockwise", function () {
|
|
var area = PolygonPipeline.computeWindingOrder2D([
|
|
new Cartesian2(0.0, 0.0),
|
|
new Cartesian2(0.0, 2.0),
|
|
new Cartesian2(1.0, 2.0),
|
|
new Cartesian2(1.0, 0.0),
|
|
]);
|
|
|
|
expect(area).toEqual(WindingOrder.CLOCKWISE);
|
|
});
|
|
|
|
it("computeWindingOrder2D throws without positions", function () {
|
|
expect(function () {
|
|
PolygonPipeline.computeWindingOrder2D();
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("computeWindingOrder2D throws without three positions", function () {
|
|
expect(function () {
|
|
PolygonPipeline.computeWindingOrder2D([Cartesian3.ZERO, Cartesian3.ZERO]);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
describe("triangulate", function () {
|
|
// Test integration with earcut.js
|
|
// The package is tested independently. See https://github.com/mapbox/earcut
|
|
|
|
it("throws without positions", function () {
|
|
expect(function () {
|
|
PolygonPipeline.triangulate(undefined, []);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("a triangle", function () {
|
|
var positions = [
|
|
new Cartesian2(0.0, 0.0),
|
|
new Cartesian2(1.0, 0.0),
|
|
new Cartesian2(0.0, 1.0),
|
|
];
|
|
var indices = PolygonPipeline.triangulate(positions, []);
|
|
expect(indices).toEqual([1, 2, 0]);
|
|
});
|
|
|
|
it("a square", function () {
|
|
var positions = [
|
|
new Cartesian2(0.0, 0.0),
|
|
new Cartesian2(1.0, 0.0),
|
|
new Cartesian2(1.0, 1.0),
|
|
new Cartesian2(0.0, 1.0),
|
|
];
|
|
var indices = PolygonPipeline.triangulate(positions, []);
|
|
expect(indices).toEqual([2, 3, 0, 0, 1, 2]);
|
|
});
|
|
|
|
it("eliminates holes", function () {
|
|
var positions = [
|
|
new Cartesian2(0.0, 0.0),
|
|
new Cartesian2(3.0, 0.0),
|
|
new Cartesian2(3.0, 3.0),
|
|
new Cartesian2(0.0, 3.0),
|
|
];
|
|
var hole = [
|
|
new Cartesian2(1.0, 1.0),
|
|
new Cartesian2(2.0, 1.0),
|
|
new Cartesian2(2.0, 2.0),
|
|
new Cartesian2(1.0, 2.0),
|
|
];
|
|
|
|
var combinedPositions = positions.concat(hole);
|
|
var indices = PolygonPipeline.triangulate(combinedPositions, [4]);
|
|
|
|
expect(indices).toEqual([
|
|
3,
|
|
0,
|
|
4,
|
|
5,
|
|
4,
|
|
0,
|
|
3,
|
|
4,
|
|
7,
|
|
5,
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
7,
|
|
6,
|
|
5,
|
|
1,
|
|
2,
|
|
7,
|
|
6,
|
|
6,
|
|
1,
|
|
2,
|
|
]);
|
|
});
|
|
|
|
it("eliminates multiple holes", function () {
|
|
var positions = [
|
|
new Cartesian2(0.0, 0.0),
|
|
new Cartesian2(3.0, 0.0),
|
|
new Cartesian2(3.0, 5.0),
|
|
new Cartesian2(0.0, 5.0),
|
|
];
|
|
var bottomHole = [
|
|
new Cartesian2(1.0, 1.0),
|
|
new Cartesian2(2.0, 1.0),
|
|
new Cartesian2(2.0, 2.0),
|
|
new Cartesian2(1.0, 2.0),
|
|
];
|
|
var topHole = [
|
|
new Cartesian2(1.0, 3.0),
|
|
new Cartesian2(2.0, 3.0),
|
|
new Cartesian2(2.0, 4.0),
|
|
new Cartesian2(1.0, 4.0),
|
|
];
|
|
|
|
var combinedPositions = positions.concat(bottomHole).concat(topHole);
|
|
var indices = PolygonPipeline.triangulate(combinedPositions, [4, 8]);
|
|
|
|
expect(indices).toEqual([
|
|
0,
|
|
8,
|
|
11,
|
|
0,
|
|
4,
|
|
7,
|
|
5,
|
|
4,
|
|
0,
|
|
3,
|
|
0,
|
|
11,
|
|
8,
|
|
0,
|
|
7,
|
|
5,
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
11,
|
|
9,
|
|
8,
|
|
7,
|
|
6,
|
|
5,
|
|
1,
|
|
2,
|
|
11,
|
|
10,
|
|
9,
|
|
7,
|
|
6,
|
|
6,
|
|
1,
|
|
2,
|
|
2,
|
|
10,
|
|
9,
|
|
9,
|
|
6,
|
|
2,
|
|
]);
|
|
});
|
|
});
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
it("computeSubdivision throws without ellipsoid", function () {
|
|
expect(function () {
|
|
PolygonPipeline.computeSubdivision();
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("computeSubdivision throws without positions", function () {
|
|
expect(function () {
|
|
PolygonPipeline.computeSubdivision(Ellipsoid.WGS84);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("computeSubdivision throws without indices", function () {
|
|
expect(function () {
|
|
PolygonPipeline.computeSubdivision(Ellipsoid.WGS84, []);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("computeSubdivision throws with less than 3 indices", function () {
|
|
expect(function () {
|
|
PolygonPipeline.computeSubdivision(Ellipsoid.WGS84, [], [1, 2]);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("computeSubdivision throws without a multiple of 3 indices", function () {
|
|
expect(function () {
|
|
PolygonPipeline.computeSubdivision(Ellipsoid.WGS84, [], [1, 2, 3, 4]);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("computeSubdivision throws with negative granularity", function () {
|
|
expect(function () {
|
|
PolygonPipeline.computeSubdivision(Ellipsoid.WGS84, [], [1, 2, 3], -1.0);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("computeSubdivision", function () {
|
|
var positions = [
|
|
new Cartesian3(0.0, 0.0, 90.0),
|
|
new Cartesian3(0.0, 90.0, 0.0),
|
|
new Cartesian3(90.0, 0.0, 0.0),
|
|
];
|
|
var indices = [0, 1, 2];
|
|
var subdivision = PolygonPipeline.computeSubdivision(
|
|
Ellipsoid.WGS84,
|
|
positions,
|
|
indices,
|
|
60.0
|
|
);
|
|
|
|
expect(subdivision.attributes.position.values[0]).toEqual(0.0);
|
|
expect(subdivision.attributes.position.values[1]).toEqual(0.0);
|
|
expect(subdivision.attributes.position.values[2]).toEqual(90.0);
|
|
expect(subdivision.attributes.position.values[3]).toEqual(0.0);
|
|
expect(subdivision.attributes.position.values[4]).toEqual(90.0);
|
|
expect(subdivision.attributes.position.values[5]).toEqual(0.0);
|
|
expect(subdivision.attributes.position.values[6]).toEqual(90.0);
|
|
expect(subdivision.attributes.position.values[7]).toEqual(0.0);
|
|
expect(subdivision.attributes.position.values[8]).toEqual(0.0);
|
|
|
|
expect(subdivision.indices[0]).toEqual(0);
|
|
expect(subdivision.indices[1]).toEqual(1);
|
|
expect(subdivision.indices[2]).toEqual(2);
|
|
});
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
it("computeRhumbLineSubdivision throws without ellipsoid", function () {
|
|
expect(function () {
|
|
PolygonPipeline.computeRhumbLineSubdivision();
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("computeRhumbLineSubdivision throws without positions", function () {
|
|
expect(function () {
|
|
PolygonPipeline.computeRhumbLineSubdivision(Ellipsoid.WGS84);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("computeRhumbLineSubdivision throws without indices", function () {
|
|
expect(function () {
|
|
PolygonPipeline.computeRhumbLineSubdivision(Ellipsoid.WGS84, []);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("computeRhumbLineSubdivision throws with less than 3 indices", function () {
|
|
expect(function () {
|
|
PolygonPipeline.computeRhumbLineSubdivision(Ellipsoid.WGS84, [], [1, 2]);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("computeRhumbLineSubdivision throws without a multiple of 3 indices", function () {
|
|
expect(function () {
|
|
PolygonPipeline.computeRhumbLineSubdivision(
|
|
Ellipsoid.WGS84,
|
|
[],
|
|
[1, 2, 3, 4]
|
|
);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("computeRhumbLineSubdivision throws with negative granularity", function () {
|
|
expect(function () {
|
|
PolygonPipeline.computeRhumbLineSubdivision(
|
|
Ellipsoid.WGS84,
|
|
[],
|
|
[1, 2, 3],
|
|
-1.0
|
|
);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("computeRhumbLineSubdivision", function () {
|
|
var positions = Cartesian3.fromDegreesArray([0, 0, 1, 0, 1, 1]);
|
|
var indices = [0, 1, 2];
|
|
var subdivision = PolygonPipeline.computeRhumbLineSubdivision(
|
|
Ellipsoid.WGS84,
|
|
positions,
|
|
indices,
|
|
2 * CesiumMath.RADIANS_PER_DEGREE
|
|
);
|
|
|
|
expect(subdivision.attributes.position.values[0]).toEqual(positions[0].x);
|
|
expect(subdivision.attributes.position.values[1]).toEqual(positions[0].y);
|
|
expect(subdivision.attributes.position.values[2]).toEqual(positions[0].y);
|
|
expect(subdivision.attributes.position.values[3]).toEqual(positions[1].x);
|
|
expect(subdivision.attributes.position.values[4]).toEqual(positions[1].y);
|
|
expect(subdivision.attributes.position.values[5]).toEqual(positions[1].z);
|
|
expect(subdivision.attributes.position.values[6]).toEqual(positions[2].x);
|
|
expect(subdivision.attributes.position.values[7]).toEqual(positions[2].y);
|
|
expect(subdivision.attributes.position.values[8]).toEqual(positions[2].z);
|
|
|
|
expect(subdivision.indices[0]).toEqual(0);
|
|
expect(subdivision.indices[1]).toEqual(1);
|
|
expect(subdivision.indices[2]).toEqual(2);
|
|
});
|
|
|
|
it("computeRhumbLineSubdivision with subdivisions", function () {
|
|
var positions = Cartesian3.fromDegreesArray([0, 0, 1, 0, 1, 1]);
|
|
var indices = [0, 1, 2];
|
|
var subdivision = PolygonPipeline.computeRhumbLineSubdivision(
|
|
Ellipsoid.WGS84,
|
|
positions,
|
|
indices,
|
|
0.5 * CesiumMath.RADIANS_PER_DEGREE
|
|
);
|
|
|
|
expect(subdivision.attributes.position.values.length).toEqual(36); // 12 vertices
|
|
expect(subdivision.indices.length).toEqual(36); // 12 triangles
|
|
});
|
|
|
|
it("computeRhumbLineSubdivision with subdivisions across the IDL", function () {
|
|
var positions = Cartesian3.fromDegreesArray([178, 0, -178, 0, -178, 1]);
|
|
var indices = [0, 1, 2];
|
|
var subdivision = PolygonPipeline.computeRhumbLineSubdivision(
|
|
Ellipsoid.WGS84,
|
|
positions,
|
|
indices,
|
|
0.5 * CesiumMath.RADIANS_PER_DEGREE
|
|
);
|
|
|
|
expect(subdivision.attributes.position.values.length).toEqual(180); // 60 vertices
|
|
expect(subdivision.indices.length).toEqual(252); // 84 triangles
|
|
});
|
|
});
|