Esempio n. 1
0
        private bool JoinPoints(JoinRec j, out OutPt p1, out OutPt p2)
        {
            Contract.Requires(j != null);
            Contract.Requires(j.Poly1Idx >= 0 && j.Poly1Idx < _polyOuts.Count);
            Contract.Requires(j.Poly2Idx >= 0 && j.Poly2Idx < _polyOuts.Count);

            p1 = null;
            p2 = null;
            var outRec1 = _polyOuts[j.Poly1Idx];
            var outRec2 = _polyOuts[j.Poly2Idx];
            if (outRec1 == null || outRec2 == null)
                return false;
            var pp1A = outRec1.Pts;
            var pp2A = outRec2.Pts;
            IntPoint pt1 = j.Pt2A, pt2 = j.Pt2B;
            IntPoint pt3 = j.Pt1A, pt4 = j.Pt1B;
            if (!FindSegment(ref pp1A, 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, ref pt3, ref pt4) || (pp2A == pp1A))
                    return false;
            }
            else if (!FindSegment(ref pp2A, ref pt3, ref pt4))
                return false;

            if (!GetOverlapSegment(pt1, pt2, pt3, pt4, out pt1, out pt2))
                return false;

            OutPt p3, p4, prev = pp1A.Prev;
            //get p1 & p2 polypts - the overlap start & endpoints on poly1
            if (pp1A.Pt.Equals(pt1))
                p1 = pp1A;
            else if (prev.Pt.Equals(pt1))
                p1 = prev;
            else
                p1 = InsertPolyPtBetween(pp1A, prev, pt1);

            if (pp1A.Pt.Equals(pt2))
                p2 = pp1A;
            else if (prev.Pt.Equals(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 (pp2A.Pt.Equals(pt1))
                p3 = pp2A;
            else if (prev.Pt.Equals(pt1))
                p3 = prev;
            else
                p3 = InsertPolyPtBetween(pp2A, prev, pt1);

            if (pp2A.Pt.Equals(pt2))
                p4 = pp2A;
            else if (prev.Pt.Equals(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
        }
Esempio n. 2
0
        private void AddJoin(TEdge e1, TEdge e2, int e1OutIdx, int e2OutIdx)
        {
            Contract.Requires(e1 != null);
            Contract.Requires(e2 != null);

            var jr = new JoinRec {
                Poly1Idx = e1OutIdx >= 0 ? e1OutIdx : e1.OutIdx,
                Pt1A = new IntPoint(e1.XCurr, e1.YCurr),
                Pt1B = new IntPoint(e1.XTop, e1.YTop),
                Poly2Idx = e2OutIdx >= 0 ? e2OutIdx : e2.OutIdx,
                Pt2A = new IntPoint(e2.XCurr, e2.YCurr),
                Pt2B = new IntPoint(e2.XTop, e2.YTop)
            };
            _joins.Add(jr);
        }
Esempio n. 3
0
 private void FixupJoinRecs(JoinRec j, OutPt pt, int startIdx)
 {
     for (var k = startIdx; k < _joins.Count; k++)
     {
         var j2 = _joins[k];
         if (j2.Poly1Idx == j.Poly1Idx && InternalHelpers.PointIsVertex(j2.Pt1A, pt))
             j2.Poly1Idx = j.Poly2Idx;
         if (j2.Poly2Idx == j.Poly1Idx && InternalHelpers.PointIsVertex(j2.Pt2A, pt))
             j2.Poly2Idx = j.Poly2Idx;
     }
 }