function polygonIncircle(points) {
let circle = [NaN, NaN, 0];
for (var i = 0, n = points.length; i < n; ++i) {
const pi0 = points[i], pi1 = points[(i + 1) % n];
for (let j = i + 1; j < n; ++j) {
const pj0 = points[j], pj1 = points[(j + 1) % n];
const pij = j === i + 1 ? pj0 : lineLineIntersection(pi0, pi1, pj0, pj1);
search: for (let k = j + 1; k < n; ++k) {
const pk0 = points[k], pk1 = points[(k + 1) % n];
const pik = lineLineIntersection(pi0, pi1, pk0, pk1);
const pjk = k === j + 1 ? pk0 : lineLineIntersection(pj0, pj1, pk0, pk1);
const c = triangleIncircle(pij, pik, pjk);
for (let l = 0; l < n; ++l) {
const pl0 = points[l];
const pl1 = points[(l + 1) % n];
const r = pointLineDistance(c, pl0, pl1);
if (r < circle[2]) continue search;
if (r < c[2]) c[2] = r;
}
circle = c;
}
}
}
return circle;
}