我创建了一个以1个顶点开头的java程序,并从那里每个循环添加一个顶点和2个边。它使用静态布局
Layout<Number, Number> staticLayout = new StaticLayout<Number, Number>(g, layout);
vv = new VisualizationViewer<Number, Number>(staticLayout, new Dimension(550, 550));
这听起来非常不合情理,但图表看起来并不是随机的,基本上我的意思是,每次它运行时,它们似乎总是聚集在一起在图表的边缘附近,而很少有人到达中心附近的任何地方。我的程序通常使用100个生成的顶点,我最终会在中心有六个,其他的都在边缘。
下面是我刚刚创建的随机示例。
也许如果有人可以确认这实际上是随机的,或者如果没有办法解决这个问题或者我设置了错误的话。因为我希望节点尽可能随机。
任何帮助将不胜感激。 感谢
以下是applet的相关代码。涉及其设置。
public class AnimatingAddNodeDemo extends JApplet {
//create a graph
Graph<Number, Number> ig = Graphs.synchronizedUndirectedGraph(new UndirectedSparseMultigraph<Number, Number>());
ObservableGraph<Number, Number> og = new ObservableGraph<Number, Number>(ig);
og.addGraphEventListener(new GraphEventListener<Number, Number>() {
public void handleGraphEvent(GraphEvent<Number, Number> evt) {
//System.err.println("got " + evt);
}
});
this.g = og;
//create a graphdraw
layout = new FRLayout<Number, Number>(g);
layout.setSize(new Dimension(600, 600));
setSize(700, 700);
Relaxer relaxer = new VisRunner((IterativeContext) layout);
relaxer.stop();
relaxer.prerelax();
Layout<Number, Number> staticLayout = new StaticLayout<Number, Number>(g, layout);
vv = new VisualizationViewer<Number, Number>(staticLayout, new Dimension(550, 550));
JRootPane rp = this.getRootPane();
rp.putClientProperty("defeatSystemEventQueueCheck", Boolean.TRUE);
getContentPane().setLayout(new BorderLayout());
}
Integer v_prev = null;
public void process() {
vv.getRenderContext().getPickedVertexState().clear();
vv.getRenderContext().getPickedEdgeState().clear();
try {
if (g.getVertexCount() < 100) {
//add a vertex
Integer v1 = nodeCount;
g.addVertex(v1);
nodeCount++;
System.out.println("adding vertex " + v1);
vv.getRenderContext().getPickedVertexState().pick(v1, true);
j.setText(myText);
// wire it to some edges
if (v_prev != null) {
Integer edge = edgeCount;
//vv.getRenderContext().getPickedEdgeState().pick(edge, true);
// let's connect to a random vertex, too!
int rand = (int) (Math.random() * (edgeCount-1)); // because there is a 0 node
while (v1.equals(rand)) {
System.out.println("avoided connecting to myself");
rand = (int) (Math.random() * (edgeCount-1)); // because there is a 0 node
}
edgeCount++;
g.addEdge(edge, rand, v1); //add an edge called var1, between the nodes var2 and var3
vv.getRenderContext().getPickedEdgeState().pick(edge, true);
System.out.println("Adding edge " + edge + " between " + rand + " & " + v1 + "()");
}
v_prev = v1;
layout.initialize();
Relaxer relaxer = new VisRunner((IterativeContext) layout);
relaxer.stop();
relaxer.prerelax();
vv.getRenderContext().getMultiLayerTransformer().setToIdentity();
vv.repaint();
} else {
done = true;
}
} catch (Exception e) {
System.out.println(e);
}
}
public static void main(String[] args) {
AnimatingAddNodeDemo and = new AnimatingAddNodeDemo();
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(and);
and.init();
and.start();
frame.pack();
//frame.setVisible(true);
}
}
答案 0 :(得分:1)
我没有得出关于它是否是随机的结论。因此,当我创建每个顶点时,我决定使用layout.setLocation(v1, x, y)
设置顶点的特定坐标
使用math.random()
制作x和y并将其乘以我的小程序的宽度和高度。
因此我现在知道它是随机的。
修改强>
这实际上似乎有效,但事实上并没有,我不得不删除FRLayout。 事实证明,由于算法的作用,FRLayout不会让你设置自己的位置。
FRLayout是一个强制定向的布局,用于重新定位顶点 根据图的拓扑结构。
所以我因此将FRLayout更改为StaticLayout,删除了一些仅适用于FRLayout的内容,现在它可以正常工作。
答案 1 :(得分:1)
您的图表不是随机的原因可能源于您将FRLayout
传递给构造函数。
layout = new FRLayout<Number, Number>(g);
// ...
Layout<Number, Number> staticLayout = new StaticLayout<Number, Number>(g, layout);
您可以通过扩展AbstractLayout
来制作自己的随机布局类。但是,根据JavaDoc,如果排除第二个构造函数参数,StaticLayout
将随机布局节点。
Layout<Number, Number> staticLayout = new StaticLayout(Number, Number>(g);