以为有公式,百度不到,谷歌的看不懂(再次强调英文重要性),咬牙自己算,就当做小学数学题了。
注:自己随便写的,仅作参考。。。
#include <iostream>
#include <math.h>
using namespace std;
#define PI 3.14159265358979323846264338327950288
static bool status = false;
/*
* 起始点为 A,终点为 B(位于 A 点东北方),标出点 C(与 A 点同经度,与 B 点同纬度)
* A、B 间空间直线距离用 ab 表示,A、B 间表面弧长用 AB 表示
* 1、由 AB 可以得到 ab;
* 2、再由航向角得到 ac 与 bc;
* 3、再根据地球半径得到 AC 与 BC,还有对象的弧度;
* 4、由 AC 与 地球半径可以得到纬度偏移量;
* 5、由 BC 与 已知纬度,可以得到经度偏移量
*
* 地球假定为规则圆球,半径为 6371.393 千米
* 参数:起始点经度、纬度、航向角、两起止点距离
*/
bool CalTitude(double longitude0, double latitude0, double& longitude1, double& latitude1, double angle, double distance)
{
if (!status)
{
return false;
}
double R = 6371.393; //地球半径
double AB = distance; //行进距离
double ang = angle / 180 * PI; //角BAC
double lon0 = longitude0 / 180 * PI;
double lat0 = latitude0 / 180 * PI;
double nAB = AB / R; //AB 对应的圆心角
double ab = R * sin(nAB / 2) * 2;
double ac = ab * cos(ang);
double bc = ab * sin(ang);
double nAC = asin(ac / R) * 2; //AC 对应的圆心角
double nBC = asin(bc / R) * 2; //BC 对应的圆心角
double lat1 = lat0 + nAC; //B、C 两点的纬度角
double r = R * cos(lat1); //纬度圈半径
double nbc = asin(bc / (2 * r)) * 2; //纬度圈经度偏移量
longitude1 = longitude0 + nbc * 180 / PI;
latitude1 = lat1 * 180 / PI;
return true;
}
/*
* 扩充上方函数,加一个壳,使用上方函数记录差值,然后在此函数中累加差值,可以得到实际目标经纬度
*/
bool CalTitude(double longitude0, double latitude0, double& longitude1, double& latitude1, double angle, double distance, bool b)
{
if (!b)
{
return false;
}
else
{
status = true;
}
if (angle >= 0 && angle <= 90)
{
CalTitude(longitude0, latitude0, longitude1, latitude1, angle, distance);
}
else if (angle >= 90 && angle <= 180)
{
CalTitude(longitude0, latitude0, longitude1, latitude1, 180 - angle, distance);
//起始点加上经度差值,减去纬度差值
latitude1 -= 2 * (latitude1 - latitude0);
}
else if (angle >= 180 && angle <= 270)
{
CalTitude(longitude0, latitude0, longitude1, latitude1, angle - 180, distance);
//起始点减去经度差值,减去纬度差值
longitude1 -= 2 * (longitude1 - longitude0);
latitude1 -= 2 * (latitude1 - latitude0);
}
else if (angle >= 270 && angle <= 360)
{
CalTitude(longitude0, latitude0, longitude1, latitude1, 360 - angle, distance);
//起始点减去经度差值,加上纬度差值
longitude1 -= 2 * (longitude1 - longitude0);
}
else
{
return false;
}
return true;
}
int main()
{
double l1 = 0;
double l2 = 0;
CalTitude(123, 5, l1, l2, 120, 100, true);
cout << l1 << endl;
cout << l2 << endl;
return 0;
}