var viewer = new Cesium.Viewer('cesiumContainer');
viewer.terrainProvider = Cesium.createWorldTerrain();
var rectanglePoints = [];
var mousePoint = null;
var rectangleEntity = null;
var currentColor = Cesium.Color.WHITE.withAlpha(0.5);
// function accepts and returns cesium cartographic objects or array of [x,y] points
function sinusoidalProjection(points, reverse) {
let earth_radius = 6371009;
let projectedPoints = [];
if (reverse) {
points.forEach((point) => {
let latitude = point[1]/earth_radius;
let longitude = point[0]/(earth_radius*Math.cos(latitude));
let projectedPoint = Cesium.Cartographic.fromRadians(longitude, latitude);
projectedPoints.push(projectedPoint);
});
} else {
points.forEach((point) => {
let pointX = point.longitude * earth_radius * Math.cos(point.latitude);
let pointY = point.latitude * earth_radius;
let projectedPoint = [pointX, pointY];
projectedPoints.push(projectedPoint);
});
}
return projectedPoints;
}
function addEnt() {
let displayCondition = new Cesium.DistanceDisplayCondition(0, 1200);
// This is the first point
var height = Cesium.Cartographic.fromCartesian(rectanglePoints[0]).height + 0.1;
let heading = (viewer.camera.heading);
let theta = 360-(heading * 180/Math.PI);
testEnt = viewer.entities.add({
polygon: {
hierarchy: new Cesium.CallbackProperty(function() {
let firstCarto = Cesium.Cartographic.fromCartesian(rectanglePoints[0]);
let mouseCarto = Cesium.Cartographic.fromCartesian(mousePoint);
let cartesianPoints = sinusoidalProjection([firstCarto, mouseCarto]);
let c1 = cartesianPoints[0][1]-(Math.tan(theta)*cartesianPoints[0][0]); // c1=y-tan(theta) * x
let c2 = cartesianPoints[1][1]+(cartesianPoints[1][0]/Math.tan(theta)); // c2=y+(x/tan(theta))
let x = (c2-c1)/(Math.tan(theta)+(1/Math.tan(theta)));
let y = Math.tan(theta)*x + c1;
let firstPoint = [x,y];
let c3 = cartesianPoints[0][1]+(cartesianPoints[0][0]/Math.tan(theta)); // c3=y+(x/tan(theta))
let c4 = cartesianPoints[1][1]-(Math.tan(theta)*cartesianPoints[1][0]); // c4=y-tan(theta) * x
x = (c3-c4)/(Math.tan(theta)+(1/Math.tan(theta)));
y = Math.tan(theta)*x+c4;
let secondPoint = [x,y];
console.log("LOGS");
console.log("First point " + cartesianPoints[0]);
console.log("Mouse point " + cartesianPoints[1]);
console.log("First found corner " + firstPoint);
console.log("Second found corner " + secondPoint);
let finalCartoPoints = sinusoidalProjection([cartesianPoints[0], cartesianPoints[1], firstPoint, secondPoint], true);
let finalCartesians = [];
finalCartoPoints.forEach((point) => {
let cartesian = Cesium.Cartesian3.fromRadians(point.longitude, point.latitude, 10);
finalCartesians.push(cartesian);
});
finalCartesians.forEach(point => {
viewer.entities.add({
position: point,
point: {
pixelSize: 5,
material: currentColor,
outlineWidth: 2,
},
});
});
console.log(finalCartesians);
return [...finalCartesians, mousePoint];
}, false),
material: currentColor,
height: height
}
});
}
new Cesium.ScreenSpaceEventHandler(viewer.canvas).setInputAction(function (event) {
var cartesianPosition = viewer.scene.pickPosition(event.position);
if (rectanglePoints.length === 0) {
rectanglePoints.push(cartesianPosition);
addEnt();
} else {
viewer.entities.remove(rectangleEntity);
rectanglePoints.push(cartesianPosition);
addEnt();
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
new Cesium.ScreenSpaceEventHandler(viewer.canvas).setInputAction(function (event) {
mousePoint = viewer.scene.pickPosition(event.endPosition);
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);