Accord.Math.Geometry.ClosePointsMergingOptimizer.OptimizeShape C# (CSharp) Method

OptimizeShape() public method

Optimize specified shape.
public OptimizeShape ( List shape ) : List
shape List Shape to be optimized.
return List
        public List<IntPoint> OptimizeShape( List<IntPoint> shape )
        {
            // optimized shape
            List<IntPoint> optimizedShape = new List<IntPoint>( );

            if ( shape.Count <= 3 )
            {
                // do nothing if shape has 3 points or less
                optimizedShape.AddRange( shape );
            }
            else
            {
                float distance = 0;

                // add first point to the new shape
                optimizedShape.Add( shape[0] );
                int pointsInOptimizedHull = 1;

                for ( int i = 1, n = shape.Count; i < n; i++ )
                {
                    distance = optimizedShape[pointsInOptimizedHull - 1].DistanceTo( shape[i] );

                    if ( ( distance <= maxDistanceToMerge ) &&
                         ( pointsInOptimizedHull + ( n - i ) > 3 ) )
                    {
                        // merge
                        optimizedShape[pointsInOptimizedHull - 1] = ( optimizedShape[pointsInOptimizedHull - 1] + shape[i] ) / 2;
                    }
                    else
                    {
                        optimizedShape.Add( shape[i] );
                        pointsInOptimizedHull++;
                    }
                }

                if ( pointsInOptimizedHull > 3 )
                {
                    // check the last and first points
                    distance = optimizedShape[pointsInOptimizedHull - 1].DistanceTo( optimizedShape[0] );

                    if ( distance <= maxDistanceToMerge )
                    {
                        // merge
                        optimizedShape[0] = ( optimizedShape[pointsInOptimizedHull - 1] + optimizedShape[0] ) / 2;
                        optimizedShape.RemoveAt( pointsInOptimizedHull - 1 );
                    }
                }
            }

            return optimizedShape;
        }
    }