/* Looking for F' dot F'' == 0 A = b - a B = c - 2b + a C = d - 3c + 3b - a F' = 3Ct^2 + 6Bt + 3A F'' = 6Ct + 6B F' dot F'' -> CCt^3 + 3BCt^2 + (2BB + CA)t + AB */ int SkFindCubicMaxCurvature(const SkPoint src[4], SkScalar tValues[3]) { SkFP coeffX[4], coeffY[4]; int i; formulate_F1DotF2(&src[0].fX, coeffX); formulate_F1DotF2(&src[0].fY, coeffY); for (i = 0; i < 4; i++) coeffX[i] = SkFPAdd(coeffX[i],coeffY[i]); SkScalar t[3]; int count = solve_cubic_polynomial(coeffX, t); int maxCount = 0; // now remove extrema where the curvature is zero (mins) // !!!! need a test for this !!!! for (i = 0; i < count; i++) { // if (not_min_curvature()) if (t[i] > kMinTValueForChopping && t[i] < SK_Scalar1 - kMinTValueForChopping) tValues[maxCount++] = t[i]; } return maxCount; }
/* from SkGeometry.cpp Looking for F' dot F'' == 0 A = b - a B = c - 2b + a C = d - 3c + 3b - a F' = 3Ct^2 + 6Bt + 3A F'' = 6Ct + 6B F' dot F'' -> CCt^3 + 3BCt^2 + (2BB + CA)t + AB */ int SkDCubic::findMaxCurvature(double tValues[]) const { double coeffX[4], coeffY[4]; int i; formulate_F1DotF2(&fPts[0].fX, coeffX); formulate_F1DotF2(&fPts[0].fY, coeffY); for (i = 0; i < 4; i++) { coeffX[i] = coeffX[i] + coeffY[i]; } return RootsValidT(coeffX[0], coeffX[1], coeffX[2], coeffX[3], tValues); }
/* from SkGeometry.cpp Looking for F' dot F'' == 0 A = b - a B = c - 2b + a C = d - 3c + 3b - a F' = 3Ct^2 + 6Bt + 3A F'' = 6Ct + 6B F' dot F'' -> CCt^3 + 3BCt^2 + (2BB + CA)t + AB */ int find_cubic_max_curvature(const Cubic& src, double tValues[]) { double coeffX[4], coeffY[4]; int i; formulate_F1DotF2(&src[0].x, coeffX); formulate_F1DotF2(&src[0].y, coeffY); for (i = 0; i < 4; i++) { coeffX[i] = coeffX[i] + coeffY[i]; } return cubicRootsValidT(coeffX[0], coeffX[1], coeffX[2], coeffX[3], tValues); }