Cesium 已知两点,计算以一个点为圆心,将另一个点旋转一定度数后的新点的坐标/position_A绕position_B逆时针旋转angle度(角度)得到新点 function rotatedPo

本文介绍了一种在Cesium环境中实现点绕另一点逆时针旋转特定角度的算法。通过建立局部坐标系,利用矩阵变换实现了从世界坐标到局部坐标再到旋转后世界坐标的转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//position_A绕position_B逆时针旋转angle度(角度)得到新点
function rotatedPointByAngle(position_A, position_B, angle) {
    //以B点为原点建立局部坐标系(东方向为x轴,北方向为y轴,垂直于地面为z轴),得到一个局部坐标到世界坐标转换的变换矩阵
    var localToWorld_Matrix = Cesium.Transforms.eastNorthUpToFixedFrame(position_B);
    //求世界坐标到局部坐标的变换矩阵
    var worldToLocal_Matrix = Cesium.Matrix4.inverse(localToWorld_Matrix, new Cesium.Matrix4());
    //B点在局部坐标的位置,其实就是局部坐标原点
    var localPosition_B = Cesium.Matrix4.multiplyByPoint(worldToLocal_Matrix, position_B, new Cesium.Cartesian3());
    //A点在以B点为原点的局部的坐标位置
    var localPosition_A = Cesium.Matrix4.multiplyByPoint(worldToLocal_Matrix, position_A, new Cesium.Cartesian3());
    //根据数学公式A点逆时针旋转angle度后在局部坐标系中的x,y,z位置
    var new_x = localPosition_A.x * Math.cos(Cesium.Math.toRadians(angle)) + localPosition_A.y *   Math.sin(Cesium.Math.toRadians(angle));
    var new_y = localPosition_A.y * Math.cos(Cesium.Math.toRadians(angle)) - localPosition_A.x * Math.sin(Cesium.Math.toRadians(angle));
    var new_z = localPosition_A.z;
    //最后应用局部坐标到世界坐标的转换矩阵求得旋转后的A点世界坐标
    return Cesium.Matrix4.multiplyByPoint(localToWorld_Matrix, new Cesium.Cartesian3(new_x, new_y, new_z), new Cesium.Cartesian3());
}
Cesium中,计算两点之间的方位角通常用于确定从一个点一个点的理想直线路径相对于地球表面的朝向。这个角度通常被称为"航向角"或"真北角"。以下是一个简单的步骤来计算方位角: 1. **准备数据**:首先获取两个的经纬坐标。例如,设AlonA,纬latA,BlonB,纬latB。 2. **转换坐标**:将地理坐标转换为三维笛卡尔坐标,因为Cesium基于这种坐标系统。可以使用`Cesium.Ellipsoid.WGS84.cartographicToCartesian`方法: ```javascript const pointA = Cesium.Ellipsoid.WGS84.cartographicToCartesian(new Cesium.Cartographic(lonA, latA, 0)); const pointB = Cesium.Ellipsoid.WGS84.cartographicToCartesian(new Cesium.Cartographic(lonB, latB, 0)); ``` 3. **计算矢量**:通过减法得到从A到B的向量: ```javascript const vectorAB = Cesium.Cartesian3.subtract(pointB, pointA, new Cesium.Cartesian3()); ``` 4. **找到地磁北向量**:由于地球上存在磁偏角,Cesium提供了一个方法`Cesium.Math.geodeticSurfaceNormal`来计算地心引力作用下的正常向量,这可以近似看作是地磁北向量: ```javascript const geodeticNormal = Cesium.Ellipsoid.WGS84.geodeticSurfaceNormal(latA, lonA); ``` 5. **计算方位角**:最后,通过向量A-B与地磁北向量的内积除以向量A-B的长,然后取反正切值(注意结果可能是负数,所以加上π如果小于0),就可以得到方位角: ```javascript const angle = Math.atan2(Cesium.Cartesian3.dot(geodeticNormal, vectorAB), Cesium.Cartesian3.magnitude(vectorAB)) % (2 * Math.PI); const bearing = angle * (180 / Math.PI); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值