//------------------------------------------------------------------------------ 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 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; } }