2011-01-13 5 views

ответ

0

Что-то вроде этого, я думаю. Это даст вам очки за круг с заданными radius. Чтобы настроить разрешение точек, измените значение x+=0.01 на большее/меньшее значение по мере необходимости. Чтобы переместить центр круга в произвольную точку (p,q), просто добавьте его в (x,y), то есть 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: Похоже, что JUNG не действительно XY-график, но структура сети/график. Итак, все, что вам нужно, - это расставить свои точки по кругу, используя один из предоставленных макетов. CircleLayout и KKLayout, похоже, делают трюк, хотя CircleLayout дает странные результаты, когда есть много узлов. Вот полный пример кода:

//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); 

Я выбрал SparseMultiGraph, потому что это то, что было в JUNG tutorial. Существуют и другие типы графиков, но я не уверен, в чем разница.

Вы также можете использовать StaticLayout, который может принимать вершины (x,y), а затем использовать мой оригинальный код для построения точек, но это не было бы столь же изящным для рамки JUNG. Однако зависит от ваших требований.

+0

Хм, я довольно новичок в java и jung, как применить это к существующему сюжету JUNG с помощью JFrame? – mamruoc

+0

Извините, я не знаком с самим JUNG. Думаю, вам нужно сохранить предыдущую вершину '(x, y)' в переменной и создать ребро между предыдущим и текущим в цикле. Затем добавьте ребро к графику. Однако не уверен в точном API. Я посмотрю на это, но было бы неплохо, если бы кто-то другой опубликовал ответ с правильным использованием API. Кто угодно? – rodion

+0

Я согласен с этим. Я получил его на работу, но я не использовал JUNG. – mamruoc

Смежные вопросы