#include "animate.hpp" #include #include animate::animate(double Lx, double Ly, unsigned window_size, int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize((unsigned)(Lx / Ly * window_size), window_size); glutCreateWindow("wolff"); glClearColor(0.0,0.0,0.0,0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-1, Lx + 3, -1 , Ly + 3); } void animate::pre_fracture(const network &n) { lv = std::numeric_limits::lowest(); avalanches = {}; seen_guy = false; glClearColor(1.0f, 1.0f, 1.0f, 1.0f ); glLineWidth(5); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINES); glColor3f(0.9f, 0.9f, 0.9f); for (unsigned i = 0; i < n.G.edges.size(); i++) { graph::coordinate r1 = n.G.vertices[n.G.edges[i].v[0]].r; graph::coordinate r2 = n.G.vertices[n.G.edges[i].v[1]].r; if (n.G.edges[i].crossings[0]) { if (r1.x < r2.x) { r1.x += n.G.L.x; } else { r2.x += n.G.L.x; } } if (n.G.edges[i].crossings[1]) { if (r1.y < r2.y) { r1.y += n.G.L.y; } else { r2.y += n.G.L.y; } } glVertex2d(r1.x, r1.y); glVertex2d(r2.x, r2.y); } glEnd(); glFlush(); } void animate::bond_broken(const network& n, const current_info& cur, unsigned i) { long double c = n.thresholds[i] - logl(fabs(cur.currents[i])); if (c > lv) { lv = c; avalanches.push_back({i}); } else { avalanches.back().push_back(i); } glClearColor(1.0f, 1.0f, 1.0f, 1.0f ); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINES); // Each set of 3 vertices form a triangle /* glColor3f(0.0f, 0.0f, 0.0f); // Blue graph::coordinate r1 = n.G.dual_vertices[n.G.dual_edges[i].v[0]].r; graph::coordinate r2 = n.G.dual_vertices[n.G.dual_edges[i].v[1]].r; if (n.G.dual_edges[i].crossings[0]) { if (r1.x < r2.x) { r1.x += n.G.L.x; } else { r2.x += n.G.L.x; } } if (n.G.dual_edges[i].crossings[1]) { if (r1.y < r2.y) { r1.y += n.G.L.y; } else { r2.y += n.G.L.y; } } glVertex2d(r1.x, r1.y); glVertex2d(r2.x, r2.y); */ bool weird = false; unsigned nw = 0; for (unsigned j = 0; j < n.G.edges.size(); j++) { bool draw = false; if (cur.currents[j] < 1e-9 && !n.backbone[j]) { glColor3f(1.0f, 0.0f, 0.0f); // Blue weird = true; nw++; draw = true; } else if (n.backbone[j] && !n.fuses[j] && j != i) { glColor3f(0.8f, 0.8f, 0.8f); // Blue draw = true; } else if (!n.fuses[j]) { glColor3f(0.0f, 0.0f, 0.0f); // Blue draw = true; } else if (i == j) { glColor3f(0.0f, 1.0f, 0.0f); // Blue draw = true; } if (cur.currents[j] > 1e-9 && n.backbone[j]) { weird = true; } if (draw) { graph::coordinate r1 = n.G.vertices[n.G.edges[j].v[0]].r; graph::coordinate r2 = n.G.vertices[n.G.edges[j].v[1]].r; if (n.G.edges[j].crossings[0]) { if (r1.x < r2.x) { r1.x += n.G.L.x; } else { r2.x += n.G.L.x; } } if (n.G.edges[j].crossings[1]) { if (r1.y < r2.y) { r1.y += n.G.L.y; } else { r2.y += n.G.L.y; } } glVertex2d(r1.x, r1.y); glVertex2d(r2.x, r2.y); } } glEnd(); glFlush(); // if (nw > 2 && !seen_guy) {seen_guy = true; getchar();} } void animate::post_fracture(network &n) { auto crack = find_minimal_crack(n, avalanches.back().back()); for (unsigned j : crack.second) { glBegin(GL_LINES); glColor3d(1.0, 0.0, 0.0); graph::coordinate r1 = n.G.dual_vertices[n.G.dual_edges[j].v[0]].r; graph::coordinate r2 = n.G.dual_vertices[n.G.dual_edges[j].v[1]].r; if (n.G.dual_edges[j].crossings[0]) { if (r1.x < r2.x) { r1.x += n.G.L.x; } else { r2.x += n.G.L.x; } } if (n.G.dual_edges[j].crossings[1]) { if (r1.y < r2.y) { r1.y += n.G.L.y; } else { r2.y += n.G.L.y; } } glVertex2d(r1.x, r1.y); glVertex2d(r2.x, r2.y); glEnd(); } glFlush(); getchar(); }