/* finishEdge: * Finish edge generation, clipping to nodes and adding arrowhead * if necessary, and adding edge labels */ static void finishEdge (graph_t* g, edge_t* e, Ppoly_t spl, int flip, pointf p, pointf q) { int j; pointf *spline = N_GNEW(spl.pn, pointf); pointf p1, q1; if (flip) { for (j = 0; j < spl.pn; j++) { spline[spl.pn - 1 - j] = spl.ps[j]; } p1 = q; q1 = p; } else { for (j = 0; j < spl.pn; j++) { spline[j] = spl.ps[j]; } p1 = p; q1 = q; } if (Verbose > 1) fprintf(stderr, "spline %s %s\n", agnameof(agtail(e)), agnameof(aghead(e))); clip_and_install(e, aghead(e), spline, spl.pn, &sinfo); free(spline); addEdgeLabels(g, e, p1, q1); }
/* makePolyline: */ static void makePolyline(graph_t* g, edge_t * e) { Ppolyline_t spl, line = ED_path(e); Ppoint_t p0, q0; p0 = line.ps[0]; q0 = line.ps[line.pn - 1]; make_polyline (line, &spl); if (Verbose > 1) fprintf(stderr, "polyline %s %s\n", agnameof(agtail(e)), agnameof(aghead(e))); clip_and_install(e, aghead(e), spl.ps, spl.pn, &sinfo); addEdgeLabels(g, e, p0, q0); }
static void initPos(Agraph_t * g) { Agnode_t *n; Agedge_t *e; double *pvec; char *p; point *sp; int pn; attrsym_t *N_pos = agfindnodeattr(g, "pos"); attrsym_t *E_pos = agfindedgeattr(g, "pos"); assert(N_pos); if (!E_pos) { if (doEdges) fprintf(stderr, "Warning: turning off doEdges, graph %s\n", g->name); doEdges = 0; } for (n = agfstnode(g); n; n = agnxtnode(g, n)) { pvec = ND_pos(n); p = agxget(n, N_pos->index); if (p[0] && (sscanf(p, "%lf,%lf", pvec, pvec + 1) == 2)) { int i; for (i = 0; i < NDIM; i++) pvec[i] = pvec[i] / PSinputscale; } else { fprintf(stderr, "could not find pos for node %s in graph %s\n", n->name, g->name); exit(1); } ND_coord_i(n).x = POINTS(ND_pos(n)[0]); ND_coord_i(n).y = POINTS(ND_pos(n)[1]); } if (doEdges) { for (n = agfstnode(g); n; n = agnxtnode(g, n)) { for (e = agfstout(g, n); e; e = agnxtout(g, e)) { if ((sp = user_spline(E_pos, e, &pn)) != 0) { clip_and_install(e, sp, pn); free(sp); } else { fprintf(stderr, "Missing edge pos for edge %s - %s in graph %s\n", n->name, e->head->name, g->name); exit(1); } } } } }
/* makeSpline: * Construct a spline connecting the endpoints of e, avoiding the npoly * obstacles obs. * The resultant spline is attached to the edge, the positions of any * edge labels are computed, and the graph's bounding box is recomputed. * * If chkPts is true, the function checks if one or both of the endpoints * is on or inside one of the obstacles and, if so, tells the shortest path * computation to ignore them. */ void makeSpline(graph_t* g, edge_t * e, Ppoly_t ** obs, int npoly, boolean chkPts) { Ppolyline_t line, spline; Pvector_t slopes[2]; int i, n_barriers; int pp, qp; Ppoint_t p, q; Pedge_t *barriers; line = ED_path(e); p = line.ps[0]; q = line.ps[line.pn - 1]; /* determine the polygons (if any) that contain the endpoints */ pp = qp = POLYID_NONE; if (chkPts) for (i = 0; i < npoly; i++) { if ((pp == POLYID_NONE) && in_poly(*obs[i], p)) pp = i; if ((qp == POLYID_NONE) && in_poly(*obs[i], q)) qp = i; } make_barriers(obs, npoly, pp, qp, &barriers, &n_barriers); slopes[0].x = slopes[0].y = 0.0; slopes[1].x = slopes[1].y = 0.0; if (Proutespline(barriers, n_barriers, line, slopes, &spline) < 0) { agerr (AGERR, "makeSpline: failed to make spline edge (%s,%s)\n", agnameof(agtail(e)), agnameof(aghead(e))); return; } /* north why did you ever use int coords */ if (Verbose > 1) fprintf(stderr, "spline %s %s\n", agnameof(agtail(e)), agnameof(aghead(e))); clip_and_install(e, aghead(e), spline.ps, spline.pn, &sinfo); free(barriers); addEdgeLabels(g, e, p, q); }
/* makeStraightEdge: * * FIX: handle ports on boundary? */ void makeStraightEdge(graph_t * g, edge_t * e, int et, splineInfo* sinfo) { pointf dumb[4]; node_t *n = agtail(e); node_t *head = aghead(e); int e_cnt = ED_count(e); int curved = (et == ET_CURVED); pointf perp; pointf del; edge_t *e0; int i, j, xstep, dx; double l_perp; pointf dumber[4]; pointf p, q; p = dumb[1] = dumb[0] = add_pointf(ND_coord(n), ED_tail_port(e).p); q = dumb[2] = dumb[3] = add_pointf(ND_coord(head), ED_head_port(e).p); if ((e_cnt == 1) || Concentrate) { if (curved) bend(dumb,get_centroid(g)); clip_and_install(e, aghead(e), dumb, 4, sinfo); addEdgeLabels(g, e, p, q); return; } e0 = e; if (APPROXEQPT(dumb[0], dumb[3], MILLIPOINT)) { /* degenerate case */ dumb[1] = dumb[0]; dumb[2] = dumb[3]; del.x = 0; del.y = 0; } else { perp.x = dumb[0].y - dumb[3].y; perp.y = dumb[3].x - dumb[0].x; l_perp = LEN(perp.x, perp.y); xstep = GD_nodesep(g->root); dx = xstep * (e_cnt - 1) / 2; dumb[1].x = dumb[0].x + (dx * perp.x) / l_perp; dumb[1].y = dumb[0].y + (dx * perp.y) / l_perp; dumb[2].x = dumb[3].x + (dx * perp.x) / l_perp; dumb[2].y = dumb[3].y + (dx * perp.y) / l_perp; del.x = -xstep * perp.x / l_perp; del.y = -xstep * perp.y / l_perp; } for (i = 0; i < e_cnt; i++) { if (aghead(e0) == head) { p = dumb[0]; q = dumb[3]; for (j = 0; j < 4; j++) { dumber[j] = dumb[j]; } } else { p = dumb[3]; q = dumb[0]; for (j = 0; j < 4; j++) { dumber[3 - j] = dumb[j]; } } if (et == ET_PLINE) { Ppoint_t pts[4]; Ppolyline_t spl, line; line.pn = 4; line.ps = pts; for (j=0; j < 4; j++) { pts[j] = dumber[j]; } make_polyline (line, &spl); clip_and_install(e0, aghead(e0), spl.ps, spl.pn, sinfo); } else clip_and_install(e0, aghead(e0), dumber, 4, sinfo); addEdgeLabels(g, e0, p, q); e0 = ED_to_virt(e0); dumb[1].x += del.x; dumb[1].y += del.y; dumb[2].x += del.x; dumb[2].y += del.y; } }
static void attachOrthoEdges (Agraph_t* g, maze* mp, int n_edges, route* route_list, splineInfo *sinfo, epair_t es[], int doLbls) { int irte = 0; int i, ipt, npts; pointf* ispline = 0; int splsz = 0; pointf p, p1, q1; route rte; segment* seg; Agedge_t* e; textlabel_t* lbl; for (; irte < n_edges; irte++) { e = es[irte].e; p1 = addPoints(ND_coord(agtail(e)), ED_tail_port(e).p); q1 = addPoints(ND_coord(aghead(e)), ED_head_port(e).p); rte = route_list[irte]; npts = 1 + 3*rte.n; if (npts > splsz) { if (ispline) free (ispline); ispline = N_GNEW(npts, pointf); splsz = npts; } seg = rte.segs; if (seg->isVert) { p.x = vtrack(seg, mp); p.y = p1.y; } else { p.y = htrack(seg, mp); p.x = p1.x; } ispline[0] = ispline[1] = p; ipt = 2; for (i = 1;i<rte.n;i++) { seg = rte.segs+i; if (seg->isVert) p.x = vtrack(seg, mp); else p.y = htrack(seg, mp); ispline[ipt+2] = ispline[ipt+1] = ispline[ipt] = p; ipt += 3; } if (seg->isVert) { p.x = vtrack(seg, mp); p.y = q1.y; } else { p.y = htrack(seg, mp); p.x = q1.x; } ispline[ipt] = ispline[ipt+1] = p; if (Verbose > 1) fprintf(stderr, "ortho %s %s\n", agnameof(agtail(e)),agnameof(aghead(e))); clip_and_install(e, aghead(e), ispline, npts, sinfo); if (doLbls && (lbl = ED_label(e)) && !lbl->set) addEdgeLabels(g, e, p1, q1); } free(ispline); }