無向グラフを作成しましたが、座標を設定すると、正しく一致しないようです。
Integer v1 = nodeCount;
g.addVertex(v1);
layout.transform(v1);
double x = Math.random() * 600;
double y = Math.random() * 600;
System.out.println("x and y " + x + " " + y);
layout.setLocation(v1, x, y);
問題は、それが 300 の X 値と 350 の X 値を持つ別の X 値を生成し、350 が他のものの左にあると言うことができ、それらが正しく配置されていないことを明確に示していることです。
以下の例も作成しました。0 から開始し、X 方向と Y 方向の両方でさらに 50 の頂点を作成します。それらが等間隔ではないことがはっきりとわかります。(これは FRLayout2 を使用しています)。
この例では FRLayout (私が実際に使用していたレイアウト) を同じ方法で使用していますが、最初の 2 つは正しいように見えますが、3 番目からは完全に間違っています。
これは私のコードです。
public class AnimatingAddNodeDemo extends JApplet {
@Override
public void init() {
//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(730, 680);
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);
そして、頂点を追加する方法
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);
layout.transform(v1);
double x = Math.random() * 600;
double y = Math.random() * 600;
System.out.println("x and y " + x + " " + y);
layout.setLocation(v1, x, y);
if (layout.getX(v1) > furthestRight){
furthestRight = layout.getX(v1);
}
if (layout.getX(v1) < furthestLeft){
furthestLeft = layout.getX(v1);
}
System.out.println(layout.getX(v1) + " Lowest is " + furthestLeft + " and " + layout.getY(v1) + "highest is " + furthestRight);
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;
// 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);
}
}