2014-03-12 46 views
0

我被困在可視化部分,我創建了一個DirectedSparseMultiGraph,用於可視化以下轉換圖。我想以與image.中描述的相同的方式繪製它現在我得到this.如何在JUNG(Java通用網絡/圖形框架)中可視化狀態轉換圖?

我知道問題在於佈局,但我是JUNG框架的新手,我無法獲得它對。

這裏是我的代碼片斷:

MyVertexMyEdge類是簡單的類爲他們的ID的字段和邊緣的相關聯的概率。

package testing.jung.in.eclipse; 

import java.awt.Dimension; 

import javax.swing.JFrame; 

import edu.uci.ics.jung.algorithms.layout.CircleLayout; 
import edu.uci.ics.jung.algorithms.layout.Layout; 
import edu.uci.ics.jung.graph.DirectedSparseMultigraph; 
import edu.uci.ics.jung.graph.Graph; 
import edu.uci.ics.jung.graph.util.EdgeType; 
import edu.uci.ics.jung.visualization.BasicVisualizationServer; 
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller; 
import edu.uci.ics.jung.visualization.renderers.Renderer.VertexLabel.Position; 

public class BasicGraphCreation 
{ 
public static void main(String[] args) 
{ 
    Graph<MyVertex, MyEdge> g = new DirectedSparseMultigraph<MyVertex, MyEdge>(); 
    MyVertex n0 = new MyVertex(0); 
    MyVertex n1 = new MyVertex(1); 
    MyVertex n2 = new MyVertex(2); 
    MyVertex n3 = new MyVertex(3); 
    MyVertex n4 = new MyVertex(4); 
    MyVertex n5 = new MyVertex(5); 
    MyVertex n6 = new MyVertex(6); 
    MyVertex o1 = new MyVertex(001); 
    MyVertex o2 = new MyVertex(010); 
    MyVertex o3 = new MyVertex(011); 
    MyVertex o4 = new MyVertex(100); 
    MyVertex o5 = new MyVertex(101); 
    MyVertex o6 = new MyVertex(110); 

    g.addEdge(new MyEdge(0.5), n0, n1, EdgeType.DIRECTED); 
    g.addEdge(new MyEdge(0.5), n1, n3, EdgeType.DIRECTED); 
    g.addEdge(new MyEdge(0.5), n3, n1, EdgeType.DIRECTED); 
    g.addEdge(new MyEdge(0.5), n1, n4, EdgeType.DIRECTED); 
    g.addEdge(new MyEdge(0.5), n3, o1); 
    g.addEdge(new MyEdge(0.5), n4, o2); 
    g.addEdge(new MyEdge(0.5), n4, o3); 
    g.addEdge(new MyEdge(0.5), n0, n2); 
    g.addEdge(new MyEdge(0.5), n2, n5); 
    g.addEdge(new MyEdge(0.5), n2, n6); 
    g.addEdge(new MyEdge(0.5), n6, n2); 
    g.addEdge(new MyEdge(0.5), n5, o4); 
    g.addEdge(new MyEdge(0.5), n5, o5); 
    g.addEdge(new MyEdge(0.5), n6, o6); 

    Layout<MyVertex, MyEdge> layout = new CircleLayout<MyVertex, MyEdge>(g); 
    layout.setSize(new Dimension(600, 600)); // sets the initial size of the space 
    // The BasicVisualizationServer<V,E> is parameterised by the edge types 

    BasicVisualizationServer<MyVertex, MyEdge> vv = new BasicVisualizationServer<MyVertex, MyEdge>(layout); 
    vv.setPreferredSize(new Dimension(650, 650)); //Sets the viewing area size 

    vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<MyVertex>()); 
    vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller<MyEdge>()); 
    vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR); 

    JFrame frame = new JFrame("Directed Graph "); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(vv); 
    frame.pack(); 
    frame.setVisible(true); 
} 
} 

回答

0

如果您知道頂點的位置,請使用StaticLayout。

如果你想要一個佈局算法,將會弄清楚如何自動創建這樣的佈局,你將需要自己提供這個佈局......並且這不會是微不足道的。

+0

感謝Joshua的回覆,上面顯示的例子僅供參考,但我所擁有的是可能會改變的頂點,邊緣和標籤信息,然後我必須創建一個如上所述的狀態機,所以StaticLayout將不會完成這項工作,是由我自己創建一個算法只有有效的選項。 你可以建議我一些其他的開源選項,用於Java中的有限狀態機的可視化,我想在另一個項目中使用它,我發現http://jautomata.sourceforge.net/但自2006年以來它的開發停滯不前。 – longjohnsilver

+0

您是否在創建JUNG2佈局時遇到過這個問題? – longjohnsilver

+0

如果您的圖形是一棵樹或基本上像樹(如您的示例),則可以使用TreeLayout。可能有一些像樣的現有算法用於渲染FSM--這不是我研究過的 - 如果有的話,你可以在JUNG中實現它們,而不必開發自己的算法。對於它的價值,JUNG佈局算法試圖針對一般圖形進行優化,而不是試圖看起來像特定的東西;他們強調武力導向的佈局。 CircleLayout很少是正確的答案。嘗試查看ShowLayouts演示以使用不同的選項。 –

相關問題