shape ops work in progress
working demo of old vs. new

git-svn-id: http://skia.googlecode.com/svn/trunk@5209 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/Intersection/QuadraticUtilities.cpp b/experimental/Intersection/QuadraticUtilities.cpp
index 4b695df..cc15bc1 100644
--- a/experimental/Intersection/QuadraticUtilities.cpp
+++ b/experimental/Intersection/QuadraticUtilities.cpp
@@ -1,6 +1,19 @@
 #include "QuadraticUtilities.h"
 #include <math.h>
 
+/*
+
+Numeric Solutions (5.6) suggests to solve the quadratic by computing
+
+       Q = -1/2(B + sgn(B)Sqrt(B^2 - 4 A C))
+
+and using the roots
+
+      t1 = Q / A
+      t2 = C / Q
+      
+*/
+
 int quadraticRoots(double A, double B, double C, double t[2]) {
     B *= 2;
     double square = B * B - 4 * A * C;
@@ -9,19 +22,24 @@
     }
     double squareRt = sqrt(square);
     double Q = (B + (B < 0 ? -squareRt : squareRt)) / -2;
-    double ratio;
     int foundRoots = 0;
-    if ((Q <= A) ^ (Q < 0)) {
-        ratio = Q / A;
-        if (!isnan(ratio)) {
-            t[foundRoots++] = ratio;
+    double ratio = Q / A;
+    if (ratio > -FLT_EPSILON && ratio < 1 + FLT_EPSILON) {
+        if (ratio < FLT_EPSILON) {
+            ratio = 0;
+        } else if (ratio > 1 - FLT_EPSILON) {
+            ratio = 1;
         }
+        t[foundRoots++] = ratio;
     }
-    if ((C <= Q) ^ (C < 0)) {
-        ratio = C / Q;
-        if (!isnan(ratio)) {
-            t[foundRoots++] = ratio;
+    ratio = C / Q;
+    if (ratio > -FLT_EPSILON && ratio < 1 + FLT_EPSILON) {
+        if (ratio < FLT_EPSILON) {
+            ratio = 0;
+        } else if (ratio > 1 - FLT_EPSILON) {
+            ratio = 1;
         }
+        t[foundRoots++] = ratio;
     }
     return foundRoots;
 }