Index: experimental/Intersection/CubicConvexHull.cpp |
diff --git a/experimental/Intersection/CubicConvexHull.cpp b/experimental/Intersection/CubicConvexHull.cpp |
deleted file mode 100644 |
index 137b0d68d65bbb031204df139ff5a8091fa97dad..0000000000000000000000000000000000000000 |
--- a/experimental/Intersection/CubicConvexHull.cpp |
+++ /dev/null |
@@ -1,165 +0,0 @@ |
-/* |
- * Copyright 2012 Google Inc. |
- * |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
- |
-#include "CubicUtilities.h" |
-#include "CurveIntersection.h" |
-#include "Intersections.h" |
-#include "IntersectionUtilities.h" |
-#include "LineIntersection.h" |
- |
-static const double tClipLimit = 0.8; // http://cagd.cs.byu.edu/~tom/papers/bezclip.pdf see Multiple intersections |
- |
-class CubicIntersections : public Intersections { |
-public: |
- |
-CubicIntersections(const Cubic& c1, const Cubic& c2, Intersections& i) |
- : cubic1(c1) |
- , cubic2(c2) |
- , intersections(i) |
- , depth(0) |
- , splits(0) { |
-} |
- |
-bool intersect() { |
- double minT1, minT2, maxT1, maxT2; |
- if (!bezier_clip(cubic2, cubic1, minT1, maxT1)) { |
- return false; |
- } |
- if (!bezier_clip(cubic1, cubic2, minT2, maxT2)) { |
- return false; |
- } |
- int split; |
- if (maxT1 - minT1 < maxT2 - minT2) { |
- intersections.swap(); |
- minT2 = 0; |
- maxT2 = 1; |
- split = maxT1 - minT1 > tClipLimit; |
- } else { |
- minT1 = 0; |
- maxT1 = 1; |
- split = (maxT2 - minT2 > tClipLimit) << 1; |
- } |
- return chop(minT1, maxT1, minT2, maxT2, split); |
-} |
- |
-protected: |
- |
-bool intersect(double minT1, double maxT1, double minT2, double maxT2) { |
- Cubic smaller, larger; |
- // FIXME: carry last subdivide and reduceOrder result with cubic |
- sub_divide(cubic1, minT1, maxT1, intersections.swapped() ? larger : smaller); |
- sub_divide(cubic2, minT2, maxT2, intersections.swapped() ? smaller : larger); |
- Cubic smallResult; |
- if (reduceOrder(smaller, smallResult, kReduceOrder_NoQuadraticsAllowed, |
- kReduceOrder_TreatAsFill) <= 2) { |
- Cubic largeResult; |
- if (reduceOrder(larger, largeResult, kReduceOrder_NoQuadraticsAllowed, |
- kReduceOrder_TreatAsFill) <= 2) { |
- const _Line& smallLine = (const _Line&) smallResult; |
- const _Line& largeLine = (const _Line&) largeResult; |
- Intersections lineTs; |
- // FIXME: this doesn't detect or deal with coincident lines |
- if (!::intersect(smallLine, largeLine, lineTs)) { |
- return false; |
- } |
- if (intersections.swapped()) { |
- lineTs.fT[0][0] = interp(minT2, maxT2, lineTs.fT[0][0]); |
- lineTs.fT[1][0] = interp(minT1, maxT1, lineTs.fT[1][0]); |
- } else { |
- lineTs.fT[0][0] = interp(minT1, maxT1, lineTs.fT[0][0]); |
- lineTs.fT[1][0] = interp(minT2, maxT2, lineTs.fT[1][0]); |
- } |
- _Point pt; |
- xy_at_t(cubic1, lineTs.fT[0][0], pt.x, pt.y); |
- intersections.insert(lineTs.fT[0][0], lineTs.fT[1][0], pt); |
- return true; |
- } |
- } |
- double minT, maxT; |
- if (!bezier_clip(smaller, larger, minT, maxT)) { |
- if (minT == maxT) { |
- if (intersections.swapped()) { |
- minT1 = (minT1 + maxT1) / 2; |
- minT2 = interp(minT2, maxT2, minT); |
- } else { |
- minT1 = interp(minT1, maxT1, minT); |
- minT2 = (minT2 + maxT2) / 2; |
- } |
- _Point pt; |
- xy_at_t(cubic1, minT1, pt.x, pt.y); |
- intersections.insert(minT1, minT2, pt); |
- return true; |
- } |
- return false; |
- } |
- |
- int split; |
- if (intersections.swapped()) { |
- double newMinT1 = interp(minT1, maxT1, minT); |
- double newMaxT1 = interp(minT1, maxT1, maxT); |
- split = (newMaxT1 - newMinT1 > (maxT1 - minT1) * tClipLimit) << 1; |
-#define VERBOSE 0 |
-#if VERBOSE |
- printf("%s d=%d s=%d new1=(%g,%g) old1=(%g,%g) split=%d\n", |
- __FUNCTION__, depth, splits, newMinT1, newMaxT1, minT1, maxT1, |
- split); |
-#endif |
- minT1 = newMinT1; |
- maxT1 = newMaxT1; |
- } else { |
- double newMinT2 = interp(minT2, maxT2, minT); |
- double newMaxT2 = interp(minT2, maxT2, maxT); |
- split = newMaxT2 - newMinT2 > (maxT2 - minT2) * tClipLimit; |
-#if VERBOSE |
- printf("%s d=%d s=%d new2=(%g,%g) old2=(%g,%g) split=%d\n", |
- __FUNCTION__, depth, splits, newMinT2, newMaxT2, minT2, maxT2, |
- split); |
-#endif |
- minT2 = newMinT2; |
- maxT2 = newMaxT2; |
- } |
- return chop(minT1, maxT1, minT2, maxT2, split); |
-} |
- |
-bool chop(double minT1, double maxT1, double minT2, double maxT2, int split) { |
- ++depth; |
- intersections.swap(); |
- if (split) { |
- ++splits; |
- if (split & 2) { |
- double middle1 = (maxT1 + minT1) / 2; |
- intersect(minT1, middle1, minT2, maxT2); |
- intersect(middle1, maxT1, minT2, maxT2); |
- } else { |
- double middle2 = (maxT2 + minT2) / 2; |
- intersect(minT1, maxT1, minT2, middle2); |
- intersect(minT1, maxT1, middle2, maxT2); |
- } |
- --splits; |
- intersections.swap(); |
- --depth; |
- return intersections.intersected(); |
- } |
- bool result = intersect(minT1, maxT1, minT2, maxT2); |
- intersections.swap(); |
- --depth; |
- return result; |
-} |
- |
-private: |
- |
-const Cubic& cubic1; |
-const Cubic& cubic2; |
-Intersections& intersections; |
-int depth; |
-int splits; |
-}; |
- |
-bool intersect(const Cubic& c1, const Cubic& c2, Intersections& i) { |
- CubicIntersections c(c1, c2, i); |
- return c.intersect(); |
-} |