Java 未正确设置坐标Jung Graph

Java 未正确设置坐标Jung Graph,java,graph,jung,Java,Graph,Jung,我已经创建了一个无向图,但是当我设置坐标时,它们似乎从未正确匹配 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); 问题是,它可以生成X值

我已经创建了一个无向图,但是当我设置坐标时,它们似乎从未正确匹配

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);
问题是,它可以生成X值为300,X值为350的另一个,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类AnimatingAddNodeDemo扩展了JApplet{
@凌驾
公共void init(){
//创建图形
Graph ig=Graphs.SynchronizedIndirectedGraph(新的无向SparMultigraph());
ObservableGraph og=新的ObservableGraph(ig);
og.addgraphenListener(新的graphenListener(){
公共无效handleGraphEvent(GraphEvent evt){
//System.err.println(“got”+evt);
}
});
这个.g=og;
//创建一个graphdraw
布局=新的FRG布局(g);
布局。设置尺寸(新尺寸(600600));
设置大小(730680);
Relaxer Relaxer=新的VisRunner((迭代上下文)布局);
relaxer.stop();
prerelax();
布局静态布局=新的静态布局(g,布局);
vv=新的VisualizationViewer(静态布局,新尺寸(550550));
JRootPane rp=this.getRootPane();
rp.putClientProperty(“DefaultSystemEventQueueCheck”,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);
        }
    }
公共作废流程(){
vv.getRenderContext().getPickedVertexState().clear();
vv.getRenderContext().getPickedEdgeState().clear();
试一试{
if(g.getVertexCount()<100){
//添加顶点
整数v1=节点计数;
g、 addVertex(v1);
布局转换(v1);
double x=Math.random()*600;
双y=Math.random()*600;
System.out.println(“x和y”+x+”+y);
布局。设置位置(v1,x,y);
if(layout.getX(v1)>furthestRight){
furthestRight=layout.getX(v1);
}
if(layout.getX(v1)
如果您有要放置顶点的特定位置,请使用StaticLayout。FRLayout是一种力导向布局,它将根据图形的拓扑重新定位顶点