| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright 2012 Google Inc. | |
| 3 * | |
| 4 * Use of this source code is governed by a BSD-style license that can be | |
| 5 * found in the LICENSE file. | |
| 6 */ | |
| 7 #include "CurveIntersection.h" | |
| 8 #include "CurveUtilities.h" | |
| 9 #include "Extrema.h" | |
| 10 | |
| 11 static int isBoundedByEndPoints(double a, double b, double c, double d) | |
| 12 { | |
| 13 return between(a, b, d) && between(a, c, d); | |
| 14 } | |
| 15 | |
| 16 double leftMostT(const Cubic& cubic, double startT, double endT) { | |
| 17 double leftTs[2]; | |
| 18 _Point pt[2]; | |
| 19 int results = findExtrema(cubic[0].x, cubic[1].x, cubic[2].x, cubic[3].x, le
ftTs); | |
| 20 int best = -1; | |
| 21 for (int index = 0; index < results; ++index) { | |
| 22 if (startT > leftTs[index] || leftTs[index] > endT) { | |
| 23 continue; | |
| 24 } | |
| 25 if (best < 0) { | |
| 26 best = index; | |
| 27 continue; | |
| 28 } | |
| 29 xy_at_t(cubic, leftTs[0], pt[0].x, pt[0].y); | |
| 30 xy_at_t(cubic, leftTs[1], pt[1].x, pt[1].y); | |
| 31 if (pt[0].x > pt[1].x) { | |
| 32 best = 1; | |
| 33 } | |
| 34 } | |
| 35 if (best >= 0) { | |
| 36 return leftTs[best]; | |
| 37 } | |
| 38 xy_at_t(cubic, startT, pt[0].x, pt[0].y); | |
| 39 xy_at_t(cubic, endT, pt[1].x, pt[1].y); | |
| 40 return pt[0].x <= pt[1].x ? startT : endT; | |
| 41 } | |
| 42 | |
| 43 void _Rect::setBounds(const Cubic& cubic) { | |
| 44 set(cubic[0]); | |
| 45 add(cubic[3]); | |
| 46 double tValues[4]; | |
| 47 int roots = 0; | |
| 48 if (!isBoundedByEndPoints(cubic[0].x, cubic[1].x, cubic[2].x, cubic[3].x)) { | |
| 49 roots = findExtrema(cubic[0].x, cubic[1].x, cubic[2].x, cubic[3].x, tVal
ues); | |
| 50 } | |
| 51 if (!isBoundedByEndPoints(cubic[0].y, cubic[1].y, cubic[2].y, cubic[3].y)) { | |
| 52 roots += findExtrema(cubic[0].y, cubic[1].y, cubic[2].y, cubic[3].y, &tV
alues[roots]); | |
| 53 } | |
| 54 for (int x = 0; x < roots; ++x) { | |
| 55 _Point result; | |
| 56 xy_at_t(cubic, tValues[x], result.x, result.y); | |
| 57 add(result); | |
| 58 } | |
| 59 } | |
| 60 | |
| 61 void _Rect::setRawBounds(const Cubic& cubic) { | |
| 62 set(cubic[0]); | |
| 63 for (int x = 1; x < 4; ++x) { | |
| 64 add(cubic[x]); | |
| 65 } | |
| 66 } | |
| OLD | NEW |