public static int stbtt__solve_cubic(float a, float b, float c, float *r) { float s = -a / 3; float p = b - a * a / 3; float q = a * (2 * a * a - 9 * b) / 27 + c; float p3 = p * p * p; float d = q * q + 4 * p3 / 27; if ((d) >= (0)) { float z = (float)(CRuntime.Sqrt(d)); float u = (-q + z) / 2; float v = (-q - z) / 2; u = stbtt__cuberoot(u); v = stbtt__cuberoot(v); r[0] = s + u + v; return(1); } else { float u = (float)(CRuntime.Sqrt(-p / 3)); float v = (float)(CRuntime.Acos(-CRuntime.Sqrt(-27 / p3) * q / 2)) / 3; float m = (float)(CRuntime.Cos(v)); float n = (float)(CRuntime.Cos(v - 3.141592 / 2)) * 1.732050808f; r[0] = s + u * 2 * m; r[1] = s - u * (m + n); r[2] = s - u * (m - n); return(3); } }