Esempio n. 1
0
 public static PointTransformation <T> Create <T>(T target, string property, TimeSpan duration,
                                                  EaserFunction easerFunction = null, bool useStartValue = true,
                                                  params Point[] values) where T : class
 {
     return(new PointTransformation <T>(target, property,
                                        duration, easerFunction, useStartValue, values));
 }
        private IEnumerable <TType> Interpolate(int stepCount, EaserFunction easer, TVector from, TVector to)
        {
            var edge = Subtract(to, from);

            //Calculate the unit vector for the edge
            var normal = Normalize(edge);
            //Determine the length of the edge
            var edgeLength = GetLength(edge);

            //Yield a value at each step along this edge
            for (var stepIndex = 1; stepIndex < stepCount; stepIndex++)
            {
                //Calculate the progress through this edge
                var progress = easer(stepIndex, stepCount);
                //Multiply the edge's distance by the progress
                var progressDistance = edgeLength * progress;
                //Multiply the normal by the progress to get the vector from the last point
                var progressVector = Multiply(normal, progressDistance);
                //Add the progress vector to the last point to get the new point
                var newPoint = Add(from, progressVector);
                //Convert and return
                yield return(FromVector(newPoint));
            }

            //Return the end point for this edge
            yield return(FromVector(to));
        }
Esempio n. 3
0
        public IEnumerable <double> Interpolate(int stepCount, EaserFunction easer, double[] points)
        {
            if (stepCount <= 0)
            {
                yield break;
            }

            //Get the list of edges
            var edges = GetEdges(points);

            //The distance to travel per step
            var velocity = TotalEdgeLength(edges) / stepCount;

            if (velocity <= 0)
            {
                for (var i = 0; i < stepCount; i++)
                {
                    yield return(points.Last());
                }
            }
            else
            {
                //Yield a point for each step
                foreach (var(pointA, pointB, edge) in edges)
                {
                    var edgeSteps = edge / velocity;
                    foreach (var value in Interpolate((int)edgeSteps, easer, pointA, pointB))
                    {
                        yield return(value);
                    }
                }
            }
        }
 public ColorTransformation(TClass target,
                            string property,
                            TimeSpan duration,
                            EaserFunction easerFunction = null,
                            bool useStartValue          = false,
                            params Color[] values) : base(target,
                                                          property,
                                                          duration,
                                                          new ColorInterpolator(), easerFunction, useStartValue, values)
 {
 }
Esempio n. 5
0
 /// <summary>
 ///     Transform a double property on the target object to the value returned by the given Func<>at intervals
 ///     specified by the step duration up to the task duration
 /// </summary>
 /// <summary>
 public DoubleTransformation(TClass target,
                             string property,
                             TimeSpan stepCount,
                             EaserFunction easerFunction = null,
                             bool useStartValue          = false,
                             params double[] values) : base(target,
                                                            property,
                                                            stepCount,
                                                            new DoubleInterpolator(), easerFunction, useStartValue, values)
 {
 }
 public Vec2Transformation(TClass target,
                           string property,
                           TimeSpan duration,
                           EaserFunction easerFunction = null,
                           bool useStartValue          = true,
                           params Vector2[] values) : base(target,
                                                           property,
                                                           duration,
                                                           new Vec2LinearInterpolator(),
                                                           easerFunction, useStartValue, values)
 {
 }
 public PointTransformation(TClass target,
                            string property,
                            TimeSpan duration,
                            EaserFunction easerFunction = null,
                            bool useStartValue          = true,
                            params Point[] values) : base(target,
                                                          property,
                                                          duration,
                                                          new PointInterpolator(),
                                                          easerFunction, useStartValue, values)
 {
 }
Esempio n. 8
0
        public IEnumerable <TType> Interpolate(int stepCount, EaserFunction easer, TType from, TType to)
        {
            if (stepCount <= 0)
            {
                yield break;
            }

            var fromVector = ToVector(from);
            var toVector   = ToVector(from);

            foreach (var value in Interpolate(stepCount, easer, fromVector, toVector))
            {
                yield return(value);
            }
        }
 protected InterpolatedTransformation(TClass target,
                                      string property,
                                      TimeSpan duration,
                                      ILinearInterpolator <TProperty> interpolator,
                                      EaserFunction easerFunction = null,
                                      bool useStartValue          = true,
                                      params TProperty[] values) : base(target,
                                                                        property,
                                                                        duration,
                                                                        useStartValue,
                                                                        values)
 {
     _interpolator = interpolator;
     Easer         = easerFunction ?? DefaultEasers.Linear;
 }
Esempio n. 10
0
        public IEnumerable <double> Interpolate(int stepCount, EaserFunction easer, double from, double to)
        {
            if (stepCount <= 0)
            {
                yield break;
            }

            var edgeLength = to - from;

            for (var stepIndex = 1; stepIndex < stepCount; stepIndex++)
            {
                yield return(from + edgeLength * easer(stepIndex, stepCount));
            }

            yield return(to);
        }
Esempio n. 11
0
        public IEnumerable <int> Interpolate(int stepCount, EaserFunction easer, int from, int to)
        {
            if (stepCount <= 0)
            {
                yield break;
            }

            var edgeLength = to - from;

            for (var stepIndex = 1; stepIndex < stepCount; stepIndex++)
            {
                yield return(from + (int)(edgeLength * easer(stepIndex, stepCount)));
            }

            //Return the last point for this step
            yield return(to);
        }
Esempio n. 12
0
        public IEnumerable <int> Interpolate(int stepCount, EaserFunction easer, int[] points)
        {
            if (stepCount <= 0)
            {
                yield break;
            }

            //Get the list of edges
            var edges = GetEdges(points);

            //The distance to travel per step
            var velocity = TotalEdgeLength(edges) / stepCount;

            if (velocity <= 0)
            {
                //If the distance to travel per step is 0 then return the last destination
                //for each step
                for (var i = 0; i < stepCount; i++)
                {
                    yield return(points.Last());
                }
            }
            else
            {
                //for each edge
                foreach (var(pointA, pointB, edge) in edges)
                {
                    //Calculate how many steps this edge has
                    var edgeSteps = edge / velocity;
                    //Return a value for each step along this edge
                    foreach (var value in Interpolate(edgeSteps, easer, pointA, pointB))
                    {
                        yield return(value);
                    }
                }
            }
        }
        public IEnumerable <TType> Interpolate(int stepCount, EaserFunction easer, TType[] points)
        {
            if (stepCount <= 0)
            {
                yield break;
            }

            //Get the list of edges
            var edges = GetEdges(points.Select(ToVector).ToArray());

            //Calculate the total length to travel
            var velocity = TotalEdgeLength(edges) / stepCount;

            if (velocity <= 0)
            {
                for (var i = 0; i < stepCount; i++)
                {
                    yield return(points.Last());
                }
            }
            else
            {
                foreach (var(pointA, pointB, edge) in edges)
                {
                    //Determine the length of the edge
                    var edgeLength = GetLength(edge);
                    //Calculate the number of steps needed for this edge
                    var edgeSteps = edgeLength / velocity;

                    foreach (var value in Interpolate((int)edgeSteps, easer, pointA, pointB))
                    {
                        yield return(value);
                    }
                }
            }
        }
Esempio n. 14
0
        public IEnumerable <TType> Interpolate(int stepCount, EaserFunction easer, params TType[] points)
        {
            if (stepCount <= 0)
            {
                yield break;
            }

            var curveSegments = new List <(Vector2, Vector2, Vector2, Vector2)>();
            var vecPoints     = points.Select(ToVector).ToList();

            for (var i = 2; i + 1 < vecPoints.Count; i += 2)
            {
                var point1 = vecPoints[i - 2];
                var point2 = vecPoints[i - 1];
                var point3 = vecPoints[i];
                var point4 = vecPoints[i + 1];

                curveSegments.Add((point1, point2, point3, point4));
            }

            var pointsOnCurve = new List <Vector2>();

            foreach (var curveSegment in curveSegments)
            {
                for (var i = 0; i <= 10; i++)
                {
                    var x = X(i / 10f, curveSegment.Item1.X, curveSegment.Item2.X, curveSegment.Item3.X,
                              curveSegment.Item4.X);
                    var y = Y(i / 10f, curveSegment.Item1.Y, curveSegment.Item2.Y, curveSegment.Item3.Y,
                              curveSegment.Item4.Y);

                    pointsOnCurve.Add(new Vector2(x, y));
                }
            }

            //Get the list of edges
            var edges = GetEdges(pointsOnCurve);

            //Calculate the total length to travel
            var velocity = TotalEdgeLength(edges) / stepCount;

            if (velocity <= 0)
            {
                for (var i = 0; i < stepCount; i++)
                {
                    yield return(points.Last());
                }
            }
            else
            {
                foreach (var(pointA, pointB, edge) in edges)
                {
                    //Calculate the unit vector for the edge
                    var normal = Normalize(edge);
                    //Determine the length of the edge
                    var edgeLength = GetLength(edge);
                    //Calculate the number of steps needed for this edge
                    var edgeSteps = edgeLength / velocity;
                    //Yield a value at each step along this edge
                    for (var stepIndex = 1; stepIndex < edgeSteps; stepIndex++)
                    {
                        //Calculate the progress through this edge
                        var progress = easer(stepIndex, (int)edgeSteps);
                        //Multiply the edge's distance by the progress
                        var progressDistance = edgeLength * progress;
                        //Multiply the normal by the progress to get the vector from the last point
                        var progressVector = Multiply(normal, progressDistance);
                        //Add the progress vector to the last point to get the new point
                        var newPoint = Add(pointA, progressVector);
                        //Convert and return
                        yield return(FromVector(newPoint));
                    }

                    //Return the end point for this edge
                    yield return(FromVector(pointB));
                }
            }
        }
 public IEnumerable <TType> Interpolate(int stepCount, EaserFunction easer, TType from, TType to) =>
 Interpolate(stepCount, easer, ToVector(from), ToVector(to));