搜索
bottom↓
回复: 34

分享一个原创的地球上点到线的距离计算方法

  [复制链接]

出0入0汤圆

发表于 2020-2-26 14:13:39 | 显示全部楼层 |阅读模式
本帖最后由 jjj 于 2020-2-27 10:32 编辑

这个程序已经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 ;               
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2020-2-26 14:19:01 | 显示全部楼层
这个程序计算出来是有误差的,因为它只考虑了纬度的变化,没有完整考虑地球的曲率。
我测试的情况是,点与线的距离范围在3KM之内,且线的长度在3KM内时,误差在cm级。

出140入115汤圆

发表于 2020-2-26 14:26:15 | 显示全部楼层
多谢楼主分享,想不到应用场景

出0入0汤圆

 楼主| 发表于 2020-2-26 14:29:25 | 显示全部楼层
本帖最后由 jjj 于 2020-2-26 14:50 编辑

原理如下:
点到线的距离等于  h*v / (a,y到x,b的距离)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2020-2-26 14:33:43 | 显示全部楼层
感觉在自动驾驶领域应该用的到吧

出1070入962汤圆

发表于 2020-2-26 14:46:16 | 显示全部楼层
非常棒的算法思路。类似的思路已经应用于共享汽车,共享单车,共享电动车滑板车的电子围栏管理,接近边界时先提示,跨越边界时再采取措施。

类似扩展的应用,老年人监护手环手机,分区配送业务等。

通过优化算法,可以避免使用三角函数和浮点运算,在小尺度的围栏计算中获得不错的精度,并且可以运行在资源以及性能有限的单片机上。

出0入0汤圆

 楼主| 发表于 2020-2-26 14:48:17 | 显示全部楼层
本帖最后由 jjj 于 2020-2-26 14:51 编辑
Appcat 发表于 2020-2-26 14:46
非常棒的算法思路。类似的思路已经应用于共享汽车,共享单车,共享电动车滑板车的电子围栏管理,接近边界时 ...


我们项目是用在train上,哈哈

出250入8汤圆

发表于 2020-2-26 14:53:39 | 显示全部楼层
本帖最后由 蛋定 于 2020-2-26 14:55 编辑

高人,多谢分享

再请教下,两点之间的距离,有什么简便算法?

出0入0汤圆

 楼主| 发表于 2020-2-26 15:01:25 | 显示全部楼层
蛋定 发表于 2020-2-26 14:53
高人,多谢分享

再请教下,两点之间的距离,有什么简便算法? ...


原理只要懂了,你这个需求更简单吧?
把上面的程序删掉一些就可以实现了

出0入0汤圆

发表于 2020-2-26 15:26:48 | 显示全部楼层
收藏先,谢谢分享,以后有这方面应用的时候再拿来用

出0入0汤圆

发表于 2020-2-26 16:25:20 | 显示全部楼层
收藏先,谢谢分享

出0入119汤圆

发表于 2020-2-26 16:38:15 | 显示全部楼层
多谢楼主分享

出10入23汤圆

发表于 2020-2-26 16:48:29 来自手机 | 显示全部楼层
代码不够优雅

出0入0汤圆

 楼主| 发表于 2020-2-26 16:57:23 | 显示全部楼层

图片应该还算优雅

出10入23汤圆

发表于 2020-2-26 17:08:29 来自手机 | 显示全部楼层
jjj 发表于 2020-2-26 16:57
图片应该还算优雅

晚上我给你分享一个更优雅的

出0入0汤圆

发表于 2020-2-26 17:41:44 | 显示全部楼层
谢谢楼主的分享

出0入0汤圆

发表于 2020-2-26 20:37:15 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2020-2-26 21:20:31 | 显示全部楼层
用向量做就好

出0入0汤圆

发表于 2020-2-26 21:29:05 来自手机 | 显示全部楼层
导航上用的吗?

出0入0汤圆

发表于 2020-2-26 22:02:31 | 显示全部楼层
https://www.zybang.com/question/ ... d61ce2f1d87178.html

出50入0汤圆

发表于 2020-2-26 22:09:08 来自手机 | 显示全部楼层
感谢分享

出0入14汤圆

发表于 2020-2-26 23:00:04 | 显示全部楼层
不错,CSDN上也有很多共享的

出0入0汤圆

发表于 2020-2-27 10:07:51 | 显示全部楼层
感谢楼主分享;其它能看懂,但这个cos_value=cos(x/100000000*PI/180);怎么来的呢?

出0入0汤圆

 楼主| 发表于 2020-2-27 10:25:23 | 显示全部楼层
本帖最后由 jjj 于 2020-2-27 10:33 编辑
sctwp 发表于 2020-2-27 10:07
感谢楼主分享;其它能看懂,但这个cos_value=cos(x/100000000*PI/180);怎么来的呢?


随着纬度的升高,纬度1圈的周长不断变短,  到南北极点,长度变成0.
这个变化必须考虑,不然误差会很大

经度1圈无论什么时间长度都一样

出0入8汤圆

发表于 2020-2-27 10:32:29 | 显示全部楼层
多谢分享!

出4550入62汤圆

发表于 2020-2-27 10:36:41 | 显示全部楼层
谢谢分享           

出0入0汤圆

发表于 2020-2-27 10:53:37 | 显示全部楼层
小尺度的围栏计算

出0入0汤圆

发表于 2020-2-27 14:52:46 | 显示全部楼层
电子围栏啊

出0入0汤圆

发表于 2020-2-27 16:22:49 | 显示全部楼层
jjj 发表于 2020-2-27 10:25
随着纬度的升高,纬度1圈的周长不断变短,  到南北极点,长度变成0.
这个变化必须考虑,不然误差会很大

感谢原来是坐标系没有搞对

出0入0汤圆

发表于 2020-2-28 07:42:00 | 显示全部楼层
多谢分享!

出50入10汤圆

发表于 2020-2-28 07:58:58 | 显示全部楼层
感谢分享!定位导航!

出0入0汤圆

发表于 2020-3-1 22:46:05 来自手机 | 显示全部楼层
导航常用到

出0入0汤圆

发表于 2020-12-25 19:16:06 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2020-12-25 20:26:17 来自手机 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2020-12-26 10:47:57 来自手机 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2021-1-27 17:02:58 | 显示全部楼层
感谢分享,正在学习方面东西,学习学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-2 23:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表