DSDSWeb/static/js/Cesium-1.53/Specs/Core/PolygonPipelineSpec.js

197 lines
8.3 KiB
JavaScript
Raw Normal View History

2024-07-11 18:02:47 +08:00
defineSuite([
'Core/PolygonPipeline',
'Core/Cartesian2',
'Core/Cartesian3',
'Core/Ellipsoid',
'Core/Math',
'Core/WindingOrder'
], function(
PolygonPipeline,
Cartesian2,
Cartesian3,
Ellipsoid,
CesiumMath,
WindingOrder) {
'use strict';
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);
});
});