/// <summary> /// 优化轮廓线 /// https://www.cnblogs.com/Hichy/p/9149055.html 使用Douglas-Peucker 轨迹压缩算法 /// </summary> /// <param name="listContour"></param> /// <returns></returns> private static void OptimizationContour(List <Double2> listContour, int startIndex, int endIndex, float limitDistance, ref List <int> listIndex) { // 首先判断合法性。 if (listContour == null || listContour.Count < 2 || startIndex < 0 || endIndex >= listContour.Count || endIndex <= startIndex) { return; } if (listIndex == null) { listIndex = new List <int>(); } //建立线段 double maxDistance = 0; int index = 0; LineSegment2D line = new LineSegment2D(listContour[startIndex], listContour[endIndex]); for (int i = startIndex + 1; i < endIndex; i++) { double distance = line.CalcDistance(listContour[i]); if (distance > maxDistance) { maxDistance = distance; index = i; } } if (maxDistance > limitDistance) { // 分成2段处理 OptimizationContour(listContour, startIndex, index, limitDistance, ref listIndex); OptimizationContour(listContour, index, endIndex, limitDistance, ref listIndex); } else { if (listIndex.Contains(startIndex) == false) { listIndex.Add(startIndex); } if (listIndex.Contains(endIndex) == false) { listIndex.Add(endIndex); } } }