/// <summary> /// Returns bezier point by curve type. /// </summary> public static Vector2[] GetBezierPoints(EEase ease, Vector2 fromPoint, Vector2 toPoint) { Vector2[] points = new Vector2[4]; points[0] = fromPoint; points[3] = toPoint; Vector2 direction = toPoint - fromPoint; switch (ease) { case EEase.InSine: { points[1].x = points[0].x + (MyEasing.IN_SINE[0].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_SINE[0].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_SINE[1].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_SINE[1].y * direction.y); } break; case EEase.OutSine: { points[1].x = points[0].x + (MyEasing.OUT_SINE[0].x * direction.x); points[1].y = points[0].y + (MyEasing.OUT_SINE[0].y * direction.y); points[2].x = points[0].x + (MyEasing.OUT_SINE[1].x * direction.x); points[2].y = points[0].y + (MyEasing.OUT_SINE[1].y * direction.y); } break; case EEase.InOutSine: { points[1].x = points[0].x + (MyEasing.IN_OUT_SINE[0].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_OUT_SINE[0].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_OUT_SINE[1].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_OUT_SINE[1].y * direction.y); } break; case EEase.OutInSine: { points[1].x = points[0].x + (MyEasing.IN_OUT_SINE[1].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_OUT_SINE[1].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_OUT_SINE[0].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_OUT_SINE[0].y * direction.y); } break; case EEase.InQuad: { points[1].x = points[0].x + (MyEasing.IN_QUAD[0].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_QUAD[0].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_QUAD[1].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_QUAD[1].y * direction.y); } break; case EEase.OutQuad: { points[1].x = points[0].x + (MyEasing.OUT_QUAD[0].x * direction.x); points[1].y = points[0].y + (MyEasing.OUT_QUAD[0].y * direction.y); points[2].x = points[0].x + (MyEasing.OUT_QUAD[1].x * direction.x); points[2].y = points[0].y + (MyEasing.OUT_QUAD[1].y * direction.y); } break; case EEase.InOutQuad: { points[1].x = points[0].x + (MyEasing.IN_OUT_QUAD[0].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_OUT_QUAD[0].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_OUT_QUAD[1].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_OUT_QUAD[1].y * direction.y); } break; case EEase.OutInQuad: { points[1].x = points[0].x + (MyEasing.IN_OUT_QUAD[1].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_OUT_QUAD[1].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_OUT_QUAD[0].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_OUT_QUAD[0].y * direction.y); } break; case EEase.InCubic: { points[1].x = points[0].x + (MyEasing.IN_CUBIC[0].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_CUBIC[0].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_CUBIC[1].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_CUBIC[1].y * direction.y); } break; case EEase.OutCubic: { points[1].x = points[0].x + (MyEasing.OUT_CUBIC[0].x * direction.x); points[1].y = points[0].y + (MyEasing.OUT_CUBIC[0].y * direction.y); points[2].x = points[0].x + (MyEasing.OUT_CUBIC[1].x * direction.x); points[2].y = points[0].y + (MyEasing.OUT_CUBIC[1].y * direction.y); } break; case EEase.InOutCubic: { points[1].x = points[0].x + (MyEasing.IN_OUT_CUBIC[0].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_OUT_CUBIC[0].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_OUT_CUBIC[1].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_OUT_CUBIC[1].y * direction.y); } break; case EEase.OutInCubic: { points[1].x = points[0].x + (MyEasing.IN_OUT_CUBIC[1].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_OUT_CUBIC[1].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_OUT_CUBIC[0].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_OUT_CUBIC[0].y * direction.y); } break; case EEase.InQuart: { points[1].x = points[0].x + (MyEasing.IN_QUART[0].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_QUART[0].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_QUART[1].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_QUART[1].y * direction.y); } break; case EEase.OutQuart: { points[1].x = points[0].x + (MyEasing.OUT_QUART[0].x * direction.x); points[1].y = points[0].y + (MyEasing.OUT_QUART[0].y * direction.y); points[2].x = points[0].x + (MyEasing.OUT_QUART[1].x * direction.x); points[2].y = points[0].y + (MyEasing.OUT_QUART[1].y * direction.y); } break; case EEase.InOutQuart: { points[1].x = points[0].x + (MyEasing.IN_OUT_QUART[0].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_OUT_QUART[0].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_OUT_QUART[1].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_OUT_QUART[1].y * direction.y); } break; case EEase.OutInQuart: { points[1].x = points[0].x + (MyEasing.IN_OUT_QUART[1].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_OUT_QUART[1].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_OUT_QUART[0].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_OUT_QUART[0].y * direction.y); } break; case EEase.InQuint: { points[1].x = points[0].x + (MyEasing.IN_QUINT[0].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_QUINT[0].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_QUINT[1].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_QUINT[1].y * direction.y); } break; case EEase.OutQuint: { points[1].x = points[0].x + (MyEasing.OUT_QUINT[0].x * direction.x); points[1].y = points[0].y + (MyEasing.OUT_QUINT[0].y * direction.y); points[2].x = points[0].x + (MyEasing.OUT_QUINT[1].x * direction.x); points[2].y = points[0].y + (MyEasing.OUT_QUINT[1].y * direction.y); } break; case EEase.InOutQuint: { points[1].x = points[0].x + (MyEasing.IN_OUT_QUINT[0].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_OUT_QUINT[0].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_OUT_QUINT[1].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_OUT_QUINT[1].y * direction.y); } break; case EEase.OutInQuint: { points[1].x = points[0].x + (MyEasing.IN_OUT_QUINT[1].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_OUT_QUINT[1].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_OUT_QUINT[0].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_OUT_QUINT[0].y * direction.y); } break; case EEase.InExpo: { points[1].x = points[0].x + (MyEasing.IN_EXPO[0].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_EXPO[0].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_EXPO[1].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_EXPO[1].y * direction.y); } break; case EEase.OutExpo: { points[1].x = points[0].x + (MyEasing.OUT_EXPO[0].x * direction.x); points[1].y = points[0].y + (MyEasing.OUT_EXPO[0].y * direction.y); points[2].x = points[0].x + (MyEasing.OUT_EXPO[1].x * direction.x); points[2].y = points[0].y + (MyEasing.OUT_EXPO[1].y * direction.y); } break; case EEase.InOutExpo: { points[1].x = points[0].x + (MyEasing.IN_OUT_EXPO[0].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_OUT_EXPO[0].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_OUT_EXPO[1].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_OUT_EXPO[1].y * direction.y); } break; case EEase.OutInExpo: { points[1].x = points[0].x + (MyEasing.IN_OUT_EXPO[1].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_OUT_EXPO[1].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_OUT_EXPO[0].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_OUT_EXPO[0].y * direction.y); } break; case EEase.InCirc: { points[1].x = points[0].x + (MyEasing.IN_CIRC[0].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_CIRC[0].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_CIRC[1].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_CIRC[1].y * direction.y); } break; case EEase.OutCirc: { points[1].x = points[0].x + (MyEasing.OUT_CIRC[0].x * direction.x); points[1].y = points[0].y + (MyEasing.OUT_CIRC[0].y * direction.y); points[2].x = points[0].x + (MyEasing.OUT_CIRC[1].x * direction.x); points[2].y = points[0].y + (MyEasing.OUT_CIRC[1].y * direction.y); } break; case EEase.InOutCirc: { points[1].x = points[0].x + (MyEasing.IN_OUT_CIRC[0].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_OUT_CIRC[0].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_OUT_CIRC[1].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_OUT_CIRC[1].y * direction.y); } break; case EEase.OutInCirc: { points[1].x = points[0].x + (MyEasing.IN_OUT_CIRC[1].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_OUT_CIRC[1].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_OUT_CIRC[0].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_OUT_CIRC[0].y * direction.y); } break; case EEase.InBack: { points[1].x = points[0].x + (MyEasing.IN_BACK[0].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_BACK[0].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_BACK[1].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_BACK[1].y * direction.y); } break; case EEase.OutBack: { points[1].x = points[0].x + (MyEasing.OUT_BACK[0].x * direction.x); points[1].y = points[0].y + (MyEasing.OUT_BACK[0].y * direction.y); points[2].x = points[0].x + (MyEasing.OUT_BACK[1].x * direction.x); points[2].y = points[0].y + (MyEasing.OUT_BACK[1].y * direction.y); } break; case EEase.InOutBack: { points[1].x = points[0].x + (MyEasing.IN_OUT_BACK[0].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_OUT_BACK[0].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_OUT_BACK[1].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_OUT_BACK[1].y * direction.y); } break; case EEase.OutInBack: { points[1].x = points[0].x + (MyEasing.IN_OUT_BACK[1].x * direction.x); points[1].y = points[0].y + (MyEasing.IN_OUT_BACK[1].y * direction.y); points[2].x = points[0].x + (MyEasing.IN_OUT_BACK[0].x * direction.x); points[2].y = points[0].y + (MyEasing.IN_OUT_BACK[0].y * direction.y); } break; } return(points); }
/// <summary> /// Returns time of a cubic bezier curve by distance. /// </summary> /// <param name="distance">0 -> 1</param> public static float GetTimeByDistance(EEase ease, float distance) { switch (ease) { case EEase.InSine: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, IN_SINE[0], IN_SINE[1], Vector2.one, distance).magnitude); } case EEase.OutSine: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, OUT_SINE[0], OUT_SINE[1], Vector2.one, distance).magnitude); } case EEase.InOutSine: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, IN_OUT_SINE[0], IN_OUT_SINE[1], Vector2.one, distance).magnitude); } case EEase.InQuad: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, IN_QUAD[0], IN_QUAD[1], Vector2.one, distance).magnitude); } case EEase.OutQuad: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, OUT_QUAD[0], OUT_QUAD[1], Vector2.one, distance).magnitude); } case EEase.InOutQuad: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, IN_OUT_QUAD[0], IN_OUT_QUAD[1], Vector2.one, distance).magnitude); } case EEase.InCubic: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, IN_CUBIC[0], IN_CUBIC[1], Vector2.one, distance).magnitude); } case EEase.OutCubic: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, OUT_CUBIC[0], OUT_CUBIC[1], Vector2.one, distance).magnitude); } case EEase.InOutCubic: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, IN_OUT_CUBIC[0], IN_OUT_CUBIC[1], Vector2.one, distance).magnitude); } case EEase.InQuart: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, IN_QUART[0], IN_QUART[1], Vector2.one, distance).magnitude); } case EEase.OutQuart: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, OUT_QUART[0], OUT_QUART[1], Vector2.one, distance).magnitude); } case EEase.InOutQuart: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, IN_OUT_QUART[0], IN_OUT_QUART[1], Vector2.one, distance).magnitude); } case EEase.InQuint: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, IN_QUINT[0], IN_QUINT[1], Vector2.one, distance).magnitude); } case EEase.OutQuint: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, OUT_QUINT[0], OUT_QUINT[1], Vector2.one, distance).magnitude); } case EEase.InOutQuint: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, IN_OUT_QUINT[0], IN_OUT_QUINT[1], Vector2.one, distance).magnitude); } case EEase.InExpo: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, IN_EXPO[0], IN_EXPO[1], Vector2.one, distance).magnitude); } case EEase.OutExpo: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, OUT_EXPO[0], OUT_EXPO[1], Vector2.one, distance).magnitude); } case EEase.InOutExpo: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, IN_OUT_EXPO[0], IN_OUT_EXPO[1], Vector2.one, distance).magnitude); } case EEase.InCirc: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, IN_CIRC[0], IN_CIRC[1], Vector2.one, distance).magnitude); } case EEase.OutCirc: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, OUT_CIRC[0], OUT_CIRC[1], Vector2.one, distance).magnitude); } case EEase.InOutCirc: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, IN_OUT_CIRC[0], IN_OUT_CIRC[1], Vector2.one, distance).magnitude); } case EEase.InBack: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, IN_BACK[0], IN_BACK[1], Vector2.one, distance).magnitude); } case EEase.OutBack: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, OUT_BACK[0], OUT_BACK[1], Vector2.one, distance).magnitude); } case EEase.InOutBack: { return(MyBezier.GetCubicBezierPoint(Vector2.zero, IN_OUT_BACK[0], IN_OUT_BACK[1], Vector2.one, distance).magnitude); } } return(distance); }