public static List <PolyLine> ToCache(PolyLine source, PolyLine target, double speed, IEasing easing, bool interpolateXAxis = true)
        {
            int    steps = (int)(1 / speed);
            double p     = speed;
            var    cache = new List <PolyLine>(steps);

            for (int i = 0; i < steps; i++)
            {
                var clone = source.Clone();
                var easeP = easing.Ease(p);

                To(clone, target, easeP, interpolateXAxis);

                p += speed;

                cache.Add(clone);
            }

            return(cache);
        }
        public static void To(PolyLine source, PolyLine target, double progress, bool interpolateXAxis)
        {
            if (source.XValues.Count < target.XValues.Count)
            {
                InterpolatePolyLine(
                    source.XValues.ToArray(),
                    source.YValues.ToArray(),
                    target.XValues.Count,
                    out var xValues,
                    out var yValues);
                source.XValues = xValues;
                source.YValues = yValues;
            }
            else if (source.XValues.Count > target.XValues.Count)
            {
                InterpolatePolyLine(
                    target.XValues.ToArray(),
                    target.YValues.ToArray(),
                    source.XValues.Count,
                    out var xValues,
                    out var yValues);
                target.XValues = xValues;
                target.YValues = yValues;
            }

            for (int j = 0; j < source.XValues.Count; j++)
            {
                if (!interpolateXAxis)
                {
                    source.XValues[j] = target.XValues[j];
                }
                else
                {
                    source.XValues[j] = Interpolate(source.XValues[j], target.XValues[j], progress);
                }

                source.YValues[j] = Interpolate(source.YValues[j], target.YValues[j], progress);
            }
        }