using OpenNest.Geometry; using System.Collections.Generic; namespace OpenNest { public interface ISequencer { List SequenceParts(IList parts); List SequenceParts(IList parts, Vector origin); } public class SequenceByNearest : ISequencer { public List SequenceParts(IList parts) { return SequenceParts(parts, Vector.Zero); } public List SequenceParts(IList parts, Vector origin) { if (parts.Count == 0) return new List(); var dupList = new List(parts); var seqList = new List(parts.Count); var lastPart = GetClosestPart(origin, dupList); seqList.Add(lastPart); dupList.Remove(lastPart); for (int i = 0; i < parts.Count - 1 /*STOP BEFORE LAST PART*/; i++) { var nextPart = GetClosestPart(lastPart.Location, dupList); if (nextPart == null) break; seqList.Add(nextPart); dupList.Remove(nextPart); lastPart = nextPart; } return seqList; } private Part GetClosestPart(Vector pt, IList parts) { if (parts.Count == 0) return null; var closestPart = parts[0]; var closestDistance = parts[0].Location.DistanceTo(pt); for (int i = 1; i < parts.Count; i++) { var distance = parts[i].Location.DistanceTo(pt); if (distance < closestDistance) { closestPart = parts[i]; closestDistance = distance; } } return closestPart; } } }