void graph_draw_rectangle(cairo_t *cr, int x, int y, int width, int height, Color lineColor, Color areaColor) { graph_set_color(cr, lineColor); graph_set_line_width(cr, 1); cairo_rectangle(cr, x, y, width, height); cairo_stroke_preserve(cr); graph_set_color(cr, areaColor); cairo_fill(cr); }
graph_t *graph_plant_path(index_t n, index_t idx) { graph_t *g = graph_alloc(n); index_t last = -1; index_t t[128]; index_t k = 0; for(index_t i = 0; i < n; i++) { if((idx >> i)&1) { if(last >= 0) graph_add_edge(g, last, i); last = i; t[k++] = i; graph_set_color(g, i, 1); } else { graph_set_color(g, i, 0); } }
Graph *graph_parse(FILE *stream) { int n, m, c, k; int i, j, d, l; Graph *g; skipws(stream); // param line if(fscanf(stream, "p %d %d %d %d\n", &n, &m, &c, &k) != 4) { // ERROR("invalid parameter line"); // fprintf(stderr, "Terminating.\n"); return NULL; } if(n < 1 || n > 1000 || m < 1 || m > (n*(n-1))/2 || c < 1 || c > n || k < 2 || k > 30) ERROR("invalid input parameters (n = %d, m = %d, c = %d, k = %d)", n, m, c, k); g = graph_alloc(n, m, c, k); // edges for(l = 0; l < m; l++) { skipws(stream); if(fscanf(stream, "e %d %d\n", &i, &j) != 2) ERROR("invalid edge line"); if(i < 1 || i > n || i == j || j < 1 || j > n) ERROR("invalid edge (i = %d, j = %d)", i, j); graph_add_edge(g, i-1, j-1); } // length backup for reduced graph addressing for(l = 0; l < n; l++) { g->fullnlens[l] = g->neighbors[l].len; } // vertex colors for(l = 0; l < n; l++) { skipws(stream); if(fscanf(stream, "c %d %d\n", &i, &d) != 2) ERROR("invalid color line"); if(i < 1 || i > n || d < 1 || d > c) ERROR("invalid color (i = %d, d = %d)", i, d); graph_set_color(g, i-1, d-1); } // motif skipws(stream); for(l = 0; l < k; l++) { if(l == 0) { if(fscanf(stream, "f %d", &d) != 1) ERROR("invalid motif line"); } else { if(fscanf(stream, " %d", &d) != 1) ERROR("invalid motif line"); } if(d < 1 || d > c) ERROR("invalid motif component (d = %d)\n", d); g->shades[d-1]++; } return g; }