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); } }
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); } }