gravityField = (nodes, G) => {
G = G || 1;
const n = nodes.length;
let x_accel = (x1, y1, s, j) => {
let m2 = nodes[j].m;
let x2 = s[j];
let y2 = s[j + n];
return (m2 * (x2 - x1)) / ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** (3 / 2);
};
let y_accel = (x1, y1, s, j) => {
let m2 = nodes[j].m;
let x2 = s[j];
let y2 = s[j + n];
return (m2 * (y2 - y1)) / ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** (3 / 2);
};
let gr = (x, y, s) => {
return {
xpp: G*d3.sum(d3.range(nodes.length).map((i) => x_accel(x, y, s, i))),
ypp: G*d3.sum(d3.range(nodes.length).map((i) => y_accel(x, y, s, i))),
};
};
return gr
}