//------------------------------------------------------------------------------ private bool JoinPoints(JoinRec j, out OutPt p1, out OutPt p2) { p1 = null; p2 = null; OutRec outRec1 = m_PolyOuts[j.poly1Idx]; OutRec outRec2 = m_PolyOuts[j.poly2Idx]; if (outRec1 == null || outRec2 == null) return false; OutPt pp1a = outRec1.pts; OutPt pp2a = outRec2.pts; IntPoint pt1 = j.pt2a, pt2 = j.pt2b; IntPoint pt3 = j.pt1a, pt4 = j.pt1b; if (!FindSegment(ref pp1a, m_UseFullRange, ref pt1, ref pt2)) return false; if (outRec1 == outRec2) { //we're searching the same polygon for overlapping segments so //segment 2 mustn't be the same as segment 1 ... pp2a = pp1a.next; if (!FindSegment(ref pp2a, m_UseFullRange, ref pt3, ref pt4) || (pp2a == pp1a)) return false; } else if (!FindSegment(ref pp2a, m_UseFullRange, ref pt3, ref pt4)) return false; if (!GetOverlapSegment(pt1, pt2, pt3, pt4, ref pt1, ref pt2)) return false; OutPt p3, p4, prev = pp1a.prev; //get p1 & p2 polypts - the overlap start & endpoints on poly1 if (PointsEqual(pp1a.pt, pt1)) p1 = pp1a; else if (PointsEqual(prev.pt, pt1)) p1 = prev; else p1 = InsertPolyPtBetween(pp1a, prev, pt1); if (PointsEqual(pp1a.pt, pt2)) p2 = pp1a; else if (PointsEqual(prev.pt, pt2)) p2 = prev; else if ((p1 == pp1a) || (p1 == prev)) p2 = InsertPolyPtBetween(pp1a, prev, pt2); else if (Pt3IsBetweenPt1AndPt2(pp1a.pt, p1.pt, pt2)) p2 = InsertPolyPtBetween(pp1a, p1, pt2); else p2 = InsertPolyPtBetween(p1, prev, pt2); //get p3 & p4 polypts - the overlap start & endpoints on poly2 prev = pp2a.prev; if (PointsEqual(pp2a.pt, pt1)) p3 = pp2a; else if (PointsEqual(prev.pt, pt1)) p3 = prev; else p3 = InsertPolyPtBetween(pp2a, prev, pt1); if (PointsEqual(pp2a.pt, pt2)) p4 = pp2a; else if (PointsEqual(prev.pt, pt2)) p4 = prev; else if ((p3 == pp2a) || (p3 == prev)) p4 = InsertPolyPtBetween(pp2a, prev, pt2); else if (Pt3IsBetweenPt1AndPt2(pp2a.pt, p3.pt, pt2)) p4 = InsertPolyPtBetween(pp2a, p3, pt2); else p4 = InsertPolyPtBetween(p3, prev, pt2); //p1.pt == p3.pt and p2.pt == p4.pt so join p1 to p3 and p2 to p4 ... if (p1.next == p2 && p3.prev == p4) { p1.next = p3; p3.prev = p1; p2.prev = p4; p4.next = p2; return true; } else if (p1.prev == p2 && p3.next == p4) { p1.prev = p3; p3.next = p1; p2.next = p4; p4.prev = p2; return true; } else return false; //an orientation is probably wrong }
//---------------------------------------------------------------------- private void FixupJoinRecs(JoinRec j, OutPt pt, int startIdx) { for (int k = startIdx; k < m_Joins.Count; k++) { JoinRec j2 = m_Joins[k]; if (j2.poly1Idx == j.poly1Idx && PointIsVertex(j2.pt1a, pt)) j2.poly1Idx = j.poly2Idx; if (j2.poly2Idx == j.poly1Idx && PointIsVertex(j2.pt2a, pt)) j2.poly2Idx = j.poly2Idx; } }
//------------------------------------------------------------------------------ private void AddJoin(TEdge e1, TEdge e2, int e1OutIdx, int e2OutIdx) { JoinRec jr = new JoinRec(); if (e1OutIdx >= 0) jr.poly1Idx = e1OutIdx; else jr.poly1Idx = e1.outIdx; jr.pt1a = new IntPoint(e1.xcurr, e1.ycurr); jr.pt1b = new IntPoint(e1.xtop, e1.ytop); if (e2OutIdx >= 0) jr.poly2Idx = e2OutIdx; else jr.poly2Idx = e2.outIdx; jr.pt2a = new IntPoint(e2.xcurr, e2.ycurr); jr.pt2b = new IntPoint(e2.xtop, e2.ytop); m_Joins.Add(jr); }