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;
}