public delegate float Bezier(float p1, float p2, float c1, float c2, float t);
public static void Main()
Console.WriteLine("Bezier1: " + Bezier1(-1, 4, 0, 3, 0.2f));
Console.WriteLine("Bezier2: " + Bezier2(-1, 4, 0, 3, 0.2f));
Console.WriteLine("Bezier3: " + Bezier3(-1, 4, 0, 3, 0.2f));
Console.WriteLine("Bezier4: " + Bezier4(-1, 4, 0, 3, 0.2f));
TimeBezier(Bezier4, 10000000);
Console.WriteLine("Done");
public static void TimeBezier(Bezier bezier, float iterations)
for (var i = 0; i < iterations; i++)
var t = (float)rand.NextDouble();
bezier.Invoke(-1, 4, 0, 3, t);
public static float Bezier1(float p1, float p2, float c1, float c2, float t)
return p1 + 2f*t*(c1 - p1 + t*((p1 + p2)/2f - 2f*c1 + c2 + t*(c1 - c2)));
public static float Bezier2(float p1, float p2, float c1, float c2, float t)
return 2f*(c1*t3 - c2*t3 - 2*c1*t2 + c2*t2 + (p1*t2 + p2*t2)/2f - p1*t + c1*t + p1/2f);
public static float Bezier3(float p1, float p2, float c1, float c2, float t)
var l1 = Lerp(c1, c2, t);
var l2 = Lerp(p1, l1, t);
var l3 = Lerp(l1, p2, t);
public static float Bezier4(float p1, float p2, float c1, float c2, float t)
var l1 = c1 + t*(c2 - c1);
var l2 = p1 + t*(l1 - p1);
var l3 = l1 + t*(p2 - l1);
public static float Lerp(float a, float b, float c)