private static SelectClosestTraceResult SelectClosestTrace(Point2D from, LinkedList <Trace> traces) { SelectClosestTraceResult bestResult = new SelectClosestTraceResult(); double minDistance = double.MaxValue; foreach (Trace trace in traces) { if (trace.IsLoop) { LoopDistanceResult distToLoop = DistanceToLoop(from, trace); if (distToLoop.Value < minDistance) { minDistance = distToLoop.Value; bestResult.LoopDistance = distToLoop; bestResult.Trace = trace; bestResult.NeedReverse = false; } } else { double tostart = Utils.Distance(trace.Entities.First.Value.Info.Start, from); double toend = Utils.Distance(trace.Entities.Last.Value.Info.End, from); double distance = Math.Min(tostart, toend); bool needReverse = toend < tostart; if (distance < minDistance) { minDistance = distance; bestResult.Trace = trace; bestResult.NeedReverse = needReverse; } } } return(bestResult); }
private static LoopDistanceResult DistanceToLoop(Point2D from, Trace trace) { LoopDistanceResult minDist = new LoopDistanceResult(); minDist.Value = double.MaxValue; foreach (Entity ent in trace.Entities) { DistanceResult dist = ent.Distance(from); if (minDist.Value > dist.Value) { minDist.Value = dist.Value; minDist.Entity = ent; minDist.Closest = dist.Closest; minDist.PointType = dist.PointType; } } return(minDist); }