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();
}
}
Aggregations