UNPKG

geoenclave

Version:

Validate if a point is inside a given polygon using GeoEnclave.

52 lines (42 loc) 1.32 kB
import { Point } from "./types"; const isLeft = (p1: Point, p2: Point, point: Point): number => { return (p2[1] - p1[1]) * (point[0] - p1[0]) - (point[1] - p1[1]) * (p2[0] - p1[0]); } const windingNumber = (lat: number, lng: number, polygon: Point[]): number => { const polygonLength = polygon.length; let wn = 0; for (let i = 0; i < polygonLength; i++) { const p1 = polygon[i]; const p2 = polygon[(i + 1) % polygonLength]; if (p1[0] <= lat) { if (p2[0] > lat && isLeft(p1, p2, [lat, lng]) > 0) { wn++; } } else { if (p2[0] <= lat && isLeft(p1, p2, [lat, lng]) < 0) { wn--; } } } return wn; } const isWindingNumber = (point, polygon): boolean => { const wn = windingNumber(point[0], point[1], polygon); let isWindingNumber = false; if (Math.abs(wn) > 0) { isWindingNumber = true; } else { isWindingNumber = false; } return isWindingNumber; } const countWindingNumbers = (points: Point[], polygon: Point[]): number => { let count = 0; for (const point of points) { if (isWindingNumber(point, polygon)) { count++; } } return count; } export { isWindingNumber, countWindingNumbers };