package org.simantics.debug.graphical.layout; import gnu.trove.list.array.TIntArrayList; import gnu.trove.map.hash.TObjectIntHashMap; import java.util.ArrayList; import org.simantics.debug.graphical.model.Edge; import org.simantics.debug.graphical.model.Node; public class LayoutGraph { static final double G = 0.001; static final double K = 0.001; static final double Q = 10000.0; private static void computeForces(Node[] nodes, Edge[] edges) { for(Node node : nodes) { node.forceX = 0.0; node.forceY = 0.0; } for(Edge edge : edges) { Node a = edge.getA(); Node b = edge.getB(); double ax = a.getX(); double ay = a.getY(); double bx = b.getX(); double by = b.getY(); double fx = K * (bx - ax); double fy = K * (by - ay); a.forceX += fx; a.forceY += fy; b.forceX -= fx; b.forceY -= fy; } for(int i=0;i 0.1) { double l = Math.sqrt(l2); double l3 = l*l2; double fx = Q * dx / l3; double fy = Q * dy / l3; a.forceX -= fx; a.forceY -= fy; b.forceX += fx; b.forceY += fy; } } } } public static void layout(Node[] nodes, Edge[] edges) { /*for(int iter=0;iter<100;++iter) { computeForces(nodes, edges); for(Node node : nodes) { node.setPos(node.getX() + node.forceX*10.0, node.getY() + node.forceY*10.0); } } */ TObjectIntHashMap nodeIds = new TObjectIntHashMap(); for(int i=0;i tgt) { l.removeAt(length); --length; } } public static void layoutOld(Node[] nodes, Edge[] edges) { // Neighborhood array TObjectIntHashMap nodeIds = new TObjectIntHashMap(); for(int i=0;i[] neighbors = new ArrayList[nodes.length]; for(int i=0;i(); for(Edge edge : edges) { Node a = edge.getA(); Node b = edge.getB(); neighbors[nodeIds.get(a)].add(b); neighbors[nodeIds.get(b)].add(a); } // Iteration for(int iter=0;iter<1;++iter) { for(int i=0;i ns = neighbors[i]; idS -= K * ns.size(); for(Node n : ns) { forceX -= K * (x - n.getX()); forceY -= K * (y - n.getY()); } // Repulsion double xx=0.0, xy=0.0, yy=0.0; for(int j=0;j 0.01) { double l = Math.sqrt(l2); double l3 = l*l2; idS += Q / l3; double l5 = l3*l2; xx -= Q*dx*dx / l5; xy -= Q*dx*dy / l5; yy -= Q*dy*dy / l5; forceX += Q * dx / l3; forceY += Q * dy / l3; } } xx += idS; yy += idS; System.out.println("force"+i+" = (" + forceX + ", " + forceY + ")"); // Solve double det = xx * yy - xy * xy; System.out.println("mx"+i+" = (" + xx + "," + xy + "," + yy + ") " + det); if(Math.abs(det) > 1e-6) { double dx = (yy * forceX - xy * forceY) / det; double dy = (xx * forceY - xy * forceX) / det; node.setPos(x-dx*0.5, y-dy*0.5); } } } } }