function getWeights(points, [x, y]) {
const n = points.length;
const s = points.map(([xi, yi]) => [xi - x, yi - y]);
const A2 = new Float32Array(n);
const D = new Float32Array(n);
for (let i = 0; i < n; i++) {
const i1 = (i + 1) % n;
const p = s[i];
const q = s[i1];
A2[i] = p[0] * q[1] - p[1] * q[0];
D[i] = p[0] * q[0] + p[1] * q[1];
}
const weights = new Float32Array(n);
for (let i = 0; i < n; i++) {
const i_ = (i - 1 + n) % n;
const i1 = (i + 1) % n;
const p = s[i];
const q = s[i1];
const q_ = s[i_];
const r = Math.hypot(...p);
if (r < 1e-6) {
weights[i] = INF;
continue;
}
const r1 = Math.hypot(...q);
const coll = Math.abs(A2[i]) === 0;
if (coll && D[i] < 0) {
weights[i] = INF * (r1 / (r + r1));
continue;
}
const r_1 = Math.hypot(...s[i_]);
const coll_ = Math.abs(A2[i_]) === 0;
if (coll_ && D[i_] < 0) {
weights[i] = INF * (r_1 / (r + r_1));
continue;
}
weights[i] =
(coll ? 0 : (r1 - D[i] / r) / A2[i]) +
(coll_ ? 0 : (r_1 - D[i_] / r) / A2[i_]);
}
const S = d3.sum(weights);
for (let i = 0; i < n; i++) weights[i] /= S;
return weights;
}