From 2f466058376522ef02a8471ec39c6aa2f89be7f5 Mon Sep 17 00:00:00 2001 From: Quinn Date: Tue, 2 May 2023 12:10:58 -0500 Subject: [PATCH] Added a saving and loading system for graph maps --- map.txt | 91 +++++++++++++++++++++---- src/Graph/PointGraph.java | 85 ----------------------- src/Graph/PointGraphWriter.java | 115 ++++++++++++++++++++++++++++++++ src/Processing.java | 19 +++++- 4 files changed, 212 insertions(+), 98 deletions(-) create mode 100644 src/Graph/PointGraphWriter.java diff --git a/map.txt b/map.txt index 6950836..20eed34 100644 --- a/map.txt +++ b/map.txt @@ -1,12 +1,79 @@ -numVerts,4 -numEdges,3 -vert0Pos,797.0,539.0 -vert1Pos,149.0,673.0 -vert2Pos,609.0,247.0 -vert3Pos,724.0,857.0 -edge0End,0 -edge0Start,3 -edge1End,2 -edge1Start,3 -edge2End,1 -edge2Start,3 \ No newline at end of file +numVerts,43 +numEdges,34 +vert,601.0,491.0 +vert,602.0,652.0 +vert,300.0,277.0 +vert,213.0,812.0 +vert,715.0,655.0 +vert,294.0,378.0 +vert,259.0,476.0 +vert,224.0,247.0 +vert,304.0,479.0 +vert,485.0,693.0 +vert,713.0,810.0 +vert,367.0,347.0 +vert,223.0,273.0 +vert,404.0,666.0 +vert,329.0,345.0 +vert,482.0,615.0 +vert,606.0,811.0 +vert,483.0,810.0 +vert,267.0,616.0 +vert,603.0,537.0 +vert,330.0,376.0 +vert,267.0,723.0 +vert,714.0,488.0 +vert,401.0,616.0 +vert,294.0,347.0 +vert,206.0,522.0 +vert,711.0,234.0 +vert,493.0,238.0 +vert,302.0,249.0 +vert,403.0,483.0 +vert,334.0,727.0 +vert,168.0,471.0 +vert,487.0,485.0 +vert,327.0,615.0 +vert,405.0,237.0 +vert,211.0,346.0 +vert,210.0,380.0 +vert,165.0,235.0 +vert,411.0,811.0 +vert,165.0,809.0 +vert,713.0,539.0 +vert,367.0,375.0 +vert,165.0,521.0 +edge,start,1,end,4 +edge,start,1,end,16 +edge,start,3,end,25 +edge,start,9,end,17 +edge,start,10,end,26 +edge,start,11,end,14 +edge,start,11,end,41 +edge,end,7,start,12 +edge,end,2,start,12 +edge,start,13,end,38 +edge,end,0,start,19 +edge,start,19,end,40 +edge,end,14,start,20 +edge,start,20,end,41 +edge,end,18,start,21 +edge,start,21,end,30 +edge,start,24,end,35 +edge,end,5,start,24 +edge,start,26,end,27 +edge,end,7,start,28 +edge,end,2,start,28 +edge,end,23,start,29 +edge,end,8,start,29 +edge,end,6,start,31 +edge,end,15,start,32 +edge,end,22,start,32 +edge,end,18,start,33 +edge,end,30,start,33 +edge,start,34,end,37 +edge,end,35,start,36 +edge,end,5,start,36 +edge,start,37,end,39 +edge,end,10,start,39 +edge,end,25,start,42 \ No newline at end of file diff --git a/src/Graph/PointGraph.java b/src/Graph/PointGraph.java index aab68f4..4e06a60 100644 --- a/src/Graph/PointGraph.java +++ b/src/Graph/PointGraph.java @@ -123,91 +123,6 @@ public class PointGraph extends Graph { super.removeVertex(v); } - /** - * @return a bundle with all of the graphs vertex and edge information saved into it - */ - - public void save() throws IOException { - FileWriter file = new FileWriter("map.txt"); - - - - file.write("numVerts," + super.numVertices()); - file.write("\nnumEdges," + super.numEdges()); - - // turn the hash map into something linear - ArrayList verts = new ArrayList<>(); - ArrayList edges = new ArrayList<>(); - for(Vertex v : super.adjList.keySet()){ - verts.add((PointVertex) v); - for(Edge e : super.adjList.get(v)){ - edges.add(e); - } - } - - // save the vertexes - int countVerts = 0; - for(PointVertex v : verts){ - String countVertsString = "\nvert"+String.valueOf(countVerts); - // save the vertex position - file.write(countVertsString+"Pos,"+v.getPos().x+","+v.getPos().y); - countVerts++; - } - - // save the edges - int countEdges = 0; - for(Edge e : edges){ - int idx = 0; - String countEdgesString = "\nedge" + String.valueOf(countEdges); - for(PointVertex v : verts){ - if(e.getStartVertex() == (Vertex)v){ - file.write(countEdgesString+"Start,"+ idx); - } - else if(e.getEndVertex() == (Vertex)v){ - file.write(countEdgesString+"End," + idx); - } - idx++; - } - countEdges++; - } - file.close(); - } - - /** - * @ brief add all graph information in ta bundle to the graph - * @param bundle the bundle to add to the graph - */ - /* - public void addBundleToGraph(Bundle bundle){ - int numVerts = bundle.getInt("numVerts", 0); - int numEdges = bundle.getInt("numEdges", 0); - ArrayList verts = new ArrayList<>(); - - // add all of the vertexes from the bundle - for(int i = 0; i < numVerts; i++){ - String countVertsString = "vert"+String.valueOf(i); - float[] pos = bundle.getFloatArray(countVertsString+"Pos"); - String label = bundle.getString(countVertsString+"Label"); - boolean isSelected = bundle.getBoolean(countVertsString+"isSelected"); - PointVertex v = new PointVertex(pos[0], pos[1], label); - addVertex(v); - verts.add(v); - if(isSelected){ - setSelectedVertex(v); - } - } - - // add all of the edges from the bundle - for(int i = 0; i < numEdges; i++){ - String countEdgesString = "edge" + String.valueOf(i); - int startVertIndex = bundle.getInt(countEdgesString+"Start"); - int endVertIndex = bundle.getInt(countEdgesString+"End"); - PointVertex vStart = verts.get(startVertIndex); - PointVertex vEnd = verts.get(endVertIndex); - addEdge(vStart, vEnd); - } - } - */ /** * @return all edges in the graph diff --git a/src/Graph/PointGraphWriter.java b/src/Graph/PointGraphWriter.java new file mode 100644 index 0000000..6a895bf --- /dev/null +++ b/src/Graph/PointGraphWriter.java @@ -0,0 +1,115 @@ +package Graph; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Scanner; + +public class PointGraphWriter { + public void save(String filename, PointGraph g) throws IOException { + FileWriter file = new FileWriter(filename); + + file.write("numVerts," + g.numVertices()); + file.write("\nnumEdges," + g.numEdges()); + + // turn the hash map into something linear + ArrayList verts = g.getAllVertexes(); + ArrayList edges = g.getAllEdges(); + + // save the vertexes + int countVerts = 0; + for(PointVertex v : verts){ + // save the vertex position + file.write("\nvert,"+v.getPos().x+","+v.getPos().y); + countVerts++; + } + + // save the edges + for(Edge e : edges){ + int idx = 0; + file.write("\nedge,"); + boolean otherIsWritten = false; + for(PointVertex v : verts){ + if(e.getStartVertex() == (Vertex)v){ + file.write("start,"+ idx); + if(!otherIsWritten){ + file.write(","); + otherIsWritten = true; + } + } + else if(e.getEndVertex() == (Vertex)v){ + file.write("end," + idx); + if(!otherIsWritten){ + file.write(","); + otherIsWritten = true; + } + } + idx++; + } + } + file.close(); + } + + public PointGraph loadFile(String filename) throws FileNotFoundException, NumberFormatException { + PointGraph g = new PointGraph(); + File file = new File(filename); + Scanner reader = new Scanner(file); + ArrayList vertices = new ArrayList<>(); + while(reader.hasNextLine()){ + String line = reader.nextLine(); + ArrayList args = parseLine(line); + String key = args.get(0); + switch (key) { + case "numVerts" -> System.out.println("Number of Vertexes: " + Integer.parseInt(args.get(1))); + case "numEdges" -> System.out.println("Number of Edges: " + Integer.parseInt(args.get(1))); + case "vert" -> { + float x = Float.parseFloat(args.get(1)); + float y = Float.parseFloat(args.get(2)); + PointVertex v = new PointVertex(x, y); + g.addVertex(v); + vertices.add(v); + } + case "edge" -> { + int startIdx; + int endIdx; + if (args.get(1).contains("start")) { + startIdx = Integer.parseInt(args.get(2)); + endIdx = Integer.parseInt(args.get(4)); + } + else{ + startIdx = Integer.parseInt(args.get(4)); + endIdx = Integer.parseInt(args.get(2)); + } + g.addEdge(vertices.get(startIdx), vertices.get(endIdx)); + } + default -> System.out.println("Unrecognized Line: " + line); + } + } + + return g; + } + + private ArrayList parseLine(String line){ + ArrayList args = new ArrayList<>(); + StringBuilder arg = new StringBuilder(); + + for(char letter : line.toCharArray()){ + if(letter == ','){ + args.add(arg.toString()); + arg = new StringBuilder(); + continue; + } + if(letter == '\n'){ + args.add(arg.toString()); + break; + } + arg.append(letter); + } + if(!args.get(args.size()-1).contains(arg.toString())){ + args.add(arg.toString()); + } + return args; + } +} diff --git a/src/Processing.java b/src/Processing.java index 8d505fd..16e187f 100644 --- a/src/Processing.java +++ b/src/Processing.java @@ -2,6 +2,7 @@ import Graph.*; import Vector.Vector; import processing.core.PApplet; +import java.io.FileNotFoundException; import java.io.IOException; @@ -66,12 +67,28 @@ public class Processing extends PApplet { if(key == ESC){ System.out.println("Attempting to save map to file."); try{ - map.save(); + PointGraphWriter writer = new PointGraphWriter(); + writer.save("map.txt", map); } catch(IOException e){ e.printStackTrace(); } } + if(key == 'l'){ + System.out.println("Attempting to load a map from file"); + try{ + PointGraphWriter writer = new PointGraphWriter(); + map = writer.loadFile("map.txt"); + } + catch (FileNotFoundException e){ + System.out.println("File not found"); + e.printStackTrace(); + } + catch (NumberFormatException e){ + System.out.println("Number format incorrect"); + e.printStackTrace(); + } + } } public void mousePressed(){