ray = (j) => {
const cross = (xa, ya, xb, yb) => xa * yb - xb * ya;
const n = hull.length;
const xc = X[hull.at(j - 2)],
yc = Y[hull.at(j - 2)],
xa = X[hull.at(j - 1)],
ya = Y[hull.at(j - 1)],
xb = X[hull[j]],
yb = Y[hull[j]],
xd = X[hull.at(j + 1 - n)],
yd = Y[hull.at(j + 1 - n)];
const dxab = xa - xb;
const dyab = ya - yb;
const dxca = xc - xa;
const dyca = yc - ya;
const dxbd = xb - xd;
const dybd = yb - yd;
const hab = Math.hypot(dxab, dyab);
const hca = Math.hypot(dxca, dyca);
const hbd = Math.hypot(dxbd, dybd);
return (x, y) => {
const dxa = x - xa;
const dya = y - ya;
const dxb = x - xb;
const dyb = y - yb;
return (
cross(dxa, dya, dxb, dyb) >= 0 &&
cross(dxa, dya, dxab, dyab) * hca >= cross(dxa, dya, dxca, dyca) * hab &&
cross(dxb, dyb, dxab, dyab) * hbd >= cross(dxb, dyb, dxbd, dybd) * hab
);
};
}