示例#1
0
        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);
            }
        }