//------------------------------------------------------------------------------ private OutPtTri InsertPt(Point pt, OutPt afterOutPt) { OutPtTri result = (OutPtTri)CreateOutPt(); result.Pt = pt; result.Prev = afterOutPt; result.Next = afterOutPt.Next; result.outrec = (afterOutPt as OutPtTri).outrec; result.rightOutrec = null; afterOutPt.Next.Prev = result; afterOutPt.Next = result; return(result); }
//------------------------------------------------------------------------------ void Update(OutPt op, OutRec outrec) { OutPt op2 = op; do { OutPtTri opt = (OutPtTri)op2; if (opt.rightOutrec != null) { UpdateHelper(opt.rightOutrec, null); } opt.outrec = outrec; op2 = op2.Next; } while (op2 != op); }
//------------------------------------------------------------------------------ protected override void AddLocalMaxPoly(Active e1, Active e2, Point Pt) { OutRec outrec = e1.OutRec; //very occasionally IsStartSide(e1) is wrong so ... bool is_outer = IsStartSide(e1) || (e1.OutRec == e2.OutRec); if (is_outer) { OutRecTri ort = (OutRecTri)(e1.OutRec); if (ort.leftOutpt != null) { UpdateHelper(outrec, null); } UpdateHelper(e2.OutRec, null); } base.AddLocalMaxPoly(e1, e2, Pt); if (outrec.Pts == null) { outrec = outrec.Owner; } if (is_outer) { OutPtTri ort = (OutPtTri)outrec.Pts; OutPtTri ort2 = (OutPtTri)outrec.Pts.Next; if (ort.rightOutrec != null) { UpdateHelper(ort.rightOutrec, null); } else if (ort2.rightOutrec != null) { UpdateHelper(ort2.rightOutrec, null); } } else { Active e = GetRightAdjacentHotEdge(e2); if (e != null) { UpdateHelper(e.OutRec, LastOp); } Update(outrec.Pts, outrec); } Triangulate(outrec); }
//------------------------------------------------------------------------------ private void DisposeOutPt(OutPt op) { if (op.Prev != null) { op.Prev.Next = op.Next; } if (op.Next != null) { op.Next.Prev = op.Prev; } OutPtTri opt = (OutPtTri)op; if (opt.rightOutrec != null) { opt.rightOutrec.leftOutpt = null; } }
//------------------------------------------------------------------------------ protected override OutPt AddOutPt(Active e, Point pt) { OutPt result = base.AddOutPt(e, pt); OutPtTri opt = (OutPtTri)result; opt.outrec = e.OutRec; LastOp = result; Triangulate(e.OutRec); //Triangulate() above may assign Result.OutRecRt so ... if (IsStartSide(e) && opt.rightOutrec == null) { Active e2 = GetRightAdjacentHotEdge(e); if (e2 != null) { UpdateHelper(e2.OutRec, result); } } return(result); }
//------------------------------------------------------------------------------ private void UpdateHelper(OutRec rightOutrec, OutPt leftOutpt) { OutPtTri leftOpt = (OutPtTri)leftOutpt; OutRecTri rightOrt = (OutRecTri)rightOutrec; if (leftOpt != null && leftOpt.rightOutrec != null) { leftOpt.rightOutrec.leftOutpt = null; } if (rightOrt.leftOutpt != null) { rightOrt.leftOutpt.rightOutrec = null; } rightOrt.leftOutpt = leftOpt; if (leftOpt != null) { leftOpt.rightOutrec = rightOrt; } }