根据两点坐标获取航向角和距离的c程序

#include <stdio.h>
#include <math.h>

#define PI 3.1415926
#define EARTH_RADIUS 6378.137 //地球近似半径

double radian(double d);
double get_distance(double lat1, double lng1, double lat2, double lng2);

// 求弧度
double radian(double d)
{
 return d * PI / 180.0; //角度1˚ = π / 180
}


//计算距离
double get_distance(double lat1, double lng1, double lat2, double lng2)
{
 double radLat1 = radian(lat1);
 double radLat2 = radian(lat2);
 double a = radLat1 - radLat2;
 double b = radian(lng1) - radian(lng2);

 double dst = 2 * asin((sqrt(pow(sin(a / 2), 2) + cos(radLat1) * cos(radLat2) * pow(sin(b / 2), 2) )));

 dst = dst * EARTH_RADIUS;
 dst= round(dst * 10000) / 10000;
 return dst;
}
int get_bearing(double lat1, double lng1, double lat2, double lng2)
{
 int distance_North = EARTH_RADIUS*(lat2-lat1);
 int distance_East = EARTH_RADIUS*cos(lat1)*(lng2-lng1);
 // int bearing = modf( atan2(distance_East, distance_North), 2*PI );

 // return bearing;

}
double toRadian(double point)
{
 return (point*M_PI)/180.0;
}

double toDegree(double point)
{
 return point*180.0/ M_PI;
}

int toBearing(double angle)
{

 double bearing = toDegree(angle)+ 360.0;
 return fmod(bearing, 360);
}

/*

 This function will determine the bearing of the path to be travelled

*/

double getBearing(double longtitude_start, double latitude_start, double longtitude_end, double latitude_end)
{
 double rad_latitude_start = toRadian(latitude_start);

 double rad_latitude_end = toRadian(latitude_end);

 double deltaLongtitude = toRadian(longtitude_end)- toRadian(longtitude_start);

 double x = sin(deltaLongtitude)*cos(rad_latitude_end);

 double y = cos(rad_latitude_start)*sin(rad_latitude_end)-sin(rad_latitude_start)*cos(rad_latitude_end)*cos(deltaLongtitude);

 return toBearing(atan2(x, y));

}
double getAngle1(double lat_a, double lng_a, double lat_b, double lng_b)
{

 double y = sin(lng_b-lng_a) * cos(lat_b);
 double x = cos(lat_a)*sin(lat_b) - sin(lat_a)* cos(lat_b)* cos(lng_b-lng_a);
 double bearing = atan2(y, x);

 // bearing = Math.toDegrees(bearing);
 if(bearing < 0){
 bearing = bearing +360;
 }
 return bearing;

}
//heading :车的航向角相对于真北方向
// bearing: 目的地相对于真北方向的方位角
//返回:最优的转弯方案:转弯方向,转弯角度,行驶距离
int HeadingAnalysis(int Heading,int Bearing)
{
 int headingtmp;
 if((Heading - Bearing)< 0)
 {

 headingtmp = Heading +360;
 if(headingtmp - Bearing <= 180)
 {
 //左转
 printf("turn left %d\n",headingtmp - Bearing);
 }else if(headingtmp - Bearing > 180){
 printf("turn right %d\n",360- (headingtmp-Bearing));

 }
 }else if((Heading - Bearing) > 0)
 {
 if(Heading - Bearing < 180)
 {
 printf("turn left %d\n",Heading - Bearing);
 }
 else if(Heading - Bearing > 180)
 {
 printf("turn right %d \n",360-(Heading-Bearing));
 }
 }


}
int main (int argc, const char * argv[])
{

 double lat1 = 39.90759;
 double lng1 = 116.41552;//经度,纬度1
 double lat2 = 39.93804;
 double lng2 = 116.41371;//经度,纬度2
 // insert code here...
 int angle;
 double dst = get_distance(lat1, lng1, lat2, lng2);

 angle= getBearing( lng1,lat1, lng2 ,lat2);
 printf("dst = %0.3fkm\n", dst); //dst = 9.281km
 // printf("angle = %d 度\n", angle);
 HeadingAnalysis(70,150);
 return 0;

}


该程序已经在Linux下验证通过可行,该程序和算法将最终用到GPS定位小车上。

2AC8DBED-54D9-421b-9367-FDE15C61AEA6.png

微信截图_20201028103550.png


				

sitemap