【原创】【算法】三点定位简述

插叙:本想着每月都写呢,但是后来最近几个月工作和家庭太忙了,真是没时间写,且写且珍惜。

一、这是个什么玩意

望文生义一看名字肯定是用三个点来定位。先不说三点定位这个,由于我之前从来没在实际项目中搞过算法(面试刷题的不算,比如各种查找算法 https://www.cnblogs.com/leezx/p/5719012.html),简单说下对算法的肤浅理解,学习一个算法我个人觉得首先要弄清楚的就是这个算法解决了一个什么问题,它的应用场景是什么,然后再深入研究算法的实现过程,最后也是最不重要的就是根据项目需要编程实现,重思考轻编程,还有就是搞算法对数学要求比较高,因为算法最后基本都是转化成各种数学公式的推导换算。(转一篇博文总结的是C语言math.h中的常用函数https://blog.csdn.net/flyapy/article/details/38494935)当下随着现在大数据和人工智能的火热,算法工程师已成为香饽饽,并都是知名公司,薪水也直奔IT界第一,其实主要就是搞的人少造成的,就像2012、2013年时候做APP开发一样,而且现在公司面试的时候也会问一些算法实现或手写,其实这个主要考察你的基本内功怎么,虽然在工作中可能用不上,但是基本工的考察还是很有必要的

先复习个简单的数学问题,求三角形的面积:

1、(底 x 高)/ 2  ——>这种方法有个麻烦的地方就是还得必须算出高才能算面积,而算高的时候又会有额外的其他计算量。

2、———>这种感觉计算量能少点

好,然后接着来,判断一个点是否在三角形内部,这个方法就很多了,每个人的想法可能都不同,大部分人可能会想到的是面积法。(图片来源:http://www.cnblogs.com/TenosDoIt/p/4024413.html)

原理就是如果一个点在三角形内,那么该点与三角形的三个点构成的三个子三角形的面积就等于大三角形的面积。如果不在三角形内的话,则大于大三角形的面积。这样的话,这个问题就转化成了求三角形面积的问题。

再来一道,这次换成圆,判断一个点是否在圆内(给定圆心坐标和半径),这个直接算该点到圆心的距离然后和半径比较。小于半径则在圆内,大于在圆外,等于则在圆上。

现在说下三点定位。三点定位就是利用三个点的坐标位置信息来计算出当前的位置信息,即已知三点位置坐标(x0, y0), (x1, y1), (x2, y2)和所求位置点 (x, y)分别到三点的距离 d0,d1, d2。然后以 d0,d1, d2为半径作三个圆,依据毕达哥拉斯定理,得出未知点的位置计算公式,那定位的问题就转化成了求圆交点坐标的问题:

公式为:解方程式略,最后肯定能求出来位置点的坐标x和y的值(这篇文章是通过切线斜率切点这种方式解的https://blog.csdn.net/u013090676/article/details/73865137

二、有毛用啊

很显然是用来定位的啊,上述说的都是些理论,在实际中应用场景中肯定不能这样,在实际应用中比较常见的基于RSSI的三点定位实现。

三、怎么用啊

下面主要介绍下基于RSSI的三点定位实现。

比如一种场景是用beacon限定好一个固定区域,然后计算设备在这个区域内的位置坐标。如下图所示:

该矩形区域由4个信标组成,并且信标的位置坐标是已知的,然后在该区域内的设备基于BLE可以获取到信标的坐标信息和RSSI值,根据RSSI值可以推导出距离各个信标的距离值,这样就转化成上面介绍的求交点坐标的问题了。当然在理想情况下是交于一点的,如下图:

上述情况是理想情况,在现实测试中几乎不存在。大部分情况是根据RSSI值算出的距离值画出的圆之间没有交点或多个交点,如下图:

等等各种复杂相交的情况,这样的话就涉及到“准不准”和“哪个准”的问题了,具体就又涉及到机制和策略来使其“准”。其实不管哪种情况决定最终的定位结果的值就是圆的半径,而圆的半径该值是通过RSSI换算得到的。这里涉及到两个关乎准不准的问题,一个是RSSI值准不准,可以采取一定的策略,比如多测几次求均值等等。另一个是RSSI值转换到半径后的准确度,不过该部分转换大多都采用RSSI测距公式

接着在上面通过一系列策略或机制获取到相对“准”的三个半径值后(三点定位只需三个即可),然后各自画圆求出所有的交点(求两圆之间的交点的方法可以参考https://blog.csdn.net/zx3517288/article/details/53326420),如果两个圆没有交点的话,可以采用一定的策略来选出一个点。

接下来将得到的所有交点也是按照一定的算法(比如最小二乘法等https://www.cnblogs.com/wangkundentisy/p/7505487.html)选出N个点,然后再在这个N个点组成的区域(3个点的话就是三角形区域,4个点的话就是四边形区域)内也依据一定的算法计算出最终的定位点坐标。

代码暂不无偿公开,如有需要请留言联系方式

四、成为大神的用法

由于不是做算法方向,该部分欢迎各位大拿留言补充,在此跪谢。

转载请标明出处和链接

 

 

  • 17
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
空间多边定位算法三点定位是指通过三个固定坐标点的位置信息,确定一个移动点的坐标位置。这个算法的具体实现可以使用 C 语言来完成。 下面是一个简单的 C 语言实现示例: ```c #include <stdio.h> #include <math.h> // 定义坐标点结构体 typedef struct { double x; double y; double z; } Point; // 计算两点之间距离 double distance(Point a, Point b) { return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2) + pow(a.z - b.z, 2)); } // 三点定位函数 Point trilateration(Point p1, Point p2, Point p3, double d1, double d2, double d3) { Point res; double A = 2 * (p2.x - p1.x); double B = 2 * (p2.y - p1.y); double C = 2 * (p2.z - p1.z); double D = 2 * (p3.x - p2.x); double E = 2 * (p3.y - p2.y); double F = 2 * (p3.z - p2.z); double G = d1 * d1 - d2 * d2 - p1.x * p1.x + p2.x * p2.x - p1.y * p1.y + p2.y * p2.y - p1.z * p1.z + p2.z * p2.z; double H = d2 * d2 - d3 * d3 - p2.x * p2.x + p3.x * p3.x - p2.y * p2.y + p3.y * p3.y - p2.z * p2.z + p3.z * p3.z; res.x = (H * B - G * E) / (A * E - B * D); res.y = (H * A - G * D) / (B * D - A * E); res.z = (-1) * (p1.x * p1.x - 2 * p1.x * res.x + p1.y * p1.y - 2 * p1.y * res.y + p1.z * p1.z - d1 * d1); return res; } int main() { // 定义三个固定坐标点和对应的距离 Point p1 = {1, 1, 1}; Point p2 = {2, 2, 2}; Point p3 = {3, 3, 3}; double d1 = 1.414; double d2 = 1.732; double d3 = 3.317; // 计算移动点坐标 Point res = trilateration(p1, p2, p3, d1, d2, d3); // 输出结果 printf("移动点坐标为:(%lf, %lf, %lf)\n", res.x, res.y, res.z); return 0; } ``` 需要注意的是,以上示例代码仅为演示三点定位算法的原理,实际使用时需要根据具体情况进行修改和完善。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值