Răsfoiți Sursa

Rangom Graph Generator und Graph Writer hinzugefügt

Kolja Strohm 6 ani în urmă
părinte
comite
a9edbc568d

+ 1 - 0
big.graph

@@ -0,0 +1 @@
+{"layers":[[{"layers":[],"edges":[],"name":"0"}],[{"layers":[],"edges":[],"name":"1"},{"layers":[],"edges":[],"name":"2"},{"layers":[],"edges":[],"name":"3"}],[{"layers":[],"edges":[],"name":"4"},{"layers":[],"edges":[],"name":"5"}],[{"layers":[],"edges":[],"name":"6"},{"layers":[],"edges":[],"name":"7"},{"layers":[],"edges":[],"name":"8"}],[{"layers":[[{"layers":[],"edges":[],"name":"0"},{"layers":[],"edges":[],"name":"1"},{"layers":[],"edges":[],"name":"2"},{"layers":[],"edges":[],"name":"3"}],[{"layers":[],"edges":[],"name":"4"},{"layers":[],"edges":[],"name":"5"},{"layers":[[{"layers":[],"edges":[],"name":"0"},{"layers":[],"edges":[],"name":"1"}],[{"layers":[],"edges":[],"name":"2"}]],"edges":[{"source":"0","target":"2"},{"source":"1","target":"2"}],"name":"6"}],[{"layers":[],"edges":[],"name":"7"},{"layers":[],"edges":[],"name":"8"}],[{"layers":[],"edges":[],"name":"9"}],[{"layers":[],"edges":[],"name":"10"}],[{"layers":[],"edges":[],"name":"11"},{"layers":[],"edges":[],"name":"12"},{"layers":[[{"layers":[],"edges":[],"name":"0"},{"layers":[],"edges":[],"name":"1"}]],"edges":[],"name":"13"},{"layers":[[{"layers":[],"edges":[],"name":"0"}],[{"layers":[],"edges":[],"name":"1"}],[{"layers":[],"edges":[],"name":"2"},{"layers":[],"edges":[],"name":"3"}],[{"layers":[],"edges":[],"name":"4"},{"layers":[],"edges":[],"name":"5"},{"layers":[],"edges":[],"name":"6"},{"layers":[],"edges":[],"name":"7"}],[{"layers":[],"edges":[],"name":"8"},{"layers":[],"edges":[],"name":"9"},{"layers":[],"edges":[],"name":"10"},{"layers":[],"edges":[],"name":"11"}],[{"layers":[],"edges":[],"name":"12"}]],"edges":[{"source":"1","target":"3"},{"source":"3","target":"4"},{"source":"3","target":"5"},{"source":"3","target":"6"},{"source":"7","target":"8"},{"source":"5","target":"9"},{"source":"5","target":"10"},{"source":"7","target":"11"},{"source":"8","target":"12"},{"source":"11","target":"12"}],"name":"14"}]],"edges":[{"source":"0","target":"4"},{"source":"2","target":"4"},{"source":"0","target":"5"}],"name":"9"},{"layers":[],"edges":[],"name":"10"},{"layers":[],"edges":[],"name":"11"}],[{"layers":[[{"layers":[],"edges":[],"name":"0"}],[{"layers":[],"edges":[],"name":"1"},{"layers":[],"edges":[],"name":"2"}],[{"layers":[],"edges":[],"name":"3"},{"layers":[],"edges":[],"name":"4"}],[{"layers":[],"edges":[],"name":"5"},{"layers":[],"edges":[],"name":"6"},{"layers":[],"edges":[],"name":"7"}]],"edges":[{"source":"0","target":"2"},{"source":"4","target":"5"},{"source":"3","target":"6"},{"source":"3","target":"7"}],"name":"12"},{"layers":[],"edges":[],"name":"13"},{"layers":[],"edges":[],"name":"14"}],[{"layers":[],"edges":[],"name":"15"},{"layers":[],"edges":[],"name":"16"},{"layers":[[{"layers":[],"edges":[],"name":"0"}],[{"layers":[],"edges":[],"name":"1"},{"layers":[],"edges":[],"name":"2"},{"layers":[],"edges":[],"name":"3"},{"layers":[],"edges":[],"name":"4"}],[{"layers":[],"edges":[],"name":"5"}],[{"layers":[],"edges":[],"name":"6"},{"layers":[],"edges":[],"name":"7"},{"layers":[],"edges":[],"name":"8"},{"layers":[[{"layers":[],"edges":[],"name":"0"}],[{"layers":[],"edges":[],"name":"1"}],[{"layers":[],"edges":[],"name":"2"}],[{"layers":[],"edges":[],"name":"3"},{"layers":[],"edges":[],"name":"4"}],[{"layers":[],"edges":[],"name":"5"},{"layers":[],"edges":[],"name":"6"},{"layers":[],"edges":[],"name":"7"}],[{"layers":[],"edges":[],"name":"8"}],[{"layers":[],"edges":[],"name":"9"},{"layers":[],"edges":[],"name":"10"},{"layers":[],"edges":[],"name":"11"}],[{"layers":[],"edges":[],"name":"12"},{"layers":[],"edges":[],"name":"13"},{"layers":[],"edges":[],"name":"14"},{"layers":[],"edges":[],"name":"15"}]],"edges":[{"source":"3","target":"6"},{"source":"4","target":"6"},{"source":"8","target":"9"},{"source":"9","target":"14"},{"source":"11","target":"14"},{"source":"9","target":"15"}],"name":"9"}],[{"layers":[],"edges":[],"name":"10"},{"layers":[[{"layers":[],"edges":[],"name":"0"},{"layers":[],"edges":[],"name":"1"},{"layers":[],"edges":[],"name":"2"},{"layers":[],"edges":[],"name":"3"}],[{"layers":[],"edges":[],"name":"4"},{"layers":[],"edges":[],"name":"5"}],[{"layers":[],"edges":[],"name":"6"},{"layers":[],"edges":[],"name":"7"},{"layers":[],"edges":[],"name":"8"},{"layers":[],"edges":[],"name":"9"}],[{"layers":[],"edges":[],"name":"10"},{"layers":[],"edges":[],"name":"11"},{"layers":[],"edges":[],"name":"12"}],[{"layers":[],"edges":[],"name":"13"}],[{"layers":[],"edges":[],"name":"14"},{"layers":[],"edges":[],"name":"15"}],[{"layers":[],"edges":[],"name":"16"}]],"edges":[{"source":"0","target":"5"},{"source":"1","target":"5"},{"source":"2","target":"5"},{"source":"4","target":"7"},{"source":"4","target":"8"},{"source":"7","target":"10"},{"source":"6","target":"11"},{"source":"7","target":"12"},{"source":"9","target":"12"},{"source":"10","target":"13"},{"source":"12","target":"13"},{"source":"13","target":"14"}],"name":"11"}],[{"layers":[],"edges":[],"name":"12"},{"layers":[[{"layers":[],"edges":[],"name":"0"},{"layers":[],"edges":[],"name":"1"},{"layers":[],"edges":[],"name":"2"}],[{"layers":[],"edges":[],"name":"3"},{"layers":[],"edges":[],"name":"4"},{"layers":[],"edges":[],"name":"5"}],[{"layers":[],"edges":[],"name":"6"}],[{"layers":[],"edges":[],"name":"7"},{"layers":[],"edges":[],"name":"8"}]],"edges":[{"source":"2","target":"3"},{"source":"0","target":"4"},{"source":"3","target":"6"}],"name":"13"},{"layers":[],"edges":[],"name":"14"},{"layers":[],"edges":[],"name":"15"}],[{"layers":[],"edges":[],"name":"16"},{"layers":[],"edges":[],"name":"17"},{"layers":[],"edges":[],"name":"18"}]],"edges":[{"source":"0","target":"2"},{"source":"1","target":"5"},{"source":"5","target":"9"},{"source":"6","target":"10"},{"source":"9","target":"10"},{"source":"6","target":"11"},{"source":"11","target":"13"},{"source":"11","target":"15"},{"source":"13","target":"16"},{"source":"12","target":"17"}],"name":"17"}]],"edges":[{"source":"0","target":"1"},{"source":"0","target":"2"},{"source":"0","target":"3"},{"source":"4","target":"6"},{"source":"5","target":"6"},{"source":"8","target":"9"},{"source":"7","target":"10"},{"source":"7","target":"11"},{"source":"8","target":"11"},{"source":"9","target":"13"},{"source":"11","target":"13"},{"source":"9","target":"14"},{"source":"10","target":"14"},{"source":"14","target":"15"},{"source":"12","target":"16"},{"source":"13","target":"16"},{"source":"14","target":"17"}]}

BIN
bin/View/MainView.class


BIN
bin/inputReader/Reader.class


+ 8 - 0
src/Algorithms/InitializeNodePositions.java

@@ -16,7 +16,11 @@ public class InitializeNodePositions {
     public static void placeNodes( LayeredGraphNode graph ) {
         
         for( LayeredGraphNode n : graph.getContainedNodes() )
+        {
+            n.setWidth( 10 );
+            n.setHeight( 10 );
             placeNodes( n );
+        }
         int curY = 0;
         double maxWidth = 0, maxHeight = 0;
         
@@ -27,6 +31,10 @@ public class InitializeNodePositions {
         
         ArrayList< ArrayList< LayeredGraphNode > > layers = graph.getContainedLayers();
         for (ArrayList<LayeredGraphNode> layer : layers) { // Gehe alle Layer durch
+            maxHeight = 0;
+            for (LayeredGraphNode node : layer) { // Gehe alle Knoten durch
+                maxHeight = Math.max(node.getHeight(), maxHeight);
+            }
             int curX = 0;
             for (LayeredGraphNode node : layer) { // Gehe alle Knoten durch
                 node.setX(curX + maxWidth / 2 - node.getWidth() / 2);

+ 55 - 0
src/Algorithms/RandomGraphGenerator.java

@@ -0,0 +1,55 @@
+package Algorithms;
+
+import Model.LayeredGraphNode;
+import Model.LayeredNode;
+
+public class RandomGraphGenerator {
+
+    private double pSubgraph;
+    private double pEdge;
+    private int minLayer;
+    private int maxLayer;
+    private int minNodePerLayer;
+    private int maxNodePerLayer;
+    private int maxDepth;
+    
+    public RandomGraphGenerator( double pSubgraph, double pEdge, int minLayer, int maxLayer, int minNodePerLayer, int maxNodePerLayer, int maxDepth )
+    {
+        this.pSubgraph = pSubgraph;
+        this.pEdge = pEdge;
+        this.minLayer = minLayer;
+        this.maxLayer = maxLayer;
+        this.minNodePerLayer = minNodePerLayer;
+        this.maxNodePerLayer = maxNodePerLayer;
+        this.maxDepth = maxDepth;
+    }
+    
+    public LayeredGraphNode createRandomNode( LayeredGraphNode parent, int depth )
+    {
+        LayeredGraphNode node = new LayeredNode( null, null );
+        if( parent != null )
+            node = parent.createNode( null );
+        if( Math.random() <= pSubgraph && depth < maxDepth )
+        {
+            int layer = (int)( Math.random() * ( maxLayer - minLayer ) ) + minLayer;
+            for( int i = 0; i < layer; i++ )
+            {
+                int knoten = (int)( Math.random() * ( maxNodePerLayer - minNodePerLayer ) ) + minNodePerLayer;
+                for( int j = 0; j < knoten; j++ )
+                {
+                    LayeredGraphNode n = createRandomNode( node, depth + 1 );
+                    n.setLayer( i );
+                    if( i > 0 )
+                    {
+                        for( LayeredGraphNode n2 : node.getContainedLayers().get( i - 1 ) )
+                        {
+                            if( Math.random() <= pEdge )
+                                node.createSimpleEdge( null, n2, n );
+                        }
+                    }
+                }
+            }
+        }
+        return node;
+    }
+}

+ 1 - 1
src/inputReader/Reader.java → src/IO/Reader.java

@@ -1,4 +1,4 @@
-package inputReader;
+package IO;
 
 import java.io.BufferedReader;
 import java.io.FileReader;

+ 68 - 0
src/IO/Writer.java

@@ -0,0 +1,68 @@
+package IO;
+
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import Model.LayeredGraphEdge;
+import Model.LayeredGraphNode;
+
+public class Writer {
+
+    private String file;
+    
+    public Writer( String outputFileName )
+    {
+        file = outputFileName;
+    }
+    
+    public void writeOutputGraph( LayeredGraphNode graph )
+    {
+        try {
+            BufferedWriter w = new BufferedWriter( new FileWriter( file ) );
+            w.write( parseNode( graph ).toString() );
+            w.close();
+        } catch (IOException | JSONException e) {
+            e.printStackTrace();
+        }        
+    }
+    
+    public JSONObject parseNode( LayeredGraphNode graph ) throws JSONException
+    {
+        JSONObject node = new JSONObject();
+        JSONArray layers = new JSONArray();
+        int id = 0;
+        for( ArrayList<LayeredGraphNode> l : graph.getContainedLayers() )
+        {
+            JSONArray layer = new JSONArray();
+            for( LayeredGraphNode n : l )
+            {
+                n.setName( "" + (id++) );
+                layer.put( parseNode( n ) );
+            }
+            layers.put( layer );
+        }
+        node.put( "layers", layers );
+        JSONArray edges = new JSONArray();
+        for( LayeredGraphEdge e : graph.getContainedEdges() )
+        {
+            edges.put( parseEdge( e ) );
+        }
+        node.put( "edges", edges );
+        node.put( "name", graph.getName() );
+        return node;
+    }
+    
+    public JSONObject parseEdge( LayeredGraphEdge e ) throws JSONException
+    {
+        JSONObject edge = new JSONObject();
+        edge.put( "source", e.getSources().get( 0 ).getName() );
+        edge.put( "target", e.getTargets().get( 0 ).getName() );
+        return edge;
+    }
+}

+ 10 - 4
src/Main.java

@@ -1,14 +1,20 @@
 import Algorithms.InitializeNodePositions;
+import Algorithms.RandomGraphGenerator;
+import IO.Reader;
 import Model.LayeredGraphNode;
 import View.MainView;
-import inputReader.Reader;
 
 public class Main {
 
 	public static void main(String[] args) {
-		// TODO Auto-generated method stub
-		Reader r = new Reader( "test.graph" );
-		LayeredGraphNode graph = r.readInputGraph();
+		//Reader r = new Reader( "save.graph" );
+		//LayeredGraphNode graph = r.readInputGraph();
+	    LayeredGraphNode graph = null;
+	    do
+	    {
+    	    RandomGraphGenerator r = new RandomGraphGenerator( 0.1, 0.3, 1, 10, 1, 5, 3 );
+    	    graph = r.createRandomNode( null, 0 );
+	    } while( graph.getContainedNodes().size() == 0 );
 		InitializeNodePositions.placeNodes( graph );
 		new MainView( graph );
 	}

+ 29 - 0
src/View/MainView.java

@@ -1,7 +1,11 @@
 package View;
 
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+
 import javax.swing.JFrame;
 
+import IO.Writer;
 import Model.LayeredGraphEdge;
 import Model.LayeredGraphNode;
 
@@ -17,6 +21,31 @@ public class MainView {
 		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
 		frame.setVisible( true );
 		
+		frame.addKeyListener( new KeyListener() {
+
+            @Override
+            public void keyTyped(KeyEvent e) {
+                // TODO Auto-generated method stub
+                
+            }
+
+            @Override
+            public void keyPressed(KeyEvent e) {
+                if( e.getKeyCode() == KeyEvent.VK_S )
+                {
+                    Writer w = new Writer( "save.graph" );
+                    w.writeOutputGraph( graph );
+                }
+            }
+
+            @Override
+            public void keyReleased(KeyEvent e) {
+                // TODO Auto-generated method stub
+                
+            }
+		    
+		});
+		
 		NodeView view = createNodeView( graph );
 		graph.setX( 40 );
 		graph.setY( 40 );