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) + xa
a.xj = x0
,P
与J
重合,即 点在线上,返回1
,结束;
b.xj < x0
,J
在P
左侧,则left++
;
c.xj < x0
,J
在P
右侧,则right++
;
d. 如果left
和right
都为奇数,则 点在多边形内,返回true
e. 其它 返回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 许可协议。转载请注明来自 关尔先生·南山桥!
评论