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;

 

}

### 回答1: 要计算两个之间的方向,首先需要计算两点之间的距离。 Cesium 提供了一个内置的函数 `Cesium.Cartesian3.distance` 来计算两个之间的距离。 然后,可以使用 `Cesium.Cartesian3.direction` 函数来计算两个之间的方向。 该函数需要两个参数:起点终点的坐标。 它返回一个表示方向的单位向量。 例如: ``` var start = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883); var end = Cesium.Cartesian3.fromDegrees(-80.547, 25.479); var direction = Cesium.Cartesian3.direction(start, end); ``` 这样就可以得到从起点指向终点的方向。 注意:Cesium 中的坐标采用的是笛卡尔坐标系,即 (x, y, z),而非经纬度坐标 (longitude, latitude, height)。因此,在使用 `Cesium.Cartesian3.fromDegrees` 函数将经纬度坐标转换为笛卡尔坐标之前,需要将经纬度坐标转换为弧度制。 ### 回答2: Cesium是一个地理空间开发框架,可以用来在地图上展示和处理地理空间数据。要计算两点之间的方向,可以使用Cesium提供的坐标转换和计算方法。 首先,根据两个的经纬度坐标创建Cesium.Cartographic对象。然后,使用Cesium.Cartesian3.fromRadians方法将经纬度坐标转换为笛卡尔坐标系下的坐标。通过这种方式,我们可以获取两个地球球面上的坐标。 接下来,使用Cesium.Cartesian3.subtract方法计算两个之间的差值向量。这样我们就得到了从第一个指向第二个的向量。 然后,使用Cesium.Cartesian3.normalize方法将向量归一化,得到一个单位向量。这个单位向量表示了两点之间的方向。 最后,可以使用Cesium.Cartesian3.angleBetween方法计算两点之间的角度,或者使用Cesium.Math.toDegrees方法将弧度转换为度数。 综上所述,使用Cesium可以通过坐标转换和向量计算来快速准确地计算出两点之间的方向。它提供了一些方便的方法和函数来支持地理空间计算。 ### 回答3: Cesium是一款开放源代码的地理信息可视化和处理工具,它可以用于计算两点之间的方向。在Cesium中,可以使用以下步骤来计算两个之间的方向: 1. 首先,需要创建两个的实例对象。可以使用Cesium的Cartesian3类来表示每个的三维坐标。例如,1的位置可以表示为`var point1 = new Cesium.Cartesian3(x1, y1, z1);`,2的位置可以表示为`var point2 = new Cesium.Cartesian3(x2, y2, z2);`,其中x1、y1、z1分别是1的x、y、z坐标,x2、y2、z2分别是2的x、y、z坐标。 2. 接下来,使用Cesium的Cartesian3.subtract方法来计算两个的差向量。差向量表示了从1到2的方向和距离。可以使用以下代码来计算差向量:`var directionVector = new Cesium.Cartesian3(); Cesium.Cartesian3.subtract(point2, point1, directionVector);` 3. 最后,可以使用Cesium的Cartesian3.normalize方法将差向量转化为单位向量。单位向量表示了方向,长度为1。代码示例如下:`Cesium.Cartesian3.normalize(directionVector, directionVector);` 通过完成以上步骤,就可以得到从1指向2的方向向量。可以使用单位向量的x、y、z分量来获取方向向量的具体数值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值