This commit is contained in:
DarianTr
2023-11-16 13:44:54 +01:00
parent 6644c8f1f5
commit d5ed89fd92

View File

@@ -11,63 +11,64 @@ class Delay {
} }
class Graph { class Graph {
ArrayList<ArrayList<Integer>> adj; ArrayList<ArrayList<Integer>> adj;
ArrayList<ArrayList<Integer>> coords; ArrayList<ArrayList<Integer>> coords;
int V; int V;
Graph(int v) { Graph(int v) {
V = v; V = v;
adj = new ArrayList<ArrayList<Integer>>(V); adj = new ArrayList<ArrayList<Integer>>(V);
coords = new ArrayList<ArrayList<Integer>>(V); coords = new ArrayList<ArrayList<Integer>>(V);
for (int i = 0; i < V; i++) { for (int i = 0; i < V; i++) {
adj.add(new ArrayList<Integer>()); adj.add(new ArrayList<Integer>());
coords.add(new ArrayList<Integer>()); coords.add(new ArrayList<Integer>());
}
} }
}
void draw_vis(boolean[] vis) { void draw_vis(boolean[] vis) {
strokeWeight(20); strokeWeight(20);
stroke(255); stroke(255);
for (int i = 0; i < coords.size(); i++) { for (int i = 0; i < coords.size(); i++) {
if (!vis[i]) continue; if (!vis[i]) continue;
point(coords.get(i).get(0), coords.get(i).get(1)); 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); 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), 5);
} }
} }
}
void draw_points() { void set_coords(int idx, int x, int y) {
strokeWeight(20); coords.get(idx).add(x);
stroke(#FF0000); coords.get(idx).add(y);
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() { void add_edge(int u, int v) {
stroke(#550000); adj.get(u).add(v);
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);
}
} }
Graph g;
ArrayList<int[]> edges;
boolean[] vis;
void draw_arrow(float x1, float y1, float x2, float y2) { void draw_arrow_2(float x1, float y1, float x2, float y2, float offset) {
float triangle_size = dist(x1, y1, x2, y2) / 50; float triangle_size = dist(x1, y1, x2, y2) / 50;
pushMatrix(); pushMatrix();
translate(x2, y2); //changes (0, 0) translate(x2, y2); //changes (0, 0)
@@ -77,88 +78,89 @@ void draw_arrow(float x1, float y1, float x2, float y2) {
line(x1, y1, x2, y2); 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() { void setup() {
size(1000, 1000); size(1000, 1000);
frameRate(60); frameRate(60);
background(0); background(255);
test(); test();
edges = bfs(0, 6);
} }
void bfs(Graph g, boolean[] vis, int start, int end) { ArrayList<int[]> bfs(int start, int end) {
ArrayList<Integer> q = new ArrayList<Integer>(); ArrayList<Integer> q = new ArrayList<Integer>();
q.add(start); ArrayList<int[]> res = new ArrayList<int[]>();
int q_size = 1; q.add(start);
while (q_size > 0) { int[] edge = new int[] {0, 0};
int next = q.get(0); res.add(edge);
q.remove(0); int q_size = 1;
q_size--; while (q_size > 0) {
vis[next] = true; int next = q.get(0);
for (int neighbor: g.adj.get(next)) { q.remove(0);
background(0); q_size--;
g.draw_graph(); vis[next] = true;
g.draw_points(); g.add_edge(0, 0);
g.draw_vis(vis); print(g.adj.size());
stroke(#00FF00); for (int neighbor : g.adj.get(next)) {
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)); print(neighbor);
Delay timer = new Delay(1000); if (vis[neighbor]) continue;
while (!timer.expired()) { q.add(neighbor);
// nothing edge = new int[]{next, neighbor};
} res.add(edge);
//int target_millis = millis() + 1000; q_size++;
//while (millis() < target_millis) { if (neighbor == end) return res;
// print(millis());
//}
if (vis[neighbor]) continue;
q.add(neighbor);
q_size++;
if (neighbor == end) return;
print("next");
}
if (q_size == 0) {
print("end");
return;
}
} }
//if (q_size == 0) {
// print("end");
// return res;
//}
}
return res;
} }
void test() { void test() {
int size = 7; int size = 7;
Graph g = new Graph(size); g = new Graph(size);
g.add_edge(0, 1); g.add_edge(0, 1);
g.add_edge(1, 3); g.add_edge(1, 3);
g.add_edge(1, 4); g.add_edge(1, 4);
g.add_edge(2, 0); g.add_edge(2, 0);
g.add_edge(4, 5); g.add_edge(4, 5);
g.add_edge(5, 6); 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(1, 300, 500);
g.set_coords(2, 300, 750); g.set_coords(2, 300, 750);
g.set_coords(3, 500, 500); g.set_coords(3, 500, 500);
g.set_coords(4, 300, 250); g.set_coords(4, 300, 250);
g.set_coords(5, 500, 250); g.set_coords(5, 500, 250);
g.set_coords(6, 700, 250); g.set_coords(6, 700, 250);
vis = new boolean[]{false, false, false, false, false, false, false};
boolean[] vis = new boolean[size];
for (int i = 0; i < size; i++) {
vis[i] = false;
}
bfs(g, vis, 0, size-1);
} }
void draw() { void draw() {
if (frameCount % 60 == 0) {
//stroke(#FF00FF); g.draw_graph();
//strokeWeight(50); g.draw_points();
//ellipse(500, 500, 100, 100); stroke(#00FF00);
//delay(1000); if (!edges.isEmpty()) {
//strokeWeight(20); int[] edge = edges.get(0);
//stroke(#550000); edges.remove(0);
//draw_arrow(width/2, height/2, width/3, height/2); 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);
}
}
} }