force method
void
force(
[ - double alpha = 1
])
override
Implementation
@override
void force([double alpha = 1]) {
Quadtree<GraphNode> tree;
double xi;
double yi;
double ri;
double ri2;
for (int k = 0; k < _iterations; ++k) {
tree = Quadtree.simple<GraphNode>(_xFun, _yFun, _nodes).visitAfter(_prepare);
for (var node in _nodes) {
ri = _radii[node.index];
ri2 = ri * ri;
xi = node.x + node.vx;
yi = node.y + node.vy;
/// tree.visit
tree.visit((quad, x0, y0, x1, y1) {
var data = quad.data;
double rj = quad.extGet('r') ?? 0;
double r = ri + rj;
if (isTrue(data)) {
if (data!.index > node.index) {
var x = xi - data.x - data.vx, y = yi - data.y - data.vy, l = x * x + y * y;
if (l < r * r) {
if (x == 0) {
x = jiggle(_random.lcg());
l += x * x;
}
if (y == 0) {
y = jiggle(_random.lcg());
l += y * y;
}
l = (r - (l = sqrt(l))) / l * _strength;
node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
node.vy += (y *= l) * r;
data.vx -= x * (r = 1 - r);
data.vy -= y * r;
}
}
return false;
}
return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
});
}
}
}