js判断点是否在多边形内部
js 运用用射线法判断点是否在多边形内部,该法中常用水平扫描线法或垂直线法来判断一点是否在区域内。假若有一疑问点,要判斯它是否在多边形内,可从该疑问点向左引水平扫描线(即射线)。

判断点是否在多边形内部
射线法
射线法。该法中常用水平扫描线法或垂直线法来判断一点是否在区域内。假若有一疑问点 P(x0,y0),要判斯它是否在多边形内,可从该疑问点向左引水平扫描线(即射线)。
引申 射线法

- 前提:
多边形是用顺序的点坐标表示。 - 多边形各个边 是 线段(端点属于此边),两端点坐标已知
A(xa,ya)和B(xb,yb),可以求得线段的表达式。 - 以疑问点
P(x0,y0),作一条水平线y=y0, 如果ya ≤ y0 ≤ yb,则水平线与线段AB相交,否则不相交。 - 若相交,求交点坐标
J(xj,yj), 已知yj = y0,则xj = ((y0 - ya) / (yb - ya)) * (xb - xa) + xaa.xj = x0,P与J重合,即 点在线上,返回1,结束;
b.xj < x0,J在P左侧,则left++;
c.xj < x0,J在P右侧,则right++;
d. 如果left和right都为奇数,则 点在多边形内,返回truee. 其它 返回false
代码下载
代码使用
引入后 执行 BJ_MAP_UTIL.isPointInRing(POINT, PATH)
POINT 为 检测点 [x,y]
PATH是多边形点集合 [[x1,y1],[x2,y2]...]
代码精度
与高德地图 API AMap.GeometryUtil.isPointInRing 相比:
- 多边形内外,判断一致
- 多边形顶点,高德全部返回
false;此算法归到点在线上,都返回1 - 多边形边上,高德部分返回
false,部分返回true;此算法归到点在线上,都返回1
代码速度
与高德地图 API AMap.GeometryUtil.isPointInRing 相比
耗时减少了近80%
(63667 个测试点,高德耗时21.086s,此算法耗时4.676s)
‘单引号’,”双引号”,中文双引号:“”,中文单引号‘’英文逗号,
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 关尔先生·南山桥!
评论




