写在前面
嗨!很高兴看到你点进来阅读这篇文章,请别介意,标题有点长有点啰嗦(完全是为了seo考虑),但也算是概括了这篇文章的内容。如果你是要开发如下图所示的场景,但又苦于没什么好的思路,那么这篇文章一定会帮助到你!
往复式运动航线
基于不规则凸多边形地块的往复式航线规划
哦,对了,本文的实现是基于web平台的地图,使用javascript。如果你也是在web平台上开发,而且任务时间非常紧急,没有时间阅读完全文的话。。。我已经将本文的思路封装成一个库了,你可以猛戳下面的链接,开箱即用:
github.com/Char-Ten/cp…
兼容各大地图平台api(其实不同平台api差异的影响很低)哦,不信的话戳demo:
百度地图demo
高德地图demo
leaflet地图demo
觉得好用的话记得给个star~原创不易,谢谢支持
正文!
其实也是套公式
其实这种问题,实际上是数学几何应用题,既然是数学题啦,那按照考试的套路第一步肯定是套公式啊,这种场景,核心的公式不多,就两条:
一次函数两点表达式
绕(tx,ty)点旋转n度之后缩放SxSy倍的变换矩阵
第一条没什么可以说的,初二数学就开始教一次函数的知识,这一条是用来计算航线与地块边界的交点的。 第二条就是很经典的复合变换矩阵了,分别是位移矩阵叉乘旋转矩阵叉乘位移缩放矩阵,我们设其叉乘结果为A,那么我们就可以列出下面的等式:
计算过程就是。。。横乘竖横乘竖横乘竖横乘竖横乘竖横乘竖横乘竖横乘竖。。。。最后化为用于程序的代数式就是:
通过这条公式,就可以计算出航线旋转后的坐标点。
然后我们把它们分别封装一下,弄成一个函数调用先:
看到这里,恭喜你,你已经完成了50%的工作量!如果是在考试,你把这两条公式列出来,不写答案也有一半的分数(
先从最简单的场景开始
一个矩形地块,航线水平于x轴:
这是一个大概是200*200大小的矩形,左上角的顶点经纬度为
nw
(西北),右上角的顶点经纬度为ne
(东北),右下角的顶点经纬度为se
(东南),左下角的顶点经纬度为sw
(西南),其中设置无人机飞行的间隔为10。你先不考虑折线的连接顺序,就单单考虑一下,每一根横线如何生成。观察一下你会发现以下规律:
- 两条横线的间隔是20
- 每一条横线都可以表示为
y=N
,N
为常数,表示某个纬度值 - 每一条横线段都是
y=N
与矩形相交产生,也就是每一条横线段都是该矩形地块与维度相交的结果
那么,现在矩形的四个顶点的经纬度是已知的,无人机飞行的间隔也是已知的,这个矩形需要与多少条纬度线相交是未知的,每一条横线的N
是未知的,每一条横线段左右两个点的纬度是未知的。根据已知求未知,你的目标已经很明确了,一道很简单的几何题:
- 该矩形需要与多少条纬度线相交:
- 求每一条横线的
N
:
- 因为矩形的两条边是垂直的,所以,横线段左右两个点的经度分别为
nw.lng
,ne.lng
。这样我们就可以绘制出来了:
场景开始变形!
锵锵,我们把矩形上面的边往东挪50米,得到一个平行四边形:
聪明的你一定发现了,平行四边形在Y轴上的投影根本没有发生变化嘛,即使变了之后,穿过地块的纬度线数目还是不变嘛,只不过,这次因为两条边不是垂直的,所以,我们需要计算斜边与纬度线的交点。等等,你这时候想起了,最开始50%工作量里面所封装的那个calcPointInLineWithY
函数!
你已经知道斜边两个点的坐标,然后你又知道y=N
,那你通过一次函数的两点表达式,完全就可以知道x
,也就是经度是多少啦:
那你可以再变一变,让y轴上的投影也发生变化,就像这样:
好了,这下你观察到,每条边都跟纬度线相交了,也就是说,这次你要遍历一下这个平行四边形四个顶点。等等,你似乎忘记了一个问题,这个四边形在y轴上的投影发生了变化,相交纬度线数目也跟着发生变化了。这时候你想到,要不给这个多边形做个外接矩形?就像这样:
这样是不是又回归了最开始的场景?只是把calcPointInLineWithY
函数加上去之后,你可以得到任意凸多边形与纬度线相交的模型。