{
const n = points.length + 1;
const distances = new Float64Array(n * n);
for (let i = 0; i < n - 1; i++) {
for (let j = i + 1; j < n - 1; j++) {
const [x0, y0] = points[i];
const [x1, y1] = points[j];
const d = Math.hypot(x1 - x0, y1 - y0);
distances[i * n + j] = d;
distances[j * n + i] = d;
}
}
const path = new Uint16Array(n);
for (let i = 0; i < n; i++) path[i] = i;
for (let k = 0; k < 10; k++) {
let foundImprovement = false;
for (let i = 0; i < n; i++) {
for (let j = i + 2; j < n; j++) {
const k0 = path[i];
const k1 = path[(i + 1) % n];
const k2 = path[j];
const k3 = path[(j + 1) % n];
const p01 = distances[n * k0 + k1];
const p23 = distances[n * k2 + k3];
const p02 = distances[n * k0 + k2];
const p13 = distances[n * k1 + k3];
if (p01 + p23 - p02 - p13 > 1e-20) {
path.subarray(i + 1, j + 1).reverse();
foundImprovement = true;
await Promises.delay(8); yield draw(path);
}
}
}
if (!foundImprovement) break;
}
const sentinel = path.indexOf(points.length);
const result = [];
for (let i = sentinel + 1; i < n; i++) result.push(points[path[i]]);
for (let i = 0; i < sentinel; i++) result.push(points[path[i]]);
}