Example #1
0
File: Tracer.cs Project: icprog/cnc
        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);
        }
Example #2
0
File: Tracer.cs Project: icprog/cnc
        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);
        }