Edges * Voronoi::getEdges(Vertices *v, int w, int h) { places = v; width = w; height = h; root = 0; if (!edges) edges = new Edges(); else { for (Vertices::iterator i = points.begin(); i != points.end(); ++i) delete (*i); for(Edges::iterator i = edges->begin(); i != edges->end(); ++i) delete (*i); points.clear(); edges->clear(); } for (Vertices::iterator i = places->begin(); i != places->end(); ++i) { queue.push(new VEvent(*i, true)); } VEvent *e; while (!queue.empty()) { e = queue.top(); queue.pop(); ly = e->point->y; if (deleted.find(e) != deleted.end()) { delete(e); deleted.erase(e); continue; } if (e->pe) insertParabola(e->point); else removeParabola(e); delete(e); } finishEdge(root); for (Edges::iterator i = edges->begin(); i != edges->end(); ++i) { if ((*i)->neighbour) { (*i)->start = (*i)->neighbour->end; delete (*i)->neighbour; } } return edges; }
void Voronoi::finishEdge(VParabola *n) { if (n->isLeaf) { delete n; return; } double mx; if (n->edge->direction->x > 0.0) mx = std::max(width, n->edge->start->x + 10); else mx = std::min(0.0, n->edge->start->x - 10); VPoint *end = new VPoint(mx, mx * n->edge->f + n->edge->g); n->edge->end = end; points.push_back(end); finishEdge(n->left()); finishEdge(n->right()); delete n; }
/* genroute: * Generate splines for e and cohorts. * Edges go from s to t. * Return 0 on success. */ static int genroute(graph_t* g, tripoly_t * trip, int s, int t, edge_t * e, int doPolyline) { pointf eps[2]; Pvector_t evs[2]; pointf **cpts; /* lists of control points */ Ppoly_t poly; Ppolyline_t pl, spl; int i, j; Ppolyline_t mmpl; Pedge_t *medges = N_GNEW(trip->poly.pn, Pedge_t); int pn; int mult = ED_count(e); node_t* head = aghead(e); eps[0].x = trip->poly.ps[s].x, eps[0].y = trip->poly.ps[s].y; eps[1].x = trip->poly.ps[t].x, eps[1].y = trip->poly.ps[t].y; Pshortestpath(&(trip->poly), eps, &pl); if (pl.pn == 2) { makeStraightEdge(agraphof(head), e, doPolyline); return 0; } evs[0].x = evs[0].y = 0; evs[1].x = evs[1].y = 0; if ((mult == 1) || Concentrate) { poly = trip->poly; for (j = 0; j < poly.pn; j++) { medges[j].a = poly.ps[j]; medges[j].b = poly.ps[(j + 1) % poly.pn]; } tweakPath (poly, s, t, pl); Proutespline(medges, poly.pn, pl, evs, &spl); finishEdge (g, e, spl, aghead(e) != head, eps[0], eps[1]); free(medges); return 0; } pn = 2 * (pl.pn - 1); cpts = N_NEW(pl.pn - 2, pointf *); for (i = 0; i < pl.pn - 2; i++) { cpts[i] = mkCtrlPts(t, mult+1, pl.ps[i], pl.ps[i + 1], pl.ps[i + 2], trip); if (!cpts[i]) { agerr(AGWARN, "Could not create control points for multiple spline for edge (%s,%s)\n", agnameof(agtail(e)), agnameof(aghead(e))); return 1; } } poly.ps = N_GNEW(pn, pointf); poly.pn = pn; for (i = 0; i < mult; i++) { poly.ps[0] = eps[0]; for (j = 1; j < pl.pn - 1; j++) { poly.ps[j] = cpts[j - 1][i]; } poly.ps[pl.pn - 1] = eps[1]; for (j = 1; j < pl.pn - 1; j++) { poly.ps[pn - j] = cpts[j - 1][i + 1]; } Pshortestpath(&poly, eps, &mmpl); if (doPolyline) { make_polyline (mmpl, &spl); } else { for (j = 0; j < poly.pn; j++) { medges[j].a = poly.ps[j]; medges[j].b = poly.ps[(j + 1) % poly.pn]; } tweakPath (poly, 0, pl.pn-1, mmpl); Proutespline(medges, poly.pn, mmpl, evs, &spl); } finishEdge (g, e, spl, aghead(e) != head, eps[0], eps[1]); e = ED_to_virt(e); } for (i = 0; i < pl.pn - 2; i++) free(cpts[i]); free(cpts); free(medges); free(poly.ps); return 0; }