node-red-contrib-tak-registration
Version:
A Node-RED node to register to TAK and to help wrap files as datapackages to send to TAK
57 lines (46 loc) • 1.44 kB
JavaScript
import { orient2d } from 'robust-predicates';
function pointInPolygon(p, polygon) {
var i;
var ii;
var k = 0;
var f;
var u1;
var v1;
var u2;
var v2;
var currentP;
var nextP;
var x = p[0];
var y = p[1];
var numContours = polygon.length;
for (i = 0; i < numContours; i++) {
ii = 0;
var contour = polygon[i];
var contourLen = contour.length - 1;
currentP = contour[0];
if (currentP[0] !== contour[contourLen][0] &&
currentP[1] !== contour[contourLen][1]) {
throw new Error('First and last coordinates in a ring must be the same')
}
u1 = currentP[0] - x;
v1 = currentP[1] - y;
for (ii; ii < contourLen; ii++) {
nextP = contour[ii + 1];
u2 = nextP[0] - x;
v2 = nextP[1] - y;
if (v1 === 0 && v2 === 0) {
if ((u2 <= 0 && u1 >= 0) || (u1 <= 0 && u2 >= 0)) { return 0 }
} else if ((v2 >= 0 && v1 <= 0) || (v2 <= 0 && v1 >= 0)) {
f = orient2d(u1, u2, v1, v2, 0, 0);
if (f === 0) { return 0 }
if ((f > 0 && v2 > 0 && v1 <= 0) || (f < 0 && v2 <= 0 && v1 > 0)) { k++; }
}
currentP = nextP;
v1 = v2;
u1 = u2;
}
}
if (k % 2 === 0) { return false }
return true
}
export { pointInPolygon as default };