// from SkGeometry.cpp (and Numeric Solutions, 5.6) int SkDCubic::RootsValidT(double A, double B, double C, double D, double t[3]) { double s[3]; int realRoots = RootsReal(A, B, C, D, s); int foundRoots = SkDQuad::AddValidTs(s, realRoots, t); for (int index = 0; index < realRoots; ++index) { double tValue = s[index]; if (!approximately_one_or_less(tValue) && between(1, tValue, 1.00005)) { for (int idx2 = 0; idx2 < foundRoots; ++idx2) { if (approximately_equal(t[idx2], 1)) { goto nextRoot; } } SkASSERT(foundRoots < 3); t[foundRoots++] = 1; } else if (!approximately_zero_or_more(tValue) && between(-0.00005, tValue, 0)) { for (int idx2 = 0; idx2 < foundRoots; ++idx2) { if (approximately_equal(t[idx2], 0)) { goto nextRoot; } } SkASSERT(foundRoots < 3); t[foundRoots++] = 0; } nextRoot: ; } return foundRoots; }
// from SkGeometry.cpp (and Numeric Solutions, 5.6) int SkDCubic::RootsValidT(double A, double B, double C, double D, double t[3]) { double s[3]; int realRoots = RootsReal(A, B, C, D, s); int foundRoots = SkDQuad::AddValidTs(s, realRoots, t); return foundRoots; }
// note: caller expects multiple results to be sorted smaller first // note: http://en.wikipedia.org/wiki/Loss_of_significance has an interesting // analysis of the quadratic equation, suggesting why the following looks at // the sign of B -- and further suggesting that the greatest loss of precision // is in b squared less two a c int SkDQuad::RootsValidT(double A, double B, double C, double t[2]) { double s[2]; int realRoots = RootsReal(A, B, C, s); int foundRoots = AddValidTs(s, realRoots, t); return foundRoots; }