分享一個原創的地球上點到線的距離計算方法

這個程序已經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 ;                
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章