void CDelaunay::splice(EdgePointer a, EdgePointer b) { EdgePointer alpha, beta, temp; alpha = (EdgePointer) rot(onext(a)); beta = (EdgePointer) rot(onext(b)); temp = onext(alpha); onext(alpha) = onext(beta); onext(beta) = temp; temp = onext(a); onext(a) = onext(b); onext(b) = temp; }
// Quad-edge manipulation primitives EdgePointer CDelaunay::makeEdge(SitePointer origin, SitePointer destination) { EdgePointer temp, ans; temp = allocEdge(); ans = temp; onext(temp) = ans; orig(temp) = origin; onext(++temp) = (EdgePointer) (ans + 3); onext(++temp) = (EdgePointer) (ans + 2); orig(temp) = destination; onext(++temp) = (EdgePointer) (ans + 1); return(ans); }
EdgePointer CDelaunay::allocEdge() { EdgePointer ans; if (availEdge == NYL) { ans = nextEdge, nextEdge += 4; } else { ans = availEdge, availEdge = onext(availEdge); } return(ans); }
EdgePointer CDelaunay::consolidateEdges() { EdgePointer e; int i,j; while (availEdge != NYL) { nextEdge -= 4; e = availEdge; availEdge = onext(availEdge); if (e==nextEdge) { continue; // the one deleted was the last one anyway } if ((oneBndryEdge&~3) == nextEdge) { oneBndryEdge = (EdgePointer) (e | (oneBndryEdge&3)); } for (i=0,j=3; i<4; i++,j=rot(j)) { onext(e+i) = onext(nextEdge+i); onext(rot(onext(e+i))) = (EdgePointer) (e+j); } } return nextEdge; }
void CDelaunay::freeEdge(EdgePointer e) { e ^= e & 3; onext(e) = availEdge; availEdge = e; }
Edge_Record Edge_Record::lprev() const { return onext().sym(); }