geoenclave
Version:
Validate if a point is inside a given polygon using GeoEnclave.
52 lines (42 loc) • 1.32 kB
text/typescript
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 };