Example #1
0
        public static void SplitAll(Poly2dWithExtraStuff p1, Poly2dWithExtraStuff p2)
        {
            p1.info = new List <seginfo2d>();

            if (!BoundingBox2d.intersect(p1.bb, p2.bb))
            {
                foreach (seg2d s1 in p1.segs)
                {
                    p1.info.Add(new seginfo2d(s1, SegmentInfo.Outside));
                }
            }
            else
            {
                foreach (seg2d s1 in p1.segs)
                {
                    SplitSegment(p1.info, s1, p2);
                }
            }
        }
Example #2
0
 public seginfo2d(seg2d s, Poly2dWithExtraStuff p)
 {
     seg  = s;
     info = p.GetInfo(s);
 }
Example #3
0
 public ppi2d(List <xy> m1, List <List <xy> > loops2)
 {
     p1 = new Poly2dWithExtraStuff(m1);
     p2 = new Poly2dWithExtraStuff(loops2);
     calc();
 }
Example #4
0
 public static void SplitSegment(List <seginfo2d> result, seg2d s1, Poly2dWithExtraStuff p2)
 {
     foreach (seg2d s2 in p2.segs)
     {
         if (fp.eq_inches(s1.a, s2.a) && fp.eq_inches(s1.b, s2.b))
         {
             // same segment.
             result.Add(new seginfo2d(s1, SegmentInfo.Same));
             // nothing else can happen.  stop now.
             return;
         }
         else if (fp.eq_inches(s1.a, s2.b) && fp.eq_inches(s1.b, s2.a))
         {
             // same segment, but reversed
             result.Add(new seginfo2d(s1, SegmentInfo.Opposite));
             // nothing else can happen.  stop now.
             return;
         }
         else
         {
             xy q1;
             xy q2;
             SegIntersection si = ut.GetSegIntersection(s1, s2, out q1, out q2);
             if (si == SegIntersection.Point)
             {
                 if (
                     fp.eq_inches(q1, s1.a) ||
                     fp.eq_inches(q1, s1.b)
                     )
                 {
                     // an endpoint.  this doesn't count as a hit.
                     // ignore this
                 }
                 else
                 {
                     SplitSegment(result, new seg2d(s1.a, q1), p2);
                     SplitSegment(result, new seg2d(q1, s1.b), p2);
                     return;
                 }
             }
             else if (si == SegIntersection.Overlap)
             {
                 SegmentInfo dir;
                 xy          v1 = (s1.b - s1.a).normalize_in_place();
                 xy          v2 = (s2.b - s2.a).normalize_in_place();
                 if (fp.eq_unitvec(v1, v2))
                 {
                     dir = SegmentInfo.Same;
                 }
                 else
                 {
                     dir = SegmentInfo.Opposite;
                 }
                 if (
                     fp.eq_inches(s1.a, q1) &&
                     fp.eq_inches(s1.b, q2)
                     )
                 {
                     result.Add(new seginfo2d(s1, dir));
                 }
                 else if (
                     fp.eq_inches(s1.a, q2) &&
                     fp.eq_inches(s1.b, q1)
                     )
                 {
                     result.Add(new seginfo2d(s1, dir));
                 }
                 else if (fp.eq_inches(s1.a, q1))
                 {
                     result.Add(new seginfo2d(new seg2d(s1.a, q2), dir));
                     SplitSegment(result, new seg2d(q2, s1.b), p2);
                 }
                 else if (fp.eq_inches(s1.a, q2))
                 {
                     result.Add(new seginfo2d(new seg2d(s1.a, q1), dir));
                     SplitSegment(result, new seg2d(q1, s1.b), p2);
                 }
                 else if (fp.eq_inches(s1.b, q1))
                 {
                     SplitSegment(result, new seg2d(s1.a, q2), p2);
                     result.Add(new seginfo2d(new seg2d(q2, s1.b), dir));
                 }
                 else if (fp.eq_inches(s1.b, q2))
                 {
                     SplitSegment(result, new seg2d(s1.a, q1), p2);
                     result.Add(new seginfo2d(new seg2d(q1, s1.b), dir));
                 }
                 else
                 {
                     // both q1 and q2 are somewhere inside s1
                     xy z1 = q1 - s1.a;
                     xy z2 = q2 - s1.a;
                     if (z1.magnitude_squared() < z2.magnitude_squared())
                     {
                         // q1 is closer
                         SplitSegment(result, new seg2d(s1.a, q1), p2);
                         result.Add(new seginfo2d(new seg2d(q1, q2), dir));
                         SplitSegment(result, new seg2d(q2, s1.b), p2);
                     }
                     else
                     {
                         // q2 is closer
                         SplitSegment(result, new seg2d(s1.a, q2), p2);
                         result.Add(new seginfo2d(new seg2d(q2, q1), dir));
                         SplitSegment(result, new seg2d(q1, s1.b), p2);
                     }
                 }
                 return;
             }
         }
     }
     result.Add(new seginfo2d(s1, p2));
 }