diff --git a/sketch_231115a/sketch_231115a.pde b/sketch_231115a/sketch_231115a.pde index 95a883d..ed84d45 100644 --- a/sketch_231115a/sketch_231115a.pde +++ b/sketch_231115a/sketch_231115a.pde @@ -1,164 +1,166 @@ class Delay { int limit; - + Delay (int l) { limit = millis() + l; } - - boolean expired () { + + boolean expired () { return millis() > limit; } } -class Graph { - ArrayList> adj; - ArrayList> coords; - int V; - Graph(int v) { - V = v; - adj = new ArrayList>(V); - coords = new ArrayList>(V); - for (int i = 0; i < V; i++) { - adj.add(new ArrayList()); - coords.add(new ArrayList()); - } - +class Graph { + ArrayList> adj; + ArrayList> coords; + int V; + Graph(int v) { + V = v; + adj = new ArrayList>(V); + coords = new ArrayList>(V); + for (int i = 0; i < V; i++) { + adj.add(new ArrayList()); + coords.add(new ArrayList()); } - - void draw_vis(boolean[] vis) { - strokeWeight(20); - stroke(255); - for (int i = 0; i < coords.size(); i++) { - if (!vis[i]) continue; - point(coords.get(i).get(0), coords.get(i).get(1)); - text(i+1, coords.get(i).get(0)-4, coords.get(i).get(1)+5); - - } - } - - void draw_points() { - strokeWeight(20); - stroke(#FF0000); - for (int i = 0; i < coords.size(); i++) { - point(coords.get(i).get(0), coords.get(i).get(1)); - text(i+1, coords.get(i).get(0)-4, coords.get(i).get(1)+5); - } - } - - void draw_graph() { - stroke(#550000); - strokeWeight(10); - for (int i = 0; i < adj.size(); i++) { - for (int idx = 0; idx < adj.get(i).size(); idx++) { - int e = adj.get(i).get(idx); - draw_arrow(coords.get(i).get(0), coords.get(i).get(1), coords.get(e).get(0), coords.get(e).get(1)); - } - } - } - - void set_coords(int idx, int x, int y) { - coords.get(idx).add(x); - coords.get(idx).add(y); - } - - void add_edge(int u, int v) { - adj.get(u).add(v); - } -} + } + void draw_vis(boolean[] vis) { + strokeWeight(20); + stroke(255); + for (int i = 0; i < coords.size(); i++) { + if (!vis[i]) continue; + point(coords.get(i).get(0), coords.get(i).get(1)); + text(i+1, coords.get(i).get(0)-4, coords.get(i).get(1)+5); + } + } -void draw_arrow(float x1, float y1, float x2, float y2) { + void draw_points() { + strokeWeight(20); + stroke(#FF0000); + for (int i = 0; i < coords.size(); i++) { + point(coords.get(i).get(0), coords.get(i).get(1)); + text(i+1, coords.get(i).get(0)-4, coords.get(i).get(1)+5); + } + } + + void draw_graph() { + stroke(#550000); + strokeWeight(10); + for (int i = 0; i < adj.size(); i++) { + for (int idx = 0; idx < adj.get(i).size(); idx++) { + int e = adj.get(i).get(idx); + draw_arrow(coords.get(i).get(0), coords.get(i).get(1), coords.get(e).get(0), coords.get(e).get(1), 5); + } + } + } + + void set_coords(int idx, int x, int y) { + coords.get(idx).add(x); + coords.get(idx).add(y); + } + + void add_edge(int u, int v) { + adj.get(u).add(v); + } +} + +Graph g; +ArrayList edges; +boolean[] vis; + +void draw_arrow_2(float x1, float y1, float x2, float y2, float offset) { float triangle_size = dist(x1, y1, x2, y2) / 50; pushMatrix(); translate(x2, y2); //changes (0, 0) - rotate(atan2(y2 - y1, x2 - x1)); + rotate(atan2(y2 - y1, x2 - x1)); triangle( -triangle_size * 2, - triangle_size, 0, 0, -triangle_size * 2, triangle_size); popMatrix(); line(x1, y1, x2, y2); } - + +void draw_arrow(float x1, float y1, float x2, float y2, float offset) { + float angle = atan2(y2-y1, x2 - x1); + float offset_x = offset; + float offset_y = offset; + //if (x2 < x1) offset_x *= -1; + //if (y2 < y1) offset_y *= -1; + line(x1 + offset_x * sqrt(1-sin(angle)), y1 + offset_y * sin(angle), + x2 - offset_x * sqrt(1-sin(angle)), y2 - offset_y * sin(angle)); +} + void setup() { size(1000, 1000); frameRate(60); - background(0); + background(255); test(); - + edges = bfs(0, 6); } -void bfs(Graph g, boolean[] vis, int start, int end) { - ArrayList q = new ArrayList(); - q.add(start); - int q_size = 1; - while (q_size > 0) { - int next = q.get(0); - q.remove(0); - q_size--; - vis[next] = true; - for (int neighbor: g.adj.get(next)) { - background(0); - g.draw_graph(); - g.draw_points(); - g.draw_vis(vis); - stroke(#00FF00); - draw_arrow(g.coords.get(next).get(0), g.coords.get(next).get(1), g.coords.get(neighbor).get(0), g.coords.get(neighbor).get(1)); - Delay timer = new Delay(1000); - while (!timer.expired()) { - // nothing - } - //int target_millis = millis() + 1000; - //while (millis() < target_millis) { - // print(millis()); - //} - if (vis[neighbor]) continue; - q.add(neighbor); - q_size++; - if (neighbor == end) return; - print("next"); - } - if (q_size == 0) { - print("end"); - return; - } +ArrayList bfs(int start, int end) { + ArrayList q = new ArrayList(); + ArrayList res = new ArrayList(); + q.add(start); + int[] edge = new int[] {0, 0}; + res.add(edge); + int q_size = 1; + while (q_size > 0) { + int next = q.get(0); + q.remove(0); + q_size--; + vis[next] = true; + g.add_edge(0, 0); + print(g.adj.size()); + for (int neighbor : g.adj.get(next)) { + print(neighbor); + if (vis[neighbor]) continue; + q.add(neighbor); + edge = new int[]{next, neighbor}; + res.add(edge); + q_size++; + if (neighbor == end) return res; } + //if (q_size == 0) { + // print("end"); + // return res; + //} + } + return res; } void test() { int size = 7; - Graph g = new Graph(size); + g = new Graph(size); g.add_edge(0, 1); g.add_edge(1, 3); g.add_edge(1, 4); g.add_edge(2, 0); g.add_edge(4, 5); g.add_edge(5, 6); - g.set_coords(0, 100, 500); + g.set_coords(0, 100, 500); g.set_coords(1, 300, 500); g.set_coords(2, 300, 750); g.set_coords(3, 500, 500); g.set_coords(4, 300, 250); g.set_coords(5, 500, 250); g.set_coords(6, 700, 250); - - boolean[] vis = new boolean[size]; - for (int i = 0; i < size; i++) { - vis[i] = false; - } - bfs(g, vis, 0, size-1); + vis = new boolean[]{false, false, false, false, false, false, false}; } void draw() { - - //stroke(#FF00FF); - //strokeWeight(50); - //ellipse(500, 500, 100, 100); - //delay(1000); - //strokeWeight(20); - //stroke(#550000); - //draw_arrow(width/2, height/2, width/3, height/2); - + if (frameCount % 60 == 0) { + g.draw_graph(); + g.draw_points(); + stroke(#00FF00); + if (!edges.isEmpty()) { + int[] edge = edges.get(0); + edges.remove(0); + strokeWeight(20); + draw_arrow(g.coords.get(edge[0]).get(0), g.coords.get(edge[0]).get(1), g.coords.get(edge[1]).get(0), g.coords.get(edge[1]).get(1), 5); + } + } }