function layoutCollide({ x: X, y: Y, r: R }) {
return (index) => {
const nodes = Array.from(index, (i) => ({
i,
x: X[i],
y: Y[i],
r: R ? R[i] : 4
}));
const simulation = d3
.forceSimulation()
.force(
"x",
d3.forceX(({ x }) => x)
)
.force(
"y",
d3.forceY(({ y }) => y)
)
.force(
"collide",
d3.forceCollide(({ r }) => 1 + r)
);
simulation.nodes(nodes).tick(30).stop();
for (const node of nodes) (X[node.i] = node.x), (Y[node.i] = node.y);
};
}