|
|
|
|
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<int, System.Collections.Generic.List<IPoint>> Sort(this IPointCollection pPointCollection, IPoint pPointRelation)
|
|
|
|
|
{
|
|
|
|
|
if (pPointCollection == null)
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
int num = 1;
|
|
|
|
|
System.Collections.Generic.Dictionary<int, System.Collections.Generic.List<IPoint>> dictionary = new System.Collections.Generic.Dictionary<int, System.Collections.Generic.List<IPoint>>();
|
|
|
|
|
System.Collections.Generic.List<IPoint> list = new System.Collections.Generic.List<IPoint>();
|
|
|
|
|
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<IPoint>();
|
|
|
|
|
num++;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
list.Add(point);
|
|
|
|
|
}
|
|
|
|
|
i++;
|
|
|
|
|
}
|
|
|
|
|
int j = 1;
|
|
|
|
|
int count = dictionary.Count;
|
|
|
|
|
while (j <= count)
|
|
|
|
|
{
|
|
|
|
|
System.Collections.Generic.List<double> list2 = new System.Collections.Generic.List<double>();
|
|
|
|
|
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<IPoint> list3 = new System.Collections.Generic.List<IPoint>();
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|