index.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { orient2d } from 'robust-predicates';
  2. function pointInPolygon(p, polygon) {
  3. var i;
  4. var ii;
  5. var k = 0;
  6. var f;
  7. var u1;
  8. var v1;
  9. var u2;
  10. var v2;
  11. var currentP;
  12. var nextP;
  13. var x = p[0];
  14. var y = p[1];
  15. var numContours = polygon.length;
  16. for (i = 0; i < numContours; i++) {
  17. ii = 0;
  18. var contour = polygon[i];
  19. var contourLen = contour.length - 1;
  20. currentP = contour[0];
  21. if (currentP[0] !== contour[contourLen][0] &&
  22. currentP[1] !== contour[contourLen][1]) {
  23. throw new Error('First and last coordinates in a ring must be the same')
  24. }
  25. u1 = currentP[0] - x;
  26. v1 = currentP[1] - y;
  27. for (ii; ii < contourLen; ii++) {
  28. nextP = contour[ii + 1];
  29. u2 = nextP[0] - x;
  30. v2 = nextP[1] - y;
  31. if (v1 === 0 && v2 === 0) {
  32. if ((u2 <= 0 && u1 >= 0) || (u1 <= 0 && u2 >= 0)) { return 0 }
  33. } else if ((v2 >= 0 && v1 <= 0) || (v2 <= 0 && v1 >= 0)) {
  34. f = orient2d(u1, u2, v1, v2, 0, 0);
  35. if (f === 0) { return 0 }
  36. if ((f > 0 && v2 > 0 && v1 <= 0) || (f < 0 && v2 <= 0 && v1 > 0)) { k++; }
  37. }
  38. currentP = nextP;
  39. v1 = v2;
  40. u1 = u2;
  41. }
  42. }
  43. if (k % 2 === 0) { return false }
  44. return true
  45. }
  46. export { pointInPolygon as default };