Cesium 根據起點、終點、地球曲率以及點數目在兩點之間進行插值

/**

 * @description: 根據起點、終點地球曲率以及點數插值

 * @param {type} 

 * startPoint   Cesium.Cartesian3.fromDegrees

 * endPoint Cesium.Cartesian3.fromDegrees

 * angularityFactor Number

 * numOfSingleLine  Number

 * @return: []

 */

function getPointlist(startPoint,endPoint,angularityFactor,numOfSingleLine){

var result = [];

var startPosition = Cesium.Cartographic.fromCartesian(startPoint);

var endPosition = Cesium.Cartographic.fromCartesian(endPoint);

 

var startLon = startPosition.longitude * 180 / Math.PI;

var startLat = startPosition.latitude * 180 / Math.PI;

var endLon = endPosition.longitude * 180 / Math.PI;

var endLat = endPosition.latitude * 180 / Math.PI;

 

var dist = Math.sqrt((startLon - endLon) * (startLon - endLon) + (startLat - endLat) * (startLat - endLat));


 

//var dist = Cesium.Cartesian3.distance(startPoint, endPoint);

var angularity = dist * angularityFactor;

 

var startVec = Cesium.Cartesian3.clone(startPoint);

var endVec = Cesium.Cartesian3.clone(endPoint);

 

var startLength = Cesium.Cartesian3.distance(startVec, Cesium.Cartesian3.ZERO);

var endLength = Cesium.Cartesian3.distance(endVec, Cesium.Cartesian3.ZERO);

 

Cesium.Cartesian3.normalize(startVec, startVec);

Cesium.Cartesian3.normalize(endVec, endVec);

 

if (Cesium.Cartesian3.distance(startVec, endVec) == 0) {

    return result;

}

var omega = Cesium.Cartesian3.angleBetween(startVec, endVec);

result.push(startPoint);

for (var i = 1; i < numOfSingleLine - 1; i++) {

    var t = i * 1.0 / (numOfSingleLine - 1);

    var invT = 1 - t;

 

    var startScalar = Math.sin(invT * omega) / Math.sin(omega);

    var endScalar = Math.sin(t * omega) / Math.sin(omega);

 

    var startScalarVec = Cesium.Cartesian3.multiplyByScalar(startVec, startScalar, new Cesium.Cartesian3());

    var endScalarVec = Cesium.Cartesian3.multiplyByScalar(endVec, endScalar, new Cesium.Cartesian3());

 

    var centerVec = Cesium.Cartesian3.add(startScalarVec, endScalarVec, new Cesium.Cartesian3());

 

    var ht = t * Math.PI;

    var centerLength = startLength * invT + endLength * t + Math.sin(ht) * angularity;

    centerVec = Cesium.Cartesian3.multiplyByScalar(centerVec, centerLength, centerVec);

 

    result.push(centerVec);

}

 

result.push(endPoint);

 

return result;

 

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章