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