项目需求
在在线地图中判断一个图形是否在另一个图形内,好像很复杂的样子,其实的确有点复杂,我们可以这样想。这个问题其实可以拆分成两步,第一步实现判断点是否在多边形内,第二步判断第一个多边形所有的点是否在第二个多边形内。
实现方案
先直接上代码,这个方法就是关键的操作(用于js中),用来判断点是否在多边形内,先解释一下里面的变量及其含义
变量名 | 内容 |
---|---|
length | 多边形点的数量 |
lianx | 多边形内经度坐标数组 |
lianx | 多边形内纬度坐标数组 |
lianx | 点经度坐标 |
lianx | 点纬度坐标 |
judge(length, lianx, liany, testx, testy) {
var i, j, c = false;
length = parseInt(length);
testx = parseFloat(testx);
testy = parseFloat(testy);
for (i = 0, j = length - 1; i < length; j = i++) {
liany[i] = parseFloat(liany[i]);
liany[j] = parseFloat(liany[j]);
lianx[i] = parseFloat(lianx[i]);
lianx[j] = parseFloat(lianx[j]);
if (
(liany[i] > testy) != (liany[j] > testy) &&
(testx < (lianx[j] - lianx[i]) * (testy - liany[i]) /(liany[j] - liany[i]) + lianx[i])
)
c = !c;
}
return c;
},
如果想知道原理的小伙伴可以接着往下看
这个方法其实每次都是在计算多边形中相邻的两个点和测试点之间是否满足以下两个关系
1.测试点纬度是否在两点纬度之间 (liany[i] > testy) != (liany[j] > testy)
2.如果在两点之间了,接下就得判断待测点test是否在i,j两点之间的连线之下** (testx < (lianx[j] - lianx[i]) * (testy - liany[i]) /(liany[j] - liany[i]) + lianx[i])**
然后每次这两个条件同时满足的时候我们把返回的布尔量取反。
可这到底是啥意思啊?
这个表达式的意思是说,随便画个多边形,随便定一个点,然后通过这个点水平划一条射线,先数数看这条
射线和多边形的边相交几次,(或者说先排除那些不相交的边,第一个判断条件),然后再数这条射线穿越多边形的次数是否为奇数,如果是奇数,那么该点在多边形内,如果是偶数,则在多边形外。该部分转载百度百科。
将这步完成后,就实现了判断点是否在多边形,而想要实现多边形在多边形内,就按上述所说即可。
如果存在问题请大家批评指正!!!