/// <summary>
        /// Simplifies the specified line string.
        /// </summary>
        /// <param name="source">The coordinates of the line string.</param>
        /// <param name="delta">The tolerance.</param>
        /// <param name="precisionModel">The precision model.</param>
        /// <returns>The list of coordinates of the simplified line string.</returns>
        /// <exception cref="System.ArgumentNullException">The source is null.</exception>
        /// <exception cref="System.ArgumentOutOfRangeException">The delta is less than or equal to 0.</exception>
        public static IReadOnlyList <Coordinate> Simplify(IReadOnlyList <Coordinate> source, Double delta, PrecisionModel precisionModel)
        {
            DouglasPeuckerAlgorithm algorithm = new DouglasPeuckerAlgorithm(source, delta, precisionModel);

            algorithm.Compute();
            return(algorithm.Result);
        }
        /// <summary>
        /// Simplifies the specified line string.
        /// </summary>
        /// <param name="source">The line string.</param>
        /// <param name="delta">The tolerance.</param>
        /// <param name="precisionModel">The precision model.</param>
        /// <returns>The simplified line string.</returns>
        /// <exception cref="System.ArgumentNullException">The source is null.</exception>
        /// <exception cref="System.ArgumentOutOfRangeException">The delta is less than or equal to 0.</exception>
        public static IBasicLineString Simplify(IBasicLineString source, Double delta, PrecisionModel precisionModel)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            DouglasPeuckerAlgorithm algorithm = new DouglasPeuckerAlgorithm(source, delta, precisionModel);

            algorithm.Compute();
            return(new BasicProxyLineString(algorithm.Result));
        }
        /// <summary>
        /// Simplifies the specified polygon.
        /// </summary>
        /// <param name="source">The polygon.</param>
        /// <param name="delta">The tolerance.</param>
        /// <param name="precisionModel">The precision model.</param>
        /// <returns>The simplified polygon.</returns>
        /// <exception cref="System.ArgumentNullException">The source is null.</exception>
        /// <exception cref="System.ArgumentOutOfRangeException">The delta is less than or equal to 0.</exception>
        public static IBasicPolygon Simplify(IBasicPolygon source, Double delta, PrecisionModel precisionModel)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            DouglasPeuckerAlgorithm algorithm = new DouglasPeuckerAlgorithm(source.Shell, delta, precisionModel);

            algorithm.Compute();
            IReadOnlyList <Coordinate>         shell = algorithm.Result;
            List <IReadOnlyList <Coordinate> > holes = new List <IReadOnlyList <Coordinate> >(source.HoleCount);

            foreach (IReadOnlyList <Coordinate> hole in source.Holes)
            {
                algorithm = new DouglasPeuckerAlgorithm(hole, delta, precisionModel);
                algorithm.Compute();
                holes.Add(algorithm.Result);
            }

            return(new BasicProxyPolygon(shell, holes));
        }