判断在多边形区域内
射线法判断
随便画个多边形,随便定一个点,然后通过这个点水平划一条射线,数这条横线穿越多边形的次数是否为奇数,如果是奇数,那么该点在多边形内,如果是偶数,则在多边形外。
道理很简单,但代码就不好实现了
原作者代码,我看半天才模模糊糊明白。
判断测试点向右的射线穿过多边形的边
1、被测试点是在两个相邻点的横坐标范围内
也就是
代码表示就是(verty[i] > testy) != (verty[j] > testy)
不能同时大于,那就是在测试点的上边了,也不能同时小于,那就是在测试点下边了,所以结果只能是一个true一个false;
如果这个条件不成立,也就是说出现在了红点的位置,后边就不用走了,换下一个顶点开始吧
2、射线穿过两个相邻的点
这句条件语句(testx < (((vertx[j] - vertx[i]) / (verty[j] - verty[i])) * (testy - verty[i]) + vertx[i]))
代表交点的x轴在测试点向右的射线上,也就是计算一次经过的边
想象一下地图是一个坐标系
因为vertx是纬度所以算作是y轴方向上,verty是经度算作x轴方向上,所以坐标系要旋转一下。
斜率(vertx[j] - vertx[i]) / (verty[j] - verty[i])
套上公式
这句条件就是代表射线与多边形边界交点的x轴(这里是正坐标系,不是旋转的)的位置(((vertx[j] - vertx[i]) / (verty[j] - verty[i])) * (testy - verty[i]) + vertx[i])
textx < 这个交点 又在多边形两点的纬度之内,就可以计算一次穿过多边形边的次数。
参考图
我用高德地图api和javascript做了一个demo,代码在这里
https://codepen.io/bb798sky/pen/rNMJoBR
https://github.com/withwz/in-Polygon/blob/main/index.html
参考
https://www.cnblogs.com/anningwang/p/7581545.html
https://wrf.ecse.rpi.edu//Research/Short_Notes/pnpoly.html