function* meanshift({ points, tree, sigma, kn, delta }) {
const pos = Array.from(points, p => Object.create(p));
delta = delta || 1e-3;
kn = kn || 100;
do {
pos.delta = 0;
for (let i = 0; i < pos.length; i++) {
const p = pos[i],
q = p.map(_ => 0);
let weight = 0;
const nn = tree.nearest(p, kn);
for (let j = 0; j < nn.length; j++) {
const ip = nn[j][0],
d = nn[j][1],
w = kernel(d) * (nn[j][0].weight || 1);
weight += w;
for (let k = 0; k < q.length; k++) q[k] += w * ip[k];
}
for (let k = 0; k < q.length; k++) q[k] /= weight;
pos.delta = Math.max(pos.delta, distance(pos[i], q));
pos[i] = q;
}
yield pos;
} while (pos.delta > delta);
}