Search code examples
javajung

JUNG2: How to draw a circle?


I need to draw a circle around a vertex in JUNG. The circle is defined by the vertex as center and a given radius r.


Solution

  • Something like this, I guess. This will give you points for circle with given radius. To adjust resolution of points change x+=0.01 to a bigger/smaller value as needed. To move circle centre to an arbitrary point (p,q), just add it to (x,y), that is plot(x+p,y+q);.

    double radius = 3;
    for (double x = -radius; x <= radius; x += 0.01) {
        double y = Math.sqrt(radius * radius - x * x);
        plot(x, y);//top half of the circle
        plot(x, -y);//bottom half of the circle
    }
    

    EDIT: It appears that JUNG is not really an XY-plot but a network/graph framework. So all you need is to layout your points in a circle using one of provided layouts. CircleLayout and KKLayout seem to do the trick, though CircleLayout gives strange results for when there are many nodes. Here's complete sample code:

    //Graph holder
    Graph<Integer, String> graph = new SparseMultigraph<Integer, String>();
    
    //Create graph with this many nodes and edges
    int nodes = 30;
    for (int i = 1; i <= nodes; i++) {
        graph.addVertex(i);
        //connect this vertext to vertex+1 to create an edge between them.
        //Last vertex is connected to the first one, hence the i%nodes
        graph.addEdge("Edge-" + i, i, (i % nodes) + 1);
    }
    
    //This will automatically layout nodes into a circle.
    //You can also try CircleLayout class
    Layout<Integer, String> layout = new KKLayout<Integer, String>(graph);
    layout.setSize(new Dimension(300, 300)); 
    
    //Thing that draws the graph onto JFrame
    BasicVisualizationServer<Integer, String> vv = new BasicVisualizationServer<Integer, String>(layout);
    vv.setPreferredSize(new Dimension(350, 350)); // Set graph dimensions
    
    JFrame frame = new JFrame("Circle Graph");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(vv);
    frame.pack();
    frame.setVisible(true);
    

    I have picked SparseMultiGraph because that's what was in JUNG tutorial. There are other types of graphs, but I am not sure what the difference is.

    You could also use a StaticLayout that can take (x,y) vertices, then use my original code to plot the points, but that would not be as elegant for JUNG framework. Depends on what your requirements are, however.