using ESRI.ArcGIS.Geometry; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace KGIS.PlatformPlugin.Commands.Tools.TraceTool { public static class PointCollectionEx { public static System.Collections.Generic.Dictionary> Sort(this IPointCollection pPointCollection, IPoint pPointRelation) { if (pPointCollection == null) { return null; } int num = 1; System.Collections.Generic.Dictionary> dictionary = new System.Collections.Generic.Dictionary>(); System.Collections.Generic.List list = new System.Collections.Generic.List(); int i = 0; int pointCount = pPointCollection.PointCount; while (i < pointCount) { IPoint point = pPointCollection.get_Point(i); if (list.Count > 0 && point.IsSamePoint(list[0], 0.001)) { dictionary.Add(num, list); list = new System.Collections.Generic.List(); num++; } else { list.Add(point); } i++; } int j = 1; int count = dictionary.Count; while (j <= count) { System.Collections.Generic.List list2 = new System.Collections.Generic.List(); list = dictionary[j]; int num2 = 0; while (list.Count > num2) { IPoint other = list[num2]; double item = (pPointRelation as IProximityOperator).ReturnDistance(other); list2.Add(item); num2++; } int num3 = list2.IndexOf(list2.Min()); System.Collections.Generic.List list3 = new System.Collections.Generic.List(); int k = 0; int count2 = list.Count; while (k < count2) { int index; if (k + num3 >= count2) { index = k + num3 - count2; } else { index = k + num3; } list3.Add(list[index]); k++; } dictionary.Remove(j); dictionary.Add(j, list3); j++; } return dictionary; } public static int GetLongestLineSegmentStartPoint(this IPointCollection pPointCollection) { if (pPointCollection != null && pPointCollection.PointCount >= 2) { int result = -1; double num = 0.0; int i = 0; int pointCount = pPointCollection.PointCount; while (i < pointCount - 1) { IProximityOperator proximityOperator = pPointCollection.get_Point(i) as IProximityOperator; IPoint other = pPointCollection.get_Point(i + 1); double num2 = proximityOperator.ReturnDistance(other); if (num < num2) { num = num2; result = i; } i++; } return result; } return -1; } } }