最近在做地图开发时,需要根据一个坐标点,计算偏转指定角度和长度后的新坐标。其中用到了三角函数的计算。对应三角函数,忘的已经差不多了,碰到这问题也是花费了一些时间再了解相关知识。本文记录下来,以备后续使用,使用代码为js,其他语言算法相同。
计算过程如下图:
s为起点坐标,e为需要计算的终点坐标。θ为终点相对起点的偏转角度,d为起点到终点的距离。
e的x坐标 = s起点的x坐标 + x’; // (x' = d * sinθ)
e的y坐标 = s起点的y坐标 + y’; // (y' = d * cosθ)
一、平面坐标计算代码
/// 平面坐标系,通过三角函数求终点坐标
/// 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偏移量时,需要根据所在维度进行转换