JUNG2: Comment dessiner un cercle?
Question
Je dois tracer un cercle autour d'un sommet dans JUNG . Le cercle est défini par le sommet en tant que centre et un rayon r donné.
La solution
Quelque chose comme ça, je suppose. Cela vous donnera des points pour le cercle avec radius
donné. Pour régler la résolution de points changement x+=0.01
à une plus grande / valeur plus petite au besoin. Pour déplacer le centre du cercle à un point arbitraire (p,q)
, il suffit d'ajouter à (x,y)
, qui est 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 : Il semble que JUNG est pas vraiment XY intrigue, mais un cadre réseau / graphique. Donc, tout ce que vous avez besoin est de mise en page de vos points dans un cercle en utilisant l'une des mises en page fournies. semblent CircleLayout
et KKLayout
faire l'affaire, mais CircleLayout
donne des résultats étranges pour quand il y a beaucoup de nœuds. Voici un exemple de code complet:
//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);
J'ai choisi parce que ce SparseMultiGraph
ce qui était dans JUNG tutoriel . Il existe d'autres types de graphiques, mais je ne suis pas sûr de ce que la différence est.
Vous pouvez également utiliser un StaticLayout
qui peut prendre sommets (x,y)
, utilisez mon code d'origine pour tracer les points, mais ce ne serait pas aussi élégant pour cadre JUNG. Cela dépend de ce que vos besoins sont, cependant.