collide = function(){
data.forEach(function(d){
var p1 = d.r + d.buffer;
d.polygon = d.children.map(function(t){
return [(d.x + ((d.r * t.length) + d.buffer) * t.sin) , (d.y + ((d.r * t.length) + d.buffer) * t.cos)];
});
});
var quadtree = d3.quadtree(data, d=>d.x, d=>d.y);
var collisions = 0;
data.forEach(function(d,i){
quadtree.visit(function(node, x0, y0, x1, y1){
var p = node.data;
if (!p) return;
if (p.id == d.id) return;
var dx = p.x - d.x,
dy = p.y - d.y,
dist2 = dx*dx + dy*dy;
if (dist2 > 4 * (d.r + p.r) * (d.r + p.r)) return;
var stress = 0;
d.children.forEach(function(t){
var txy = [(d.x + ((d.r * t.length) + d.buffer) * t.sin), (d.y + ((d.r * t.length) + d.buffer) * t.cos)];
var collisions = 0;
if (d3.polygonContains(p.polygon, txy)) {
d.overlap = 'Y'
collisions ++;
stress++;
t.length /= 1.05;
var f = 0.1 * (stress > 2 ? 1 : 0.5);
d.vx += f * ((d.x - p.x) > 1? 1 : -1);
d.vy += f * ((d.y - p.y) > 1? 1 : -1);
p.vx += f * ((p.x - d.x) > 1? 1 : -1);
p.vy += f * ((p.y - d.y) > 1? 1 : -1);
} else {
d.overlap = 'N'
}
})
})
})
}