[分享]计算地球上的点到一条直线的距离的算法

分享一个原创的地球上点到线的距离计算方法
https://www.amobbs.com/thread-5728196-1-1.html
(出处: amoBBS 阿莫电子论坛)

描述如下,已知一条直线,直线的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;
        /**
        * 随着纬度的升高,纬度1圈的周长不断变短,  到南北极点,长度变成0.
        */
        cos_value=cos(x/100000000*PI/180);
        if((x1!=x2)&&(y1!=y2))
        {
                a=(x2-x1)*(y-y1)/(y2-y1)+x1;//计算出点到直线的x方向的投影
                b=(y2-y1)*(x-x1)/(x2-x1)+y1;//计算出点到直线的y方向的投影
                v=llabs(x-a);   //计算出点到直线的x方向上的距离     //计算出的单位为cm
                h=llabs(y-b)*cos_value;//计算出点到直线的y方向上的距离
                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 ;                
}

具体是利用的直角三角形的 长*宽 =斜边的长*高 这一原理,MARk学习一下

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值