X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.debug.graphical%2Fsrc%2Forg%2Fsimantics%2Fdebug%2Fgraphical%2Flayout%2FLayoutGraph.java;h=f3f1c2188563cbcd37b468b1a2e062530e18a97a;hb=680a2159d36d893cf7fbf0212e7ffbff847a8f82;hp=a989f2e29d550ca31cd1286d0877cd6566209fda;hpb=969bd23cab98a79ca9101af33334000879fb60c5;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.debug.graphical/src/org/simantics/debug/graphical/layout/LayoutGraph.java b/bundles/org.simantics.debug.graphical/src/org/simantics/debug/graphical/layout/LayoutGraph.java index a989f2e29..f3f1c2188 100644 --- a/bundles/org.simantics.debug.graphical/src/org/simantics/debug/graphical/layout/LayoutGraph.java +++ b/bundles/org.simantics.debug.graphical/src/org/simantics/debug/graphical/layout/LayoutGraph.java @@ -1,206 +1,206 @@ -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); - } - } - } - } - -} +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); + } + } + } + } + +}