346de09f352b3ec12e7336327d47cd6b1ff1cc9a0e5cf716904ead8c667c8967a7bfdedac3f4ca0558f99ac2b43ed0bc36ee68ffdaff5df6ff6b31b6b3d460 722 B

12345678910111213141516171819202122232425262728293031
  1. import windingLine from './windingLine';
  2. import { VectorArray } from '../core/vector';
  3. const EPSILON = 1e-8;
  4. function isAroundEqual(a: number, b: number): boolean {
  5. return Math.abs(a - b) < EPSILON;
  6. }
  7. export function contain(points: VectorArray[], x: number, y: number) {
  8. let w = 0;
  9. let p = points[0];
  10. if (!p) {
  11. return false;
  12. }
  13. for (let i = 1; i < points.length; i++) {
  14. const p2 = points[i];
  15. w += windingLine(p[0], p[1], p2[0], p2[1], x, y);
  16. p = p2;
  17. }
  18. // Close polygon
  19. const p0 = points[0];
  20. if (!isAroundEqual(p[0], p0[0]) || !isAroundEqual(p[1], p0[1])) {
  21. w += windingLine(p[0], p[1], p0[0], p0[1], x, y);
  22. }
  23. return w !== 0;
  24. }