/// <summary> /// gets the first derivative for a cubic bezier /// </summary> /// <returns>The first derivative.</returns> /// <param name="start">P0.</param> /// <param name="firstControlPoint">P1.</param> /// <param name="secondControlPoint">P2.</param> /// <param name="end">P3.</param> /// <param name="t">T.</param> public static Vector2 GetFirstDerivative(Vector2 start, Vector2 firstControlPoint, Vector2 secondControlPoint, Vector2 end, float t) { t = NumericHelper.Clamp01(t); var oneMinusT = 1f - t; return(3f * oneMinusT * oneMinusT * (firstControlPoint - start) + 6f * oneMinusT * t * (secondControlPoint - firstControlPoint) + 3f * t * t * (end - secondControlPoint)); }
/// <summary> /// evaluate quadratic bezier /// </summary> /// <returns>The point.</returns> /// <param name="p0">P0.</param> /// <param name="p1">P1.</param> /// <param name="p2">P2.</param> /// <param name="t">T.</param> public static Vector2 GetPoint(Vector2 p0, Vector2 p1, Vector2 p2, float t) { t = NumericHelper.Clamp01(t); var oneMinusT = 1f - t; return(oneMinusT * oneMinusT * p0 + 2f * oneMinusT * t * p1 + t * t * p2); }
/// <summary> /// evaluate a cubic bezier /// </summary> /// <returns>The point.</returns> /// <param name="start">P0.</param> /// <param name="firstControlPoint">P1.</param> /// <param name="secondControlPoint">P2.</param> /// <param name="end">P3.</param> /// <param name="t">T.</param> public static Vector2 GetPoint(Vector2 start, Vector2 firstControlPoint, Vector2 secondControlPoint, Vector2 end, float t) { t = NumericHelper.Clamp01(t); var oneMinusT = 1f - t; return(oneMinusT * oneMinusT * oneMinusT * start + 3f * oneMinusT * oneMinusT * t * firstControlPoint + 3f * oneMinusT * t * t * secondControlPoint + t * t * t * end); }
/// <summary> /// helper that gets the bezier point index at time t. t is modified in the process to be in the range of the curve segment. /// </summary> /// <returns>The index at time.</returns> /// <param name="t">T.</param> private int PointIndexAtTime(ref float t) { int i; if (t >= 1f) { t = 1f; i = points.Length - 4; } else { t = NumericHelper.Clamp01(t) * curveCount; i = (int)t; t -= i; i *= 3; } return(i); }