private static Vector2 Interpolate(InterpolationMode mode, Vector2 a, Vector2 b, Vector2 c, Vector2 d, float percentaje)
        {
            switch (mode)
            {
            case InterpolationMode.Hermite: return(Utils.HermiteInterpolate(a, b, c, d, percentaje));

            case InterpolationMode.Cubic: return(Utils.CubicInterpolate(a, b, c, d, percentaje));

            default: throw new ArgumentOutOfRangeException(nameof(mode), mode, null);
            }
        }
        private static float InterpolateLength(InterpolationMode mode, IEnumerable <Edge> edges, int resolution, out float[] partialLengths)
        {
            partialLengths = edges
                             .Select(e => Enumerable
                                     .Range(0, resolution + 1)
                                     .Select(cur => Interpolate(mode, e.Prev ?? e.Begin, e.Begin, e.End, e.Next ?? e.End, 1.0f / resolution * cur))
                                     .Pairwise((v1, v2) => (v2 - v1).Length)
                                     .Sum())
                             .ToArray();

            return(partialLengths.Sum());
        }
        private static Vector2 Interpolate(InterpolationMode mode, Edge[] edges, float[] edgesLengths, float length)
        {
            var i          = 0;
            var percentaje = 1.0f;

            for (; i < edgesLengths.Length; i++)
            {
                if (length <= edgesLengths[i])
                {
                    percentaje = length / edgesLengths[i];
                    break;
                }
                length -= edgesLengths[i];
            }
            if (i == edgesLengths.Length)
            {
                i--;
            }

            return(Interpolate(mode, edges[i].Prev ?? edges[i].Begin, edges[i].Begin, edges[i].End,
                               edges[i].Next ?? edges[i].End, percentaje));
        }