| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- import { orient2d } from 'robust-predicates';
- function pointInPolygon(p, polygon) {
- var i;
- var ii;
- var k = 0;
- var f;
- var u1;
- var v1;
- var u2;
- var v2;
- var currentP;
- var nextP;
- var x = p[0];
- var y = p[1];
- var numContours = polygon.length;
- for (i = 0; i < numContours; i++) {
- ii = 0;
- var contour = polygon[i];
- var contourLen = contour.length - 1;
- currentP = contour[0];
- if (currentP[0] !== contour[contourLen][0] &&
- currentP[1] !== contour[contourLen][1]) {
- throw new Error('First and last coordinates in a ring must be the same')
- }
- u1 = currentP[0] - x;
- v1 = currentP[1] - y;
- for (ii; ii < contourLen; ii++) {
- nextP = contour[ii + 1];
- u2 = nextP[0] - x;
- v2 = nextP[1] - y;
- if (v1 === 0 && v2 === 0) {
- if ((u2 <= 0 && u1 >= 0) || (u1 <= 0 && u2 >= 0)) { return 0 }
- } else if ((v2 >= 0 && v1 <= 0) || (v2 <= 0 && v1 >= 0)) {
- f = orient2d(u1, u2, v1, v2, 0, 0);
- if (f === 0) { return 0 }
- if ((f > 0 && v2 > 0 && v1 <= 0) || (f < 0 && v2 <= 0 && v1 > 0)) { k++; }
- }
- currentP = nextP;
- v1 = v2;
- u1 = u2;
- }
- }
- if (k % 2 === 0) { return false }
- return true
- }
- export { pointInPolygon as default };
|