示例#1
0
        /// <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);
                }
            }
        }