public void calcAttraction(EdgeItem e) { NodeItem n1 = e.getSourceItem(); Params n1p = getParams(n1); NodeItem n2 = e.getTargetItem(); Params n2p = getParams(n2); double xDelta = n1p.loc[0] - n2p.loc[0]; double yDelta = n1p.loc[1] - n2p.loc[1]; double deltaLength = Math.max(EPSILON, Math.sqrt(xDelta*xDelta + yDelta*yDelta)); double force = (deltaLength*deltaLength) / forceConstant; if (Double.isNaN(force)) { System.err.println("Mathematical error..."); } double xDisp = (xDelta/deltaLength) * force; double yDisp = (yDelta/deltaLength) * force; n1p.disp[0] -= xDisp; n1p.disp[1] -= yDisp; n2p.disp[0] += xDisp; n2p.disp[1] += yDisp; }
public void calcRepulsion(Graph g, NodeItem n1) { Params np = getParams(n1); np.disp[0] = 0.0; np.disp[1] = 0.0; for (Iterator iter2 = g.nodes(); iter2.hasNext();) { NodeItem n2 = (NodeItem) iter2.next(); Params n2p = getParams(n2); if (n2.isFixed()) continue; if (n1 != n2) { double xDelta = np.loc[0] - n2p.loc[0]; double yDelta = np.loc[1] - n2p.loc[1]; double deltaLength = Math.max(EPSILON, Math.sqrt(xDelta*xDelta + yDelta*yDelta)); double force = (forceConstant*forceConstant) / deltaLength; if (Double.isNaN(force)) { System.err.println("Mathematical error..."); } np.disp[0] += (xDelta/deltaLength)*force; np.disp[1] += (yDelta/deltaLength)*force; } } }
public void calcPositions(NodeItem n, Rectangle2D b) { Params np = getParams(n); double deltaLength = Math.max(EPSILON, Math.sqrt(np.disp[0]*np.disp[0] + np.disp[1]*np.disp[1])); double xDisp = np.disp[0]/deltaLength * Math.min(deltaLength, temp); if (Double.isNaN(xDisp)) { System.err.println("Mathematical error... (calcPositions:xDisp)"); } double yDisp = np.disp[1]/deltaLength * Math.min(deltaLength, temp); np.loc[0] += xDisp; np.loc[1] += yDisp; // don't let nodes leave the display double borderWidth = b.getWidth() / 50.0; double x = np.loc[0]; if (x < b.getMinX() + borderWidth) { x = b.getMinX() + borderWidth + Math.random() * borderWidth * 2.0; } else if (x > (b.getMaxX() - borderWidth)) { x = b.getMaxX() - borderWidth - Math.random() * borderWidth * 2.0; } double y = np.loc[1]; if (y < b.getMinY() + borderWidth) { y = b.getMinY() + borderWidth + Math.random() * borderWidth * 2.0; } else if (y > (b.getMaxY() - borderWidth)) { y = b.getMaxY() - borderWidth - Math.random() * borderWidth * 2.0; } np.loc[0] = x; np.loc[1] = y; }
private void finish(Graph g) { Iterator nodeIter = g.nodes(); while ( nodeIter.hasNext() ) { NodeItem n = (NodeItem)nodeIter.next(); Params np = getParams(n); setX(n, null, np.loc[0]); setY(n, null, np.loc[1]); } }
private void init(Graph g, Rectangle2D b) { initSchema(g.getNodes()); temp = b.getWidth() / 10; forceConstant = 0.75 * Math.sqrt(b.getHeight()*b.getWidth()/g.getNodeCount()); // initialize node positions Iterator nodeIter = g.nodes(); Random rand = new Random(42); // get a deterministic layout result double scaleW = ALPHA*b.getWidth()/2; double scaleH = ALPHA*b.getHeight()/2; while ( nodeIter.hasNext() ) { NodeItem n = (NodeItem)nodeIter.next(); Params np = getParams(n); np.loc[0] = b.getCenterX() + rand.nextDouble()*scaleW; np.loc[1] = b.getCenterY() + rand.nextDouble()*scaleH; } }