WithCoderWithCoderWithCoder

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

    最近在做地图开发时,需要根据一个坐标点,计算偏转指定角度和长度后的新坐标。其中用到了三角函数的计算。对应三角函数,忘的已经差不多了,碰到这问题也是花费了一些时间再了解相关知识。本文记录下来,以备后续使用,使用代码为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偏移量时,需要根据所在维度进行转换

欢迎分享交流,转载请注明出处:WithCoder » 平面/球面坐标中已知起点坐标、(偏转)角度、长度求终点坐标(三角函数)