這個程序已經STM32上實現,
描述如下,已知一條直線,直線的2端的GPS座標已經精確測定,分別是(X1,Y1) (X2,Y2), 當另一個點(x,y)慢慢的靠近這條線時,求這個點到線的距離, 這個會動的點的座標是實時測量的,會變, 要連續的計算點的線的距離,根據距離來做下一步操作,
這個程序計算出來是有誤差的,因爲它只考慮了緯度的變化,沒有完整考慮地球的曲率。
我測試的情況是,點與線的距離範圍在3KM之內,且線的長度在3KM內時,誤差在cm級。
不知道這個東西用處大不大
先上程序。
/*計算點到線的距離 垂直距離 此計算方法適用於近距離(站場內)計算,採用的是三角形計算面積
x,y機車所在點 緯度與經度
x1,y1,x2,y2爲已知兩點的直線 ( 緯度與經度爲擴大1億倍的長整形)
*/
#include <stdlib.h>
#define PI 3.1415926535898
#define EARTHR 6371004
#define DIS_RANGE 5000//2698
long long Distance_point2line(long long x, long long y, long long x1, long long y1, long long x2, long long y2)
{
long long Distance;
long long a,b;
long long h,v; //垂直距離與水平距離
double cos_value;
cos_value=cos(x/100000000*PI/180);
if((x1!=x2)&&(y1!=y2))
{
a=(x2-x1)*(y-y1)/(y2-y1)+x1;
b=(y2-y1)*(x-x1)/(x2-x1)+y1;
v=llabs(x-a); //計算出的單位爲cm
h=llabs(y-b)*cos_value;
Distance=(EARTHR)*PI* h*v/sqrt(h*h+v*v)/180000000; //計算出的單位爲cm
}
else if(x1==x2)
{
h=0;
v=llabs(x-x1);
Distance=(EARTHR)*PI* v /180000000; //計算出的單位爲cm
}
else if(y1==y2)
{ h=llabs(y-y1)*cos_value;
v=0;
Distance=(EARTHR)*PI* h /180000000; //計算出的單位爲cm
}
printf("dis:%lldcm\r\n",Distance);
return Distance ;
}