public void SplitLoop(Entity ent, Point2D pt, DistancePointType pointType) { Debug.Assert(IsLoop); LinkedListNode <Entity> stop = null; switch (pointType) { case DistancePointType.Other: Entity ent1, ent2; ent.Split(pt, out ent1, out ent2); LinkedListNode <Entity> node = Entities.Find(ent); LinkedListNode <Entity> node1 = Entities.AddAfter(node, ent1); LinkedListNode <Entity> node2 = Entities.AddAfter(node1, ent2); stop = node2; Entities.Remove(node); break; case DistancePointType.Start: stop = Entities.Find(ent); break; case DistancePointType.End: stop = Entities.Find(ent).Next; break; default: Debug.Assert(false); break; } if (stop != null) { while (stop != Entities.First) { LinkedListNode <Entity> node = Entities.First; Entities.Remove(node); Entities.AddLast(node); node.Value.Reverse(); } } }
public static Trace ChooseTrace(Point2D from, LinkedList <Trace> traces) { SelectClosestTraceResult closestTraceRes = SelectClosestTrace(from, traces); // если ближайшим оказался цикл то разрезаем его по ближней точке if (closestTraceRes.Trace.IsLoop) { Entity ent = closestTraceRes.LoopDistance.Entity; Point2D closest = closestTraceRes.LoopDistance.Closest; DistancePointType pointType = closestTraceRes.LoopDistance.PointType; closestTraceRes.Trace.SplitLoop(ent, closest, pointType); } else { if (closestTraceRes.NeedReverse) { Trace reversed = closestTraceRes.Trace.CreateReversed(); traces.Find(closestTraceRes.Trace).Value = reversed; closestTraceRes.Trace = reversed; } } return(closestTraceRes.Trace); }