static void forceBasedLayout(CirclesAndLines cal, final Canvas canvas) { awtEvery(canvas, r { L circles = cal.circles; int n = l(circles); new BitSet bs; for (Line l : cal.lines) bs.set(circles.indexOf(l.a)*n+circles.indexOf(l.b)); for (int i = 0; i < n; i++) { Circle a = circles.get(i); for (int j = 0; j < n; j++) if (i != j) { Circle b = circles.get(j); bool connected = bs.get(i*n+j); if (connected) forceBasedLayout_attract(a, b); else forceBasedLayout_repel(a, b); } showCAL2(cal, cal, canvas); } } private Vector CalcRepulsionForce(Node x, Node y) { 2 int proximity = Math.Max(CalcDistance(x.Location, y.Location), 1); 3 4 double force = -(REPULSION_CONSTANT / Math.Pow(proximity, 2)); 5 double angle = GetBearingAngle(x.Location, y.Location); 6 7 return new Vector(force, angle); 8 } svoid forceBasedLayout_attract(Circle a, Circle b) { double distance = sqr(b.x-a.x)+sqr(b.y-a.y); double desiredDistance = 0.1; double distanceDelta = desiredDistance double dx = (b.x-a.x)*strength, dy = (b.y-a.y)*strength; a.x += dx* }