PROCEDURE LocateV(v: Vertex): CARDINAL = (* Given a vertex "v" on the current meridian, returns "pos" such that "rAC[pos]" is the southernmost active curve that passes north of "v". *) BEGIN FOR pos := 0 TO nAC-1 DO IF below(v.id, rAC[i].id) THEN RETURN pos END; END; RETURN nAC END LocateV; PROCEDURE InsertC(c: Curve, pos: CARDINAL) = (* Inserts a new curve between "rAT[pos]" and "rAC[pos]", pushing up the latter up. The new curve will have the old "rAT[pos]" as its south trapezoid, and "NIL" as the north trapezoid. *) VAR i: CARDINAL; BEGIN <* ASSERT pos <= nAC *> INC(nAC); rAT[nAC] := rAT[nAC-1]; FOR i := nAC-1 TO pos+1 BY -1 DO rAC[i] := rAC[i-1]; posA[rAC[i].id] := i; rAT[i] := rAT[i-1]; END; rAC[pos] := c; posA[c.id] := pos; rAT[pos] := NIL END InsertC; PROCEDURE DeleteC(pos: CARDINAL) = (* Deletes curve "rAC[pos]" and its north trapezoid "rAT[pos+1]" from the active list, pushing everyone down. *) BEGIN <* ASSERT pos < nAC *> DEC(nAC); FOR i := pos TO nAC-1 DO rAC[i] := rAC[i+1]; posA[rAC[i].id] := i; rAT[i+1] := rAT[i+2] END; END DeleteC;