75 lines
2.2 KiB
Markdown
75 lines
2.2 KiB
Markdown
A small library for detecting in a point lies inside a polygon
|
|
|
|
**Features**
|
|
- Works on polygons with holes
|
|
- Works with degenerate/self-intersecting polyons
|
|
- Returns `0` if on the edge
|
|
- Not effected by floating point errors
|
|
|
|
|
|
### Usage
|
|
Install via `npm install point-in-polygon-hao`
|
|
|
|
````
|
|
import inside from 'point-in-polygon-hao'
|
|
|
|
const polygon = [
|
|
[
|
|
[1, 1],
|
|
[1, 2],
|
|
[2, 2],
|
|
[2, 1],
|
|
[1, 1]
|
|
]
|
|
];
|
|
|
|
inside([ 1.5, 1.5 ], polygon)
|
|
// => true
|
|
|
|
inside([ 4.9, 1.2 ], polygon)
|
|
// => false
|
|
|
|
inside([1, 2], polygon)
|
|
// => 0 to indicate on edge
|
|
````
|
|
|
|
**Note:** The input polygon format aligns with the GeoJson specification for polygons. This means that the first and last coordinate in a polygon must be repeated, if not this library will throw an error.
|
|
````
|
|
const polygonWithHole = [
|
|
[
|
|
[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]
|
|
],
|
|
[
|
|
[0.1, 0.1], [0.1, 0.9], [0.9, 0.9], [0.9, 0.1], [0.1, 0.1]
|
|
]
|
|
]
|
|
````
|
|
The library does not support multi-polygons.
|
|
|
|
### Comparisons
|
|
Some rough comparisons to similar libraries.
|
|
While `point-in-polygon` is slightly faster in most cases it does not support polygons with holes or degenerate polygons.
|
|
|
|
````
|
|
// For a point in a much larger geometry (700+ vertices)
|
|
point-in-poly-hao x 381,184 ops/sec ±0.80% (87 runs sampled)
|
|
point-in-polygon x 285,734 ops/sec ±1.33% (91 runs sampled)
|
|
robust-point-in-polygon x 267,738 ops/sec ±0.78% (93 runs sampled)
|
|
````
|
|
|
|
````
|
|
// For a point in bounding box check
|
|
point-in-poly-hao x 25,822,227 ops/sec ±2.87% (86 runs sampled)
|
|
point-in-polygon x 30,321,920 ops/sec ±2.14% (91 runs sampled)
|
|
robust-point-in-polygon x 26,708,560 ops/sec ±1.13% (91 runs sampled)
|
|
````
|
|
|
|
### Algorithm
|
|
This library is based on the paper [Optimal Reliable Point-in-Polygon Test and
|
|
Differential Coding Boolean Operations on Polygons](https://www.researchgate.net/publication/328261365_Optimal_Reliable_Point-in-Polygon_Test_and_Differential_Coding_Boolean_Operations_on_Polygons)
|
|
|
|
### Other notes
|
|
* Works irrespective of winding order of polygon
|
|
* ~~Does not appear to be effected by floating point errors compared to `point-in-polygon` or `robust-point-in-polygon`~~
|
|
* Added robust-predicates to deal with some floating point errors
|