237 lines
8.1 KiB
JavaScript
237 lines
8.1 KiB
JavaScript
|
/**
|
||
|
* @license
|
||
|
* Cesium - https://github.com/CesiumGS/cesium
|
||
|
* Version 1.117
|
||
|
*
|
||
|
* Copyright 2011-2022 Cesium Contributors
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*
|
||
|
* Columbus View (Pat. Pend.)
|
||
|
*
|
||
|
* Portions licensed separately.
|
||
|
* See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details.
|
||
|
*/
|
||
|
|
||
|
import {
|
||
|
GeographicProjection_default
|
||
|
} from "./chunk-NI2R52QD.js";
|
||
|
import {
|
||
|
Matrix2_default,
|
||
|
Rectangle_default
|
||
|
} from "./chunk-I5TDPPC4.js";
|
||
|
import {
|
||
|
Cartesian3_default,
|
||
|
Cartographic_default
|
||
|
} from "./chunk-C5CE4OG6.js";
|
||
|
import {
|
||
|
Math_default
|
||
|
} from "./chunk-4PHPQRSH.js";
|
||
|
import {
|
||
|
DeveloperError_default
|
||
|
} from "./chunk-U4IMCOF5.js";
|
||
|
import {
|
||
|
defined_default
|
||
|
} from "./chunk-BDUJXBVF.js";
|
||
|
|
||
|
// packages/engine/Source/Core/RectangleGeometryLibrary.js
|
||
|
var cos = Math.cos;
|
||
|
var sin = Math.sin;
|
||
|
var sqrt = Math.sqrt;
|
||
|
var RectangleGeometryLibrary = {};
|
||
|
RectangleGeometryLibrary.computePosition = function(computedOptions, ellipsoid, computeST, row, col, position, st) {
|
||
|
const radiiSquared = ellipsoid.radiiSquared;
|
||
|
const nwCorner = computedOptions.nwCorner;
|
||
|
const rectangle = computedOptions.boundingRectangle;
|
||
|
let stLatitude = nwCorner.latitude - computedOptions.granYCos * row + col * computedOptions.granXSin;
|
||
|
const cosLatitude = cos(stLatitude);
|
||
|
const nZ = sin(stLatitude);
|
||
|
const kZ = radiiSquared.z * nZ;
|
||
|
let stLongitude = nwCorner.longitude + row * computedOptions.granYSin + col * computedOptions.granXCos;
|
||
|
const nX = cosLatitude * cos(stLongitude);
|
||
|
const nY = cosLatitude * sin(stLongitude);
|
||
|
const kX = radiiSquared.x * nX;
|
||
|
const kY = radiiSquared.y * nY;
|
||
|
const gamma = sqrt(kX * nX + kY * nY + kZ * nZ);
|
||
|
position.x = kX / gamma;
|
||
|
position.y = kY / gamma;
|
||
|
position.z = kZ / gamma;
|
||
|
if (computeST) {
|
||
|
const stNwCorner = computedOptions.stNwCorner;
|
||
|
if (defined_default(stNwCorner)) {
|
||
|
stLatitude = stNwCorner.latitude - computedOptions.stGranYCos * row + col * computedOptions.stGranXSin;
|
||
|
stLongitude = stNwCorner.longitude + row * computedOptions.stGranYSin + col * computedOptions.stGranXCos;
|
||
|
st.x = (stLongitude - computedOptions.stWest) * computedOptions.lonScalar;
|
||
|
st.y = (stLatitude - computedOptions.stSouth) * computedOptions.latScalar;
|
||
|
} else {
|
||
|
st.x = (stLongitude - rectangle.west) * computedOptions.lonScalar;
|
||
|
st.y = (stLatitude - rectangle.south) * computedOptions.latScalar;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
var rotationMatrixScratch = new Matrix2_default();
|
||
|
var nwCartesian = new Cartesian3_default();
|
||
|
var centerScratch = new Cartographic_default();
|
||
|
var centerCartesian = new Cartesian3_default();
|
||
|
var proj = new GeographicProjection_default();
|
||
|
function getRotationOptions(nwCorner, rotation, granularityX, granularityY, center, width, height) {
|
||
|
const cosRotation = Math.cos(rotation);
|
||
|
const granYCos = granularityY * cosRotation;
|
||
|
const granXCos = granularityX * cosRotation;
|
||
|
const sinRotation = Math.sin(rotation);
|
||
|
const granYSin = granularityY * sinRotation;
|
||
|
const granXSin = granularityX * sinRotation;
|
||
|
nwCartesian = proj.project(nwCorner, nwCartesian);
|
||
|
nwCartesian = Cartesian3_default.subtract(nwCartesian, centerCartesian, nwCartesian);
|
||
|
const rotationMatrix = Matrix2_default.fromRotation(rotation, rotationMatrixScratch);
|
||
|
nwCartesian = Matrix2_default.multiplyByVector(
|
||
|
rotationMatrix,
|
||
|
nwCartesian,
|
||
|
nwCartesian
|
||
|
);
|
||
|
nwCartesian = Cartesian3_default.add(nwCartesian, centerCartesian, nwCartesian);
|
||
|
nwCorner = proj.unproject(nwCartesian, nwCorner);
|
||
|
width -= 1;
|
||
|
height -= 1;
|
||
|
const latitude = nwCorner.latitude;
|
||
|
const latitude0 = latitude + width * granXSin;
|
||
|
const latitude1 = latitude - granYCos * height;
|
||
|
const latitude2 = latitude - granYCos * height + width * granXSin;
|
||
|
const north = Math.max(latitude, latitude0, latitude1, latitude2);
|
||
|
const south = Math.min(latitude, latitude0, latitude1, latitude2);
|
||
|
const longitude = nwCorner.longitude;
|
||
|
const longitude0 = longitude + width * granXCos;
|
||
|
const longitude1 = longitude + height * granYSin;
|
||
|
const longitude2 = longitude + height * granYSin + width * granXCos;
|
||
|
const east = Math.max(longitude, longitude0, longitude1, longitude2);
|
||
|
const west = Math.min(longitude, longitude0, longitude1, longitude2);
|
||
|
return {
|
||
|
north,
|
||
|
south,
|
||
|
east,
|
||
|
west,
|
||
|
granYCos,
|
||
|
granYSin,
|
||
|
granXCos,
|
||
|
granXSin,
|
||
|
nwCorner
|
||
|
};
|
||
|
}
|
||
|
RectangleGeometryLibrary.computeOptions = function(rectangle, granularity, rotation, stRotation, boundingRectangleScratch, nwCornerResult, stNwCornerResult) {
|
||
|
let east = rectangle.east;
|
||
|
let west = rectangle.west;
|
||
|
let north = rectangle.north;
|
||
|
let south = rectangle.south;
|
||
|
let northCap = false;
|
||
|
let southCap = false;
|
||
|
if (north === Math_default.PI_OVER_TWO) {
|
||
|
northCap = true;
|
||
|
}
|
||
|
if (south === -Math_default.PI_OVER_TWO) {
|
||
|
southCap = true;
|
||
|
}
|
||
|
let dx;
|
||
|
const dy = north - south;
|
||
|
if (west > east) {
|
||
|
dx = Math_default.TWO_PI - west + east;
|
||
|
} else {
|
||
|
dx = east - west;
|
||
|
}
|
||
|
const width = Math.ceil(dx / granularity) + 1;
|
||
|
const height = Math.ceil(dy / granularity) + 1;
|
||
|
const granularityX = dx / (width - 1);
|
||
|
const granularityY = dy / (height - 1);
|
||
|
const nwCorner = Rectangle_default.northwest(rectangle, nwCornerResult);
|
||
|
const center = Rectangle_default.center(rectangle, centerScratch);
|
||
|
if (rotation !== 0 || stRotation !== 0) {
|
||
|
if (center.longitude < nwCorner.longitude) {
|
||
|
center.longitude += Math_default.TWO_PI;
|
||
|
}
|
||
|
centerCartesian = proj.project(center, centerCartesian);
|
||
|
}
|
||
|
const granYCos = granularityY;
|
||
|
const granXCos = granularityX;
|
||
|
const granYSin = 0;
|
||
|
const granXSin = 0;
|
||
|
const boundingRectangle = Rectangle_default.clone(
|
||
|
rectangle,
|
||
|
boundingRectangleScratch
|
||
|
);
|
||
|
const computedOptions = {
|
||
|
granYCos,
|
||
|
granYSin,
|
||
|
granXCos,
|
||
|
granXSin,
|
||
|
nwCorner,
|
||
|
boundingRectangle,
|
||
|
width,
|
||
|
height,
|
||
|
northCap,
|
||
|
southCap
|
||
|
};
|
||
|
if (rotation !== 0) {
|
||
|
const rotationOptions = getRotationOptions(
|
||
|
nwCorner,
|
||
|
rotation,
|
||
|
granularityX,
|
||
|
granularityY,
|
||
|
center,
|
||
|
width,
|
||
|
height
|
||
|
);
|
||
|
north = rotationOptions.north;
|
||
|
south = rotationOptions.south;
|
||
|
east = rotationOptions.east;
|
||
|
west = rotationOptions.west;
|
||
|
if (north < -Math_default.PI_OVER_TWO || north > Math_default.PI_OVER_TWO || south < -Math_default.PI_OVER_TWO || south > Math_default.PI_OVER_TWO) {
|
||
|
throw new DeveloperError_default(
|
||
|
"Rotated rectangle is invalid. It crosses over either the north or south pole."
|
||
|
);
|
||
|
}
|
||
|
computedOptions.granYCos = rotationOptions.granYCos;
|
||
|
computedOptions.granYSin = rotationOptions.granYSin;
|
||
|
computedOptions.granXCos = rotationOptions.granXCos;
|
||
|
computedOptions.granXSin = rotationOptions.granXSin;
|
||
|
boundingRectangle.north = north;
|
||
|
boundingRectangle.south = south;
|
||
|
boundingRectangle.east = east;
|
||
|
boundingRectangle.west = west;
|
||
|
}
|
||
|
if (stRotation !== 0) {
|
||
|
rotation = rotation - stRotation;
|
||
|
const stNwCorner = Rectangle_default.northwest(boundingRectangle, stNwCornerResult);
|
||
|
const stRotationOptions = getRotationOptions(
|
||
|
stNwCorner,
|
||
|
rotation,
|
||
|
granularityX,
|
||
|
granularityY,
|
||
|
center,
|
||
|
width,
|
||
|
height
|
||
|
);
|
||
|
computedOptions.stGranYCos = stRotationOptions.granYCos;
|
||
|
computedOptions.stGranXCos = stRotationOptions.granXCos;
|
||
|
computedOptions.stGranYSin = stRotationOptions.granYSin;
|
||
|
computedOptions.stGranXSin = stRotationOptions.granXSin;
|
||
|
computedOptions.stNwCorner = stNwCorner;
|
||
|
computedOptions.stWest = stRotationOptions.west;
|
||
|
computedOptions.stSouth = stRotationOptions.south;
|
||
|
}
|
||
|
return computedOptions;
|
||
|
};
|
||
|
var RectangleGeometryLibrary_default = RectangleGeometryLibrary;
|
||
|
|
||
|
export {
|
||
|
RectangleGeometryLibrary_default
|
||
|
};
|