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;
}
}