/* Works out if there are 1 or 3 real roots of the equation, then computes the values of the roots. */ void find_roots(float a1, float a2, float a3) { float q, s; q = (powf(a1, 2) - 3*a2)/9; s = (2*powf(a1, 3) - 9*a1*a2 + 27*a3)/54; // printf("Q = %.4f, S = %.4f\n", q, s); if (powf(q, 3) - powf(s, 2) > 0){ // If there are three real roots float theta, x1, x2, x3; theta = acosf(s/sqrtf(powf(q, 3))); x1 = -2 * sqrtf(q) * cosf(theta/3) - a1/3; //first root x2 = -2 * sqrtf(q) * cosf((theta + 2*PI)/3) - a1/3; //second root x3 = -2 * sqrtf(q) * cosf((theta + 4*PI)/3) - a1/3; //third root printf("There are three real roots: %.3f, %.3f and %.3f.\n", x1, x2, x3); test_cubic(a1, a2, a3, x1); test_cubic(a1, a2, a3, x2); test_cubic(a1, a2, a3, x3); } else if (powf(q, 3) - powf(s, 2) <= 0){ // Else if there is only one real root. float a, sign, x1; if (fabsf(s) < 0.000001) { // if S is equal to 0. sign = 0; } else if (s > 0) { sign = -1; } else if (s < 0) { sign = 1; } a = sign * powf((sqrtf(powf(s, 2) - powf(q, 3)) + fabsf(s)), 1/3); if (fabsf(a) > 0.000001) { // i.e if a does not equal 0 x1 = a + q/a - a1/3; } else { x1 = a - a1/3; } printf("There is one real root: %.3f\n", x1); test_cubic(a1, a2, a3, x1); } }
int main() { test_square(); test_triangular(); test_hexagonal(); test_cubic(); return 0; }
void init() { if (fOnce) { return; } fOnce = true; test_cubic(); test_cubic2(); fShowHairline = false; fDStroke = 1; fStroke = 10; fMinStroke = 10; fMaxStroke = 180; const int V = 85; fPath[0].moveTo(SkIntToScalar(40), SkIntToScalar(70)); fPath[0].lineTo(SkIntToScalar(70), SkIntToScalar(70) + SK_Scalar1/1); fPath[0].lineTo(SkIntToScalar(110), SkIntToScalar(70)); fPath[1].moveTo(SkIntToScalar(40), SkIntToScalar(70)); fPath[1].lineTo(SkIntToScalar(70), SkIntToScalar(70) - SK_Scalar1/1); fPath[1].lineTo(SkIntToScalar(110), SkIntToScalar(70)); fPath[2].moveTo(SkIntToScalar(V), SkIntToScalar(V)); fPath[2].lineTo(SkIntToScalar(50), SkIntToScalar(V)); fPath[2].lineTo(SkIntToScalar(50), SkIntToScalar(50)); fPath[3].moveTo(SkIntToScalar(50), SkIntToScalar(50)); fPath[3].lineTo(SkIntToScalar(50), SkIntToScalar(V)); fPath[3].lineTo(SkIntToScalar(V), SkIntToScalar(V)); fPath[4].moveTo(SkIntToScalar(50), SkIntToScalar(50)); fPath[4].lineTo(SkIntToScalar(50), SkIntToScalar(V)); fPath[4].lineTo(SkIntToScalar(52), SkIntToScalar(50)); fPath[5].moveTo(SkIntToScalar(52), SkIntToScalar(50)); fPath[5].lineTo(SkIntToScalar(50), SkIntToScalar(V)); fPath[5].lineTo(SkIntToScalar(50), SkIntToScalar(50)); this->setBGColor(0xFFDDDDDD); }
void init() { if (fOnce) { return; } fOnce = true; test_cubic(); test_cubic2(); fShowHairline = false; fDStroke = 1; fStroke = 10; fMinStroke = 10; fMaxStroke = 180; const SkScalar V = 85; fPath[0].moveTo(40, 70); fPath[0].lineTo(70, 70 + SK_ScalarHalf); fPath[0].lineTo(110, 70); fPath[1].moveTo(40, 70); fPath[1].lineTo(70, 70 - SK_ScalarHalf); fPath[1].lineTo(110, 70); fPath[2].moveTo(V, V); fPath[2].lineTo(50, V); fPath[2].lineTo(50, 50); fPath[3].moveTo(50, 50); fPath[3].lineTo(50, V); fPath[3].lineTo(V, V); fPath[4].moveTo(50, 50); fPath[4].lineTo(50, V); fPath[4].lineTo(52, 50); fPath[5].moveTo(52, 50); fPath[5].lineTo(50, V); fPath[5].lineTo(50, 50); this->setBGColor(0xFFDDDDDD); }
PathView() { test_cubic(); test_cubic2(); fShowHairline = false; fDStroke = 1; fStroke = 10; fMinStroke = 10; fMaxStroke = 180; const int V = 85; fPath[0].moveTo(SkIntToScalar(40), SkIntToScalar(70)); fPath[0].lineTo(SkIntToScalar(70), SkIntToScalar(70) + SK_Scalar1/1); fPath[0].lineTo(SkIntToScalar(110), SkIntToScalar(70)); fPath[1].moveTo(SkIntToScalar(40), SkIntToScalar(70)); fPath[1].lineTo(SkIntToScalar(70), SkIntToScalar(70) - SK_Scalar1/1); fPath[1].lineTo(SkIntToScalar(110), SkIntToScalar(70)); fPath[2].moveTo(SkIntToScalar(V), SkIntToScalar(V)); fPath[2].lineTo(SkIntToScalar(50), SkIntToScalar(V)); fPath[2].lineTo(SkIntToScalar(50), SkIntToScalar(50)); fPath[3].moveTo(SkIntToScalar(50), SkIntToScalar(50)); fPath[3].lineTo(SkIntToScalar(50), SkIntToScalar(V)); fPath[3].lineTo(SkIntToScalar(V), SkIntToScalar(V)); fPath[4].moveTo(SkIntToScalar(50), SkIntToScalar(50)); fPath[4].lineTo(SkIntToScalar(50), SkIntToScalar(V)); fPath[4].lineTo(SkIntToScalar(52), SkIntToScalar(50)); fPath[5].moveTo(SkIntToScalar(52), SkIntToScalar(50)); fPath[5].lineTo(SkIntToScalar(50), SkIntToScalar(V)); fPath[5].lineTo(SkIntToScalar(50), SkIntToScalar(50)); }