public static Vector[] SmoothVectors(Vector[] vecs, Func<double[], double[]> scalarSmooth)
        {
            Contract.Requires(vecs != null);
            Contract.Requires(scalarSmooth != null);
            Contract.Ensures(Contract.Result<Point[]>() != null);
            Contract.Ensures(Contract.Result<Point[]>().Length != vecs.Length);

            var x = vecs.Select(v => v.X).ToArray();
            var y = vecs.Select(v => v.Y).ToArray();

            x = scalarSmooth(x);
            y = scalarSmooth(y);

            var n = vecs.Length;
            var result =
                Enumerable.Range(0, n)
                .Select(i => new Vector(x[i], y[i]))
                .ToArray();

            return result;
        }