void PlanRep::expandLowDegreeVertices(OrthoRep &OR) { for(node v : nodes) { if (!(isVertex(v)) || expandAdj(v) != nullptr) continue; SList<edge> adjEdges; SListPure<Tuple2<node,int> > expander; node u = v; bool firstTime = true; setExpandedNode(v, v); for(adjEntry adj : v->adjEdges) { adjEdges.pushBack(adj->theEdge()); if(!firstTime) u = newNode(); setExpandedNode(u, v); typeOf(u) = Graph::lowDegreeExpander; expander.pushBack(Tuple2<node,int>(u,OR.angle(adj))); firstTime = false; } SListConstIterator<Tuple2<node,int>> itn = expander.begin().succ(); for (SListConstIterator<edge> it = adjEdges.begin().succ(); it.valid(); ++it) { // Did we allocate enough dummy nodes? OGDF_ASSERT(itn.valid()); if ((*it)->source() == v) moveSource(*it,(*itn).x1()); else moveTarget(*it,(*itn).x1()); ++itn; } adjEntry adjPrev = v->firstAdj(); itn = expander.begin(); int nBends = (*itn).x2(); for (++itn; itn.valid(); ++itn) { edge e = newEdge(adjPrev,(*itn).x1()->firstAdj()); OR.bend(e->adjSource()).set(convexBend,nBends); OR.bend(e->adjTarget()).set(reflexBend,nBends); OR.angle(adjPrev) = 1; OR.angle(e->adjSource()) = 2; OR.angle(e->adjTarget()) = 1; nBends = (*itn).x2(); typeOf(e) = association; //??? setExpansionEdge(e, 2); adjPrev = (*itn).x1()->firstAdj(); } edge e = newEdge(adjPrev,v->lastAdj()); typeOf(e) = association; //??? setExpansionEdge(e, 2); expandAdj(v) = e->adjSource(); OR.bend(e->adjSource()).set(convexBend,nBends); OR.bend(e->adjTarget()).set(reflexBend,nBends); OR.angle(adjPrev) = 1; OR.angle(e->adjSource()) = 2; OR.angle(e->adjTarget()) = 1; } }//expandlowdegreevertices