平面/球面坐标中已知起点坐标、(偏转)角度、长度求终点坐标(三角函数)

4 篇文章 1 订阅

    最近在做地图开发时,需要根据一个坐标点,计算偏转指定角度和长度后的新坐标。其中用到了三角函数的计算。对应三角函数,忘的已经差不多了,碰到这问题也是花费了一些时间再了解相关知识。本文记录下来,以备后续使用,使用代码为js,其他语言算法相同。

    计算过程如下图:

        s为起点坐标,e为需要计算的终点坐标。θ为终点相对起点的偏转角度,d为起点到终点的距离。

        e的x坐标 = s起点的x坐标 + x’; //  (x' =  d * sinθ)

        e的y坐标 = s起点的y坐标 + y’; //  (y' =  d * cosθ)

    1-200R1121945J8.png

    一、平面坐标计算代码

/// 平面坐标系,通过三角函数求终点坐标
/// startPoint(x,y): 起点
/// angle: 角度
/// distance: 距离
/// <returns>终点坐标</returns>
function calNewPointByAngle2(startPoint, angle, distance) {
    var endPoint = {};
    
    // 角度转弧度
    var radian = (angle * Math.PI) / 180;
    
    // 计算新坐标(对于无限接近0的数字,此处没有优化)
    endPoint.x = startPoint.x + distance * Math.sin(radian);
    endPoint.y = startPoint.y + distance * Math.cos(radian);
    
    return endPoint;
}

    二、球面坐标计算代码

/// 球面坐标系,通过三角函数求终点坐标
/// startPoint(lng,lat,alt): 起点
/// angle: 角度
/// distance: 距离
/// <returns>终点坐标</returns>
function calNewPointByAngle3(startPoint, angle, distance) {
    var rate = Math.cos(startPoint.lat * Math.PI / 180); // 指定维度球面长度和赤道长度的比率

    var lat_meter = 111111; // 1维度 ≈ 111,111米
    var r = angle * Math.PI / 180.0;
    var x = Math.sin(r) * distance;
    var y = Math.cos(r) * distance;
    x = x / lat_meter / rate; // x偏移量需要根据所在维度进行计算
    y = y / lat_meter;

    return {
        x: startPoint.lng + x,
        y: startPoint.lat + y,
        z: startPoint.alt
    };
}

    注意:

        1. 计算坐标时,对于无限接近0的小数没有进行优化,可根据实际转换为0

        2. 球面坐标计算时,不同维度球面周长不同,计算x偏移量时,需要根据所在维度进行转换

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: WGS84世界坐标系的起点坐标角度和半径终点坐标的C语言公式为:x2 = x1 + r * cos(angle),y2 = y1 + r * sin(angle),其x1、y1表示起点坐标,r表示半径,angle表示角度。 ### 回答2: 在WGS84世界坐标,可以使用三角函数计算给定起点坐标角度和半径的终点坐标。具体步骤如下: 步骤1:将起点坐标转换为弧度制。根据WGS84世界坐标系的定义,经度范围为-180到+180度,纬度范围为-90到+90度。将经度和纬度转换为弧度可使用以下公式: radian_longitude = longitude * π / 180 radian_latitude = latitude * π / 180 步骤2:计算终点纬度。根据起点纬度、角度和半径,可使用以下公式计算终点纬度: radian_end_latitude = asin(sin(radian_start_latitude) * cos(radius) + cos(radian_start_latitude) * sin(radius) * cos(angle)) 步骤3:计算终点经度。根据起点经度、起点纬度、终点纬度、角度和半径,可使用以下公式计算终点经度: radian_end_longitude = radian_start_longitude + atan2(sin(angle) * sin(radius) * cos(radian_start_latitude), cos(radius) - sin(radian_start_latitude) * sin(radian_end_latitude)) 步骤4:将终点坐标从弧度制转换为度数。使用以下公式将弧度转换为度数: end_longitude = radian_end_longitude * 180 / π end_latitude = radian_end_latitude * 180 / π 根据以上步骤,可以编写C代码来计算给定起点坐标角度和半径的终点坐标。具体实现方式如下所示: #include <math.h> void calculateEndpoint(double start_latitude, double start_longitude, double angle, double radius, double *end_latitude, double *end_longitude) { double radian_start_latitude = start_latitude * M_PI / 180; double radian_start_longitude = start_longitude * M_PI / 180; double radian_end_latitude = asin(sin(radian_start_latitude) * cos(radius) + cos(radian_start_latitude) * sin(radius) * cos(angle)); double radian_end_longitude = radian_start_longitude + atan2(sin(angle) * sin(radius) * cos(radian_start_latitude), cos(radius) - sin(radian_start_latitude) * sin(radian_end_latitude)); *end_latitude = radian_end_latitude * 180 / M_PI; *end_longitude = radian_end_longitude * 180 / M_PI; } 以上代码定义了一个名为calculateEndpoint的函数,接受起点纬度、起点经度、角度和半径作为输入,将计算得到的终点纬度和经度存储在指针end_latitude和end_longitude所指向的变量。使用时,可以调用该函数来计算终点坐标。 注意:在实际使用,可能需要对计算结果进行一些修正,以确保纬度和经度的取值范围符合WGS84世界坐标系的定义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值