//------------------------------------------------------------------------------ double Area(OutRec outRec) { OutPt op = outRec.Pts; if (op == null) return 0; double a = 0; do { a = a + (double)(op.Pt.X + op.Prev.Pt.X) * (double)(op.Prev.Pt.Y - op.Pt.Y); op = op.Next; } while (op != outRec.Pts); return a/2; }
//---------------------------------------------------------------------- private void FixupFirstLefts2(OutRec OldOutRec, OutRec NewOutRec) { foreach (OutRec outRec in m_PolyOuts) if (outRec.FirstLeft == OldOutRec) outRec.FirstLeft = NewOutRec; }
//------------------------------------------------------------------------------ private void UpdateOutPtIdxs(OutRec outrec) { OutPt op = outrec.Pts; do { op.Idx = outrec.Idx; op = op.Prev; } while(op != outrec.Pts); }
//------------------------------------------------------------------------------ private void FixupOutPolygon(OutRec outRec) { //FixupOutPolygon() - removes duplicate points and simplifies consecutive //parallel edges by removing the middle vertex. OutPt lastOK = null; outRec.BottomPt = null; OutPt pp = outRec.Pts; for (;;) { if (pp.Prev == pp || pp.Prev == pp.Next) { DisposeOutPts(pp); outRec.Pts = null; return; } //test for duplicate points and collinear edges ... if ((pp.Pt == pp.Next.Pt) || (pp.Pt == pp.Prev.Pt) || (SlopesEqual(pp.Prev.Pt, pp.Pt, pp.Next.Pt, m_UseFullRange) && (!PreserveCollinear || !Pt2IsBetweenPt1AndPt3(pp.Prev.Pt, pp.Pt, pp.Next.Pt)))) { lastOK = null; pp.Prev.Next = pp.Next; pp.Next.Prev = pp.Prev; pp = pp.Prev; } else if (pp == lastOK) break; else { if (lastOK == null) lastOK = pp; pp = pp.Next; } } outRec.Pts = pp; }
//---------------------------------------------------------------------- private void FixupFirstLefts1(OutRec OldOutRec, OutRec NewOutRec) { for (int i = 0; i < m_PolyOuts.Count; i++) { OutRec outRec = m_PolyOuts[i]; if (outRec.Pts != null && outRec.FirstLeft == OldOutRec) { if (Poly2ContainsPoly1(outRec.Pts, NewOutRec.Pts, m_UseFullRange)) outRec.FirstLeft = NewOutRec; } } }
//------------------------------------------------------------------------------ bool Param1RightOfParam2(OutRec outRec1, OutRec outRec2) { do { outRec1 = outRec1.FirstLeft; if (outRec1 == outRec2) return true; } while (outRec1 != null); return false; }
//------------------------------------------------------------------------------ private OutRec GetLowermostRec(OutRec outRec1, OutRec outRec2) { //work out which polygon fragment has the correct hole state ... if (outRec1.BottomPt == null) outRec1.BottomPt = GetBottomPt(outRec1.Pts); if (outRec2.BottomPt == null) outRec2.BottomPt = GetBottomPt(outRec2.Pts); OutPt bPt1 = outRec1.BottomPt; OutPt bPt2 = outRec2.BottomPt; if (bPt1.Pt.Y > bPt2.Pt.Y) return outRec1; else if (bPt1.Pt.Y < bPt2.Pt.Y) return outRec2; else if (bPt1.Pt.X < bPt2.Pt.X) return outRec1; else if (bPt1.Pt.X > bPt2.Pt.X) return outRec2; else if (bPt1.Next == bPt1) return outRec2; else if (bPt2.Next == bPt2) return outRec1; else if (FirstIsBottomPt(bPt1, bPt2)) return outRec1; else return outRec2; }
//------------------------------------------------------------------------------ private void SetHoleState(TEdge e, OutRec outRec) { bool isHole = false; TEdge e2 = e.PrevInAEL; while (e2 != null) { if (e2.OutIdx >= 0) { isHole = !isHole; if (outRec.FirstLeft == null) outRec.FirstLeft = m_PolyOuts[e2.OutIdx]; } e2 = e2.PrevInAEL; } if (isHole) outRec.IsHole = true; }
//------------------------------------------------------------------------------ private OutRec CreateOutRec() { OutRec result = new OutRec(); result.Idx = Unassigned; result.IsHole = false; result.IsOpen = false; result.FirstLeft = null; result.Pts = null; result.BottomPt = null; result.PolyNode = null; m_PolyOuts.Add(result); result.Idx = m_PolyOuts.Count - 1; return result; }
//------------------------------------------------------------------------------ internal void FixHoleLinkage(OutRec outRec) { //skip if an outermost polygon or //already already points to the correct FirstLeft ... if (outRec.FirstLeft == null || (outRec.IsHole != outRec.FirstLeft.IsHole && outRec.FirstLeft.Pts != null)) return; OutRec orfl = outRec.FirstLeft; while (orfl != null && ((orfl.IsHole == outRec.IsHole) || orfl.Pts == null)) orfl = orfl.FirstLeft; outRec.FirstLeft = orfl; }