UNPKG

1.53 kBJavaScriptView Raw
1// 多边形的射线检测,参考:https://blog.csdn.net/WilliamSun0122/article/details/77994526
2var tolerance = 1e-6;
3// 三态函数,判断两个double在eps精度下的大小关系
4function dcmp(x) {
5 if (Math.abs(x) < tolerance) {
6 return 0;
7 }
8 return x < 0 ? -1 : 1;
9}
10// 判断点Q是否在p1和p2的线段上
11function onSegment(p1, p2, q) {
12 if ((q[0] - p1[0]) * (p2[1] - p1[1]) === (p2[0] - p1[0]) * (q[1] - p1[1]) &&
13 Math.min(p1[0], p2[0]) <= q[0] &&
14 q[0] <= Math.max(p1[0], p2[0]) &&
15 Math.min(p1[1], p2[1]) <= q[1] &&
16 q[1] <= Math.max(p1[1], p2[1])) {
17 return true;
18 }
19 return false;
20}
21// 判断点P在多边形内-射线法
22export function isPointInPolygon(points, x, y) {
23 var isHit = false;
24 var n = points.length;
25 if (n <= 2) {
26 // svg 中点小于 3 个时,不显示,也无法被拾取
27 return false;
28 }
29 for (var i = 0; i < n; i++) {
30 var p1 = points[i];
31 var p2 = points[(i + 1) % n];
32 if (onSegment(p1, p2, [x, y])) {
33 // 点在多边形一条边上
34 return true;
35 }
36 // 前一个判断min(p1[1],p2[1])<P.y<=max(p1[1],p2[1])
37 // 后一个判断被测点 在 射线与边交点 的左边
38 if (dcmp(p1[1] - y) > 0 !== dcmp(p2[1] - y) > 0 &&
39 dcmp(x - ((y - p1[1]) * (p1[0] - p2[0])) / (p1[1] - p2[1]) - p1[0]) < 0) {
40 isHit = !isHit;
41 }
42 }
43 return isHit;
44}
45//# sourceMappingURL=is-point-in-polygon.js.map
\No newline at end of file