force method

  1. @override
void force([
  1. 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;
      });
    }
  }
}