Exemple #1
0
        public static void segs_Remove(List <seg3d> segs, seg3d p)
        {
            List <seg3d> rm  = new List <seg3d>();
            List <seg3d> add = new List <seg3d>();

            foreach (seg3d q in segs)
            {
                //List<seg3d> onlyp = new List<seg3d>();
                List <seg3d> onlyq = new List <seg3d>();
                //List<seg3d> common = new List<seg3d>();
                SegmentsOverlap3d so = ut.CalcSegmentsOverlap3d(p, q, null, onlyq, null);
                Debug.Assert(
                    (so == SegmentsOverlap3d.SameSegment) ||
                    (so == SegmentsOverlap3d.None) ||
                    (so == SegmentsOverlap3d.OppositeDirection) ||
                    (so == SegmentsOverlap3d.P_On_Q) ||
                    (so == SegmentsOverlap3d.Q_On_P) ||
                    (so == SegmentsOverlap3d.Overlap)
                    );
                switch (so)
                {
                case SegmentsOverlap3d.SameSegment:
                {
                    rm.Add(q);
                    break;
                }

                case SegmentsOverlap3d.None:
                {
                    break;
                }

                case SegmentsOverlap3d.OppositeDirection:
                {
                    break;
                }

                case SegmentsOverlap3d.P_On_Q:
                case SegmentsOverlap3d.Q_On_P:
                case SegmentsOverlap3d.Overlap:
                {
                    rm.Add(q);
                    foreach (seg3d ns in onlyq)
                    {
                        segs_Add(add, ns);
                    }
                    break;
                }
                }
            }
            foreach (seg3d s in rm)
            {
                segs.Remove(s);
            }
            foreach (seg3d s in add)
            {
                segs.Add(s);
            }
        }
Exemple #2
0
        public static void segs_Add(List <seg3d> segs, seg3d p, int level)
        {
            List <seg3d> add = new List <seg3d>();

            // start with the whole seg.  we'll remove pieces of it wherever overlaps occur
            add.Add(p);
            foreach (seg3d q in segs)
            {
                //List<seg3d> onlyp = new List<seg3d>();
                //List<seg3d> onlyq = new List<seg3d>();
                List <seg3d>      common = new List <seg3d>();
                SegmentsOverlap3d so     = ut.CalcSegmentsOverlap3d(p, q, null, null, common);
                Debug.Assert(
                    (so == SegmentsOverlap3d.SameSegment) ||
                    (so == SegmentsOverlap3d.None) ||
                    (so == SegmentsOverlap3d.OppositeDirection) ||
                    (so == SegmentsOverlap3d.P_On_Q) ||
                    (so == SegmentsOverlap3d.Q_On_P) ||
                    (so == SegmentsOverlap3d.Overlap)
                    );
                switch (so)
                {
                case SegmentsOverlap3d.SameSegment:
                {
                    segs_Remove(add, p);
                    break;
                }

                case SegmentsOverlap3d.None:
                {
                    break;
                }

                case SegmentsOverlap3d.OppositeDirection:
                {
                    break;
                }

                case SegmentsOverlap3d.P_On_Q:
                case SegmentsOverlap3d.Q_On_P:
                case SegmentsOverlap3d.Overlap:
                {
                    foreach (seg3d ns in common)
                    {
                        segs_Remove(add, ns);
                    }
                    break;
                }
                }

                if (add.Count == 0)
                {
                    // nothing left.  we must be done.
                    return;
                }
            }

            foreach (seg3d s in add)
            {
                segs.Add(s);
            }
        }