#region Imports
|
|
using DPumpHydr.WinFrmUI.RLT.Enum.Metro;
|
using System;
|
|
#endregion
|
|
namespace DPumpHydr.WinFrmUI.RLT.Animate.Metro
|
{
|
#region InterpolationAnimate
|
|
public class Interpolation
|
{
|
public static double ValueAt(double initial, double end, double alpha, EasingType easing)
|
{
|
switch (easing)
|
{
|
default:
|
return (end * alpha) + (initial * (1 - alpha));
|
case EasingType.QuadIn:
|
{
|
double factor = alpha * alpha;
|
return (end * factor) + (initial * (1 - factor));
|
}
|
case EasingType.QuadOut:
|
{
|
double factor = (2 - alpha) * alpha;
|
return (end * factor) + (initial * (1 - factor));
|
}
|
case EasingType.QuadInOut:
|
{
|
double mid = initial + ((end - initial) / 2.0);
|
if (alpha <= 0.5)
|
{
|
return ValueAt(initial, mid, alpha * 2, EasingType.QuadIn);
|
}
|
else
|
{
|
return ValueAt(mid, end, (alpha - 0.5) * 2, EasingType.QuadOut);
|
}
|
}
|
case EasingType.CubeIn:
|
{
|
double factor = alpha * alpha * alpha;
|
return (end * factor) + (initial * (1 - factor));
|
}
|
case EasingType.CubeOut:
|
{
|
double factor = -(alpha - 1);
|
factor = -(factor * factor * factor) + 1;
|
return (end * factor) + (initial * (1 - factor));
|
}
|
case EasingType.CubeInOut:
|
{
|
double mid = initial + ((end - initial) / 2.0);
|
if (alpha <= 0.5)
|
{
|
return ValueAt(initial, mid, alpha * 2, EasingType.CubeIn);
|
}
|
else
|
{
|
return ValueAt(mid, end, (alpha - 0.5) * 2, EasingType.CubeOut);
|
}
|
}
|
case EasingType.QuartIn:
|
{
|
double factor = alpha * alpha * alpha * alpha;
|
return (end * factor) + (initial * (1 - factor));
|
}
|
case EasingType.QuartOut:
|
{
|
double factor = -(alpha - 1);
|
factor = 1 - (factor * factor * factor * factor);
|
return (end * factor) + (initial * (1 - factor));
|
}
|
case EasingType.QuartInOut:
|
{
|
double mid = initial + ((end - initial) / 2.0);
|
if (alpha <= 0.5)
|
{
|
return ValueAt(initial, mid, alpha * 2, EasingType.QuartIn);
|
}
|
else
|
{
|
return ValueAt(mid, end, (alpha - 0.5) * 2, EasingType.QuartOut);
|
}
|
}
|
case EasingType.QuintIn:
|
{
|
double factor = alpha * alpha * alpha * alpha * alpha;
|
return (end * factor) + (initial * (1 - factor));
|
}
|
case EasingType.QuintOut:
|
{
|
double factor = -(alpha - 1);
|
factor = 1 - (factor * factor * factor * factor * factor);
|
return (end * factor) + (initial * (1 - factor));
|
}
|
case EasingType.QuintInOut:
|
{
|
double mid = initial + ((end - initial) / 2.0);
|
if (alpha <= 0.5)
|
{
|
return ValueAt(initial, mid, alpha / 0.5, EasingType.QuintIn);
|
}
|
else
|
{
|
return ValueAt(mid, end, (alpha - 0.5) / 0.5, EasingType.QuintOut);
|
}
|
}
|
case EasingType.SineIn:
|
{
|
double factor = 1 - Math.Cos(Math.PI / 2 * alpha);
|
return (end * factor) + (initial * (1 - factor));
|
}
|
case EasingType.SineOut:
|
{
|
double factor = Math.Sin(Math.PI / 2 * alpha);
|
return (end * factor) + (initial * (1 - factor));
|
}
|
case EasingType.SineInOut:
|
{
|
if (alpha <= 0.5)
|
{
|
return ValueAt(initial, (initial + end) / 2.0, alpha * 2, EasingType.SineIn);
|
}
|
else
|
{
|
return ValueAt((initial + end) / 2.0, end, (alpha - 0.5) * 2, EasingType.SineOut);
|
}
|
}
|
}
|
}
|
}
|
|
#endregion
|
}
|