checkpoint for shape ops
at minimum, the unit tests in SimplyNew_Test pass
git-svn-id: http://skia.googlecode.com/svn/trunk@5860 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/Intersection/QuarticRoot.cpp b/experimental/Intersection/QuarticRoot.cpp
index 839c3b9..b2e73cb 100644
--- a/experimental/Intersection/QuarticRoot.cpp
+++ b/experimental/Intersection/QuarticRoot.cpp
@@ -120,7 +120,7 @@
if (approximately_zero(A)) { // we're just a quadratic
return quadraticRootsX(B, C, D, s);
}
- if (approximately_zero(D)) {
+ if (approximately_zero(D)) { // 0 is one root
int num = quadraticRootsX(A, B, C, s);
for (int i = 0; i < num; ++i) {
if (approximately_zero(s[i])) {
@@ -130,6 +130,16 @@
s[num++] = 0;
return num;
}
+ if (approximately_zero(A + B + C + D)) { // 1 is one root
+ int num = quadraticRootsX(A, A + B, -D, s);
+ for (int i = 0; i < num; ++i) {
+ if (approximately_equal(s[i], 1)) {
+ return num;
+ }
+ }
+ s[num++] = 1;
+ return num;
+ }
double a, b, c;
{
double invA = 1 / A;
@@ -197,7 +207,7 @@
}
int num;
int i;
- if (approximately_zero(E)) {
+ if (approximately_zero(E)) { // 0 is one root
num = cubicRootsX(A, B, C, D, s);
for (i = 0; i < num; ++i) {
if (approximately_zero(s[i])) {
@@ -207,6 +217,16 @@
s[num++] = 0;
return num;
}
+ if (approximately_zero(A + B + C + D + E)) { // 1 is one root
+ num = cubicRootsX(A, A + B, -(D + E), -E, s); // note that -C==A+B+D+E
+ for (i = 0; i < num; ++i) {
+ if (approximately_equal(s[i], 1)) {
+ return num;
+ }
+ }
+ s[num++] = 1;
+ return num;
+ }
double u, v;
/* normal form: x^4 + Ax^3 + Bx^2 + Cx + D = 0 */
const double invA = 1 / A;