Search in sources :

Example 1 with BarnesHut

use of org.gephi.layout.plugin.force.quadtree.BarnesHut in project gephi by gephi.

the class YifanHuLayout method goAlgo.

@Override
public void goAlgo() {
    graph = graphModel.getGraphVisible();
    graph.readLock();
    try {
        Node[] nodes = graph.getNodes().toArray();
        for (Node n : nodes) {
            if (n.getLayoutData() == null || !(n.getLayoutData() instanceof ForceVector)) {
                n.setLayoutData(new ForceVector());
            }
        }
        // Evaluates n^2 inter node forces using BarnesHut.
        QuadTree tree = QuadTree.buildTree(graph, getQuadTreeMaxLevel());
        //        double electricEnergy = 0; ///////////////////////
        //        double springEnergy = 0; ///////////////////////
        BarnesHut barnes = new BarnesHut(getNodeForce());
        barnes.setTheta(getBarnesHutTheta());
        for (Node node : nodes) {
            ForceVector layoutData = node.getLayoutData();
            ForceVector f = barnes.calculateForce(node, tree);
            layoutData.add(f);
        //            electricEnergy += f.getEnergy();
        }
        // Apply edge forces.
        for (Edge e : graph.getEdges()) {
            if (!e.getSource().equals(e.getTarget())) {
                Node n1 = e.getSource();
                Node n2 = e.getTarget();
                ForceVector f1 = n1.getLayoutData();
                ForceVector f2 = n2.getLayoutData();
                ForceVector f = getEdgeForce().calculateForce(n1, n2);
                f1.add(f);
                f2.subtract(f);
            }
        }
        // Calculate energy and max force.
        energy0 = energy;
        energy = 0;
        double maxForce = 1;
        for (Node n : nodes) {
            ForceVector force = n.getLayoutData();
            energy += force.getNorm();
            maxForce = Math.max(maxForce, force.getNorm());
        }
        // Apply displacements on nodes.
        for (Node n : nodes) {
            if (!n.isFixed()) {
                ForceVector force = n.getLayoutData();
                force.multiply((float) (1.0 / maxForce));
                getDisplacement().moveNode(n, force);
            }
        }
        postAlgo();
    } finally {
        graph.readUnlockAll();
    }
}
Also used : QuadTree(org.gephi.layout.plugin.force.quadtree.QuadTree) Node(org.gephi.graph.api.Node) BarnesHut(org.gephi.layout.plugin.force.quadtree.BarnesHut) ForceVector(org.gephi.layout.plugin.force.ForceVector) Edge(org.gephi.graph.api.Edge)

Aggregations

Edge (org.gephi.graph.api.Edge)1 Node (org.gephi.graph.api.Node)1 ForceVector (org.gephi.layout.plugin.force.ForceVector)1 BarnesHut (org.gephi.layout.plugin.force.quadtree.BarnesHut)1 QuadTree (org.gephi.layout.plugin.force.quadtree.QuadTree)1